Java Mutable Object作为Map Key但使用默认的hashCode()

时间:2014-03-18 15:18:14

标签: java hashmap

我理解使用不可变对象作为映射键是更可取的。但是使用默认hashCode()方法的可变对象如何(当然,我不会覆盖equals()方法)。这也应该没问题,因为默认hashCode()使用对象内存地址?

我有什么想念的吗?

3 个答案:

答案 0 :(得分:4)

只要hashCodeequals方法始终返回相同的结果,就可以安全地将对象用作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