我有一个HashMap以下HashMap
private Map<Integer, List<CustomClass>> map = new HashMap<>();
我正在尝试在HashMap中添加一个针对Integer键的新条目,如果该键存在,那么我想获取相应的列表并在其中添加新项。代码如下。
if (this.map.containsKey(//Integer Key)) {
this.map.get(//Integer Key).add(//New List Item);
} else {
List<CustomClass> customClass = new ArrayList<>();
customClass.add(new CustomClass());
this.map.put(//Integer Key, customClass);
}
真正的问题在于密钥已经存在的部分,我尝试使用HashMap获取函数
this.map.get(//Integer Key).add(//New List Item);
如果找不到Integer键的值,它不会给null,但它经常给出错误的ArrayList。现在我知道HashMap使用equals和hashCode,所以我试图覆盖这些函数并使用它们而不是Integery Key。
public class CustomHashMapIntegerKey {
private Integer key = 0;
public void setKey(Integer key) {
this.key = key;
}
public Integer getKey() {
return this.key;
}
@Override
public int hashCode() {
return this.key.hashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (null == obj) return false;
if (this.getClass() != obj.getClass()) return false;
final CustomHashMapIntegerKey customHashMapIntegerKey = (CustomHashMapIntegerKey) obj;
if (null == this.key && null != customHashMapIntegerKey.getKey()) return false;
if (null != this.key) {
if (!this.key.equals(customHashMapIntegerKey.getKey())) return false;
}
return true;
}
}
并改变了我的地图以使用这个新的类而不是Integer,但我仍然坚持HashMap提供错误值的同一个问题。这个链接https://gist.github.com/MAnfal/dc581234ce597a8ff062
提供了一些详细的剪辑答案 0 :(得分:2)
HashMap
部分依赖于equals
和hashCode
来完成其工作,但它有点复杂。请查看this article以获得深入解释。
对于您的purose(以列表作为其值的地图),我建议您使用Google的Guava库中的Multimap
:
ListMultimap<Integer, String> multimap = ArrayListMultimap.create();
multimap.put(4, "Is the first digit of '4'");
multimap.put(4, "Is the first digit of '42'");
multimap.put(4, "Is the first digit of '4711'");
multimap.put(1, "Is the first digit of '13'");
Collection<String> values = multimap.get(4);
Collection
values
将包含您在密钥4
下添加的三个元素。
答案 1 :(得分:0)
我怀疑地图中存储的值。使用您提供的详细信息,您的问题可能只发生在一种情况下,您必须在不同的列表中添加相同的对象并使用HashMap中的不同键存储。记录您的地图内容,并打印可能对您有帮助的对象哈希码