我有一个Map对象,其中我使用整数作为键,并列出相应的值。这是我的代码。
Map<Integer, List<Double>> dataDouble = new HashMap<Integer, List<Double>>();
List<Double> dubList = new ArrayList<Double>();
for(double i = 0; i < 10; i++)
dubList.add(i);
dataDouble.put(1, dubList);
//dubList.clear();
for(int i = 10; i < 16; i++)
dubList.add(i);
dataDouble.put(2, dubList);
Set<Integer> keyset = dataDouble.keySet();
for(Integer key : keyset) {
System.out.println("\t\tKEY: " + key);
List<Double> finList = dataDouble.get(key);
for(double value : finList)
System.out.println("VALUE: " + value);
}
}
如果我不包含clear语句,则第二个列表不会更新,并且我在print语句中得到2个1到10的块。如果我添加clear命令,则在两个块中仅打印10-15。
我的问题是,为什么clear命令清除数据已添加到Map中,为什么在列表中添加新数据并将其放在Map上实际上不会更改值?
编辑:我知道我使用的是double而不是int,在我的实际项目中我处理的是双值
答案 0 :(得分:2)
您正在为地图中添加的所有条目使用相同的对象。
添加后,更改引用所指向的List
。
dataDouble.put(1, dubList);
dubList = new ArrayList<>(); <--- HERE
for(int i = 10; i < 16; i++)
dubList.add(i);
答案 1 :(得分:2)
您没有在ArrayList
的不同键下添加不同的HashMap
。您将 相同的 ArrayList
放在每个下面。这意味着对它进行的任何更改都将反映在所有这些中(因为它们都是相同的对象)。
如果您想拥有多个不同的List
,则需要使用new ArrayList<>()
创建一个新的clear
。所以用[{1}}替换dubList = new ArrayList<>()
它所在的行,它会正确地为您提供一个新实例。
答案 2 :(得分:1)
您正在使用对同名ArrayList
命名dubList的引用,并将该引用添加到您的地图两次。您需要有两个单独的ArrayList
声明。
Map<Integer, List<Double>> dataDouble = new HashMap<Integer, List<Double>>();
List<Double> dubList = new ArrayList<Double>();
for(double i = 0; i < 10; i++)
dubList.add(i);
dataDouble.put(1, dubList);
//add a new ArrayList
List<Double> dubList2 = new ArrayList<Double>();
for(int i = 10; i < 16; i++)
dubList2.add(i);
dataDouble.put(2, dubList2);
Set<Integer> keyset = dataDouble.keySet();
for(Integer key : keyset) {
System.out.println("\t\tKEY: " + key);
List<Double> finList = dataDouble.get(key);
for(double value : finList)
System.out.println("VALUE: " + value);
}
}