我理解使用不可变对象作为映射键是更可取的。但是使用默认hashCode
()方法的可变对象如何(当然,我不会覆盖equals
()方法)。这也应该没问题,因为默认hashCode
()使用对象内存地址?
我有什么想念的吗?
答案 0 :(得分:4)
只要hashCode
和equals
方法始终返回相同的结果,就可以安全地将对象用作HashMap
中的键。
然而,您可能会通过这样做来降低其实用性! equals / hashCode的重点是识别对象值之间的相等性,如果修改对象的成员,它是否真的等于修改前的状态?
答案 1 :(得分:0)
下面是带字符串的哈希码。但是,需要担心的一个问题是字符串哈希码Java的早期/晚期版本之间的实现可能会发生变化。
public int hashCode()
{
return "name".hashCode();
}
此外,还有一篇文章hash collision probabilities
答案 2 :(得分:0)
使用默认的equals()和hashcode()作为键的可变对象是没有用的。
例如
map.put(new Object(),“ value”);
当您想要获得该值时,
map.get(new Object()); //这将始终返回null
因为有了new Object()-新的哈希码将被生成,并且不会指向保存值的预期存储桶号,并且如果最终存储桶号变为相同,它将无法匹配哈希码甚至等于,所以它总是返回NULL