我有一个自定义对象:
班级(ID,代码,标题,编号ECTS课程,校长教授,出席学生集(
我创建了一个名为 class1 的自定义对象的实例,并使用预先创建的 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
我希望通过清除用于馈送对象构造函数的集合来保持创建对象内部的集合不变。
问题是它们不是两个不同的HashSets——它们是同一个HashSet。 类类型的每个字段或变量实际上并不是该类型的对象 - 它实际上只是对该类型的对象的引用,当您分配它(或将其传递给某个方法(时,您实际上只是传递对同一底层对象的引用,而不是复制对象。
如果需要不同的对象,则需要在代码中显式new
或clone()
。 在您的情况下,您可以这样做
Class class1 = new Class(id, code, title, numberOfECTSPoints, headProfessor, setStudents->clone());
或者,您可以将clone()
调用放入Class
构造函数中。