【发布时间】:2016-03-01 11:03:16
【问题描述】:
我所做的很简单:我想创建一个HashMap<Pair, ArrayList<Integer>>,其中Pair 作为键,ArrayList<Integer> 作为值。 Pair 是自定义类,包含元素l(左)和r(右)。
一开始,我是这样做的:
Map<Pair, ArrayList<Integer>> hashmap = new HashMap<>();
ArrayList<String> stringList = new ArrayList<>();
stringList.add("a");
stringList.add("b");
stringList.add("c");
stringList.add("a");
Pair<String, Integer> aPair = new Pair<>(" ", 1); // HERE will be changed!
for (String aString: stringList) {
aPair.setLeft(aString);
if (!hashmap.containsKey(aPair)){
hashmap.put(aPair, new ArrayList<Integer>());
}
hashmap.get(aPair).add(1);
}
for (Map.Entry<Pair, ArrayList<Integer>> entry: hashmap.entrySet()) {
out.println(entry.getKey().getLeft() + " " + entry.getKey().getRight() + " " + entry.getValue());
}
但是输出是:
a 1 [1]
a 1 [1]
a 1 [1, 1]
但是,如果我把上面的代码改成下面这样:
Map<Pair, ArrayList<Integer>> hashmap = new HashMap<>();
ArrayList<String> stringList = new ArrayList<>();
stringList.add("a");
stringList.add("b");
stringList.add("c");
stringList.add("a");
for (String aString: stringList) {
Pair<String, Integer> aPair = new Pair<>(aString, 1); // HERE changed!
if (!hashmap.containsKey(aPair)){
hashmap.put(aPair, new ArrayList<Integer>());
}
hashmap.get(aPair).add(1);
}
for (Map.Entry<Pair, ArrayList<Integer>> entry: hashmap.entrySet()) {
out.println(entry.getKey().getLeft() + " " + entry.getKey().getRight() + " " + entry.getValue());
}
所做的更改是将 Pair<String, Integer> aPair 的声明放入 for 循环中。新的结果是我想要的如下:
c 1 [1]
b 1 [1]
a 1 [1, 1]
为什么会这样? Here 是一个类似的问题。但它仍然不同。
编辑:正如@Eran 在下面的cmets 中提到的,自定义的Pair 覆盖了hashCode() 和equals() 方法
@Override
public int hashCode() { return left.hashCode() ^ right.hashCode(); }
@Override
public boolean equals(Object o) {
if (!(o instanceof Pair)) return false;
Pair<?, ?> pairo = (Pair<?, ?>) o;
return this.left.equals(pairo.getLeft()) &&
this.right.equals(pairo.getRight());
}
【问题讨论】:
-
是的。它们被覆盖。 @Eran
标签: java arraylist hashmap immutability mutable