为什么String,Integer和其他包装类被认为是好的键?
我找到了以下答案 -
String,Integer和其他包装类是HashMap键的自然候选者,String也是最常用的键,因为String是不可变的和final,并且会覆盖equals和hashcode()方法。
其他包装类也共享类似的属性。需要不可变性,以防止用于计算hashCode()的字段发生变化,因为如果密钥对象在插入和检索期间返回不同的hashCode,则无法从HashMap获取对象。不可变性是最好的,因为它提供了其他优点以及线程安全性。如果你可以通过仅使某些字段最终来保持你的hashCode相同,那么你也可以使用它。由于在从HashMap检索值对象期间使用了equals()和hashCode()方法,因此密钥对象正确覆盖这些方法并遵循联系非常重要。如果不相等的对象返回不同的哈希码而不是碰撞的机会将会更少,这随后会提高HashMap的性能。
答案 0 :(得分:1)
在大多数Map
实现中,条目是根据密钥的状态存储的。如果密钥更改,则无法检索给定密钥的条目。
HashMap
处理密钥的hashCode()
值。如果该键的hashCode()
值是从不可变状态生成的,则它将是常量。由于这些类型是不可变的,它们的(外部)属性是不可变的,并且它们hashCode()
是从这些属性生成的,任何这些类型的密钥都不能改变,这个问题就成了一个问题。
答案 1 :(得分:0)
我看到以下原因:
字符串工作,因为它们是值对象,其中包含两个具有相同值的字符串将被视为相等。
字符串是不可变的(作为所有好的值对象)。
字符串具有高效且合理的好hashCode实现。这意味着在HashMaps中使用它们是有效的。
“包装类”
也是如此