Java问题重用列表来填充HashMap

时间:2017-12-11 13:53:19

标签: java arraylist collections hashmap nested

我正在尝试在java中设置HashMap值,同时尝试重用arrayList。我之前没有和HashMaps合作过,我仍然对此深有感触,所以请耐心等待我的知识。

班级学生:

public class Student {

    private static int id = 0;
    private String name;
    private String surname;
    private Map<Subject, List<Grade>> grades;
    private List<Absence> absences;
}

成绩制定者:

public void setGrades(Map<Subject, List<Nota>> grades) {
    this.grades = grades;
}

班主题:

public class Subject {

    private String name;
}

班级成绩:

public class Grade {

    private Term term;
    private String letter;
}

主程序:

Subject subject = new Subject("History");
Map<Subject, List<Grade>> gradeMap = new HashMap<Subject, List<Grade>>();  
        List <Grade> grades = new ArrayList<Grade>();

grades.add(new Grade(Term.FIRST_TERM, 'A'));
grades.add(new Grade(Term.SECOND_TERM, 'F'));
grades.add(new Grade(Term.THIRD_TERM, 'B'));
gradeMap.put(subject, grades);

student1.setGrades(gradeMap);

测试打印键和值:

for(Map.Entry<Subject, List<Grade>> t :student1.getGrades().entrySet()){
             Subject key = t.getKey();
             for (Grade grade : t.getValue()) {
                 System.out.println(key.getName() + " - " + grade.getNumber());
            }        
        }

但是每当我尝试重新使用ArrayList时,由于有很多学生的成绩需要设置,我丢失了我的student1实例中的所有数据

grades.clear();

如果我现在尝试打印到控制台,则输出为空:

for(Map.Entry<Subject, List<Grade>> t :student1.getGrades().entrySet()){
             Subject key = t.getKey();
             for (Grade grade : t.getValue()) {
                 System.out.println(key.getName() + " - " + grade.getNumber());
            }        
        }

我真的很感激对此有任何意见和建议,显然我一定做错了但我不知道:D

提前致谢!

1 个答案:

答案 0 :(得分:4)

您在地图中添加的内容是对您仍然拥有的相同列表的引用。它没有创建它的副本(因为Java没有做这样的事情),你持有的仍然是地图中的相同列表。如果您想要一个新的,您需要手动创建它:

grades = new ArrayList<>();

并且只有对Student1记录的唯一引用确实会出现在该地图中。

有关详细信息,请参阅Is Java "pass-by-reference" or "pass-by-value"?