我试图在java中运行这段代码:
List<Map<String , String>> studentList = new ArrayList<>();
Map<String , String> studentRecord = new HashMap();
//Record for first Student
studentRecord.put("Name","aaa");
studentRecord.put("Age","22");
studentRecord.put("Sex","m");
studentList.add(studentRecord);
//Record for second Student
studentRecord.put("Name","bbb");
studentRecord.put("Age","44");
studentRecord.put("Sex","f");
studentList.add(studentRecord);
Run Code Online (Sandbox Code Playgroud)
输出是:
[{Sex=f,Age=44,Name=bbb},{Sex=f,Age=44,Name=bbb}]
Run Code Online (Sandbox Code Playgroud)
代替
 [{Sex=m,Age=22,Name=aaa},{Sex=f,Age=44,Name=bbb}]
Run Code Online (Sandbox Code Playgroud)
谢谢
您有一个地图实例:
Map<String , String> studentRecord = new HashMap();
Run Code Online (Sandbox Code Playgroud)
您将其添加到列表中两次。
当您调用studentRecord.put第二个学生时,您是在唯一的地图实例上调用它,从而覆盖第一个学生的键。
最好的解决方案是:不要使用映射来表示数据对象。使用一个类。这就是它们的设计目的。
enum Sex
{
    MALE, FEMALE
}
class Student
{
    private final String name;
    private final int age;
    private final Sex sex;
    Student(String name, int age, Sex sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    // getters...
}
List<Student> students = new ArrayList<>();
students.add(new Student("aaa", 222, Sex.MALE));
students.add(new Student("bbb", 44, Sex.FEMALE));
Run Code Online (Sandbox Code Playgroud)
如果你只是想要快速而肮脏的解决方案,你可以使用这个:
//Record for second Student
studentRecord = new HashMap<>(); // I added this line
studentRecord.put("Name","bbb");
studentRecord.put("Age","44");
studentRecord.put("Sex","f");
studentList.add(studentRecord);
Run Code Online (Sandbox Code Playgroud)
这会为第二个学生创建第二个HashMap,从而确保第一个地图中的键不会被覆盖。
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           23268 次  |  
        
|   最近记录:  |