👌为什么String, Interger这样的wrapper类适合作为键?
题目详细答案
不可变性
String和Integer等包装类都是不可变的对象。一旦创建,这些对象的状态就不能被改变。不可变性是一个重要的特性,因为它保证了对象在其生命周期内的哈希码(hash code)不会改变。
如果一个对象在作为键的过程中其哈希码发生了改变,那么在哈希表中查找该键时将无法找到正确的位置,导致数据结构无法正常工作。不可变对象避免了这一问题。
合理的hashCode()实现
String和Integer类都提供了高质量的hashCode()方法,这些方法能够有效地分布哈希值,减少哈希冲突。具体来说:
String的hashCode()方法是基于字符串内容计算的,使用了一个高效的算法。
Integer的hashCode()方法直接返回其内部存储的整数值。
合理的equals()实现
String和Integer类都提供了正确且高效的equals()方法,这些方法能够准确地比较两个对象的内容是否相等。这对于哈希表等数据结构来说是至关重要的,因为在哈希表中查找键时需要依赖equals()方法来判断两个键是否相等。
内存效率
虽然包装类相对于原始类型有一些额外的内存开销,但这些类通常经过了优化,能够在大多数情况下提供足够的性能和内存效率。例如,Integer类使用了对象池来缓存常用的整数值(-128 到 127),从而减少了内存消耗和对象创建的开销。