#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, несколько ошеломляющий меня.