除了像 String
这样的不变对象以外,诸如 Integer
和其他包装类等是否适合用于哈希表键?
有人能解释一下吗?
除了像 String
这样的不变对象以外,诸如 Integer
和其他包装类等是否适合用于哈希表键?
有人能解释一下吗?
字符串、整数和其他包装器类是HashMap键的自然候选者,其中String是最常用的键,因为String是不可变的、final的,并且覆盖了equals和hashCode()方法。其他包装类也具有类似的属性。不可变性是必需的,以防止用于计算hashCode()的字段发生更改,因为如果键对象在插入和检索期间返回不同的hashCode,则将无法从HashMap获取对象。不可变性最好,因为它还提供其他优点,如线程安全性。如果您只通过使某些字段final来保持hashCode相同,则也可以这样做。由于equals()和hashCode()方法在从HashMap检索值对象时使用,因此重要的是键对象正确地覆盖这些方法并遵循联系。如果不相等的对象返回不同的hashcode,则碰撞的机会将较小,从而提高HashMap的性能。
这里还有一个关于讨论的堆栈:为什么HashMap中的不可变对象如此有效
HashMap的put和get方法都使用了hashcode和equals方法。您需要确保在放置键对象后,始终可以从映射中获取值对象,无论您是否更改了键对象。但是不可变对象就足够好了。
是的,因为它是不可改变的。
假设我有一个类
MyKey key = new MyKey("shreyansh"); //assume hashCode=1234
myHashMap.put(key, "value");
// Below code will change the key hashCode() and equals()
// but it's location is not changed.
key.setName("jogi"); //assume new hashCode=7890
//below will return null, because HashMap will try to look for key
//in the same index as it was stored but since key is mutated,
//there will be no match and it will return null.
myHashMap.get(new MyKey("shreyansh"));
当使用关键字“Shreyansh”访问时,它将返回null。