Два разных объекта HashSet, на которые влияет одна команда (JAVA)

#hashset

#hashset

Вопрос:

У меня есть пользовательский объект:

Класс (идентификатор, код, заголовок, количество точек доступа, headProfessor, набор посещающих студентов)

Я создаю экземпляр этого пользовательского объекта с именем class1 и использую предварительно созданный HashSet для загрузки его конструктора. После того, как я сделаю это и очищу HashSet, который использовался для создания объекта, HashSet внутри объекта также очищается.

 Set<Student> setStudents= new HashSet<Student>(); // this was fed with some Student objects

Class class1 = new Class(id, code, title, numberOfECTSPoints, headProfessor, attendingStudentsSet);

System.out.println(setStudents.size()); // 5
System.out.println(class1.getAttendingStudentsSet().size()); // 5
setStudents.clear();
System.out.println(setStudents.size()); // 0
System.out.println(class1.getAttendingStudentsSet().size()); // 0
  

Я ожидал, что набор внутри созданного объекта останется нетронутым, очистив набор, который использовался для загрузки конструктора объекта.

Ответ №1:

Проблема в том, что это НЕ два разных хэш-набора — это один и тот же хэш-набор. Каждое поле или переменная типа class на самом деле не является объектом этого типа — на самом деле это просто ссылка на объект этого типа, и когда вы назначаете его (или передаете его какому-либо методу), вы на самом деле просто передаете ссылку на тот же базовый объект, а не копируете объект.

Если вам нужны разные объекты, вам нужно явное new или clone() в вашем коде. В вашем случае вы могли бы сделать

 Class class1 = new Class(id, code, title, numberOfECTSPoints, headProfessor, setStudents->clone());
  

или вы могли бы поместить clone() вызов в Class конструктор.

Комментарии:

1. У меня мурашки по коже от вашего ответа. Что за черт!! Я понятия не имел, что это так работает. Мне нужно протестировать это, чтобы быть уверенным, но, поскольку я полагаю, что понял это, я немедленно поблагодарю вас; Спасибо! Это интересный af, несколько ошеломляющий меня.