HashMap 在 Java 中的工作原理

这是之前问题的延伸。 具体参考:

为什么 String、Integer 和其他包装类被认为是好的键?链接http://t.csdnimg.cn/VKXbA

HashMap 在 Java 中如何工作,链接http://t.csdnimg.cn/CBhBA 

1.我们可以使用任何自定义对象作为HashMap中的键吗?

        当然,您可以使用任何对象作为 Java HashMap中的键,前提是它遵循equals 和 hashCode 约定,并且一旦对象插入到Map中,它的 hashCode 不应改变。如果自定义对象是不可变的,那么这将已经被处理,因为一旦创建就无法更改它。

        在找到存储桶位置后,我们将调用keys.equals()方法来识别LinkedList中的正确节点,并在Java HashMap中返回该键的关联值对象。

        一些优秀的开发人员指出,使用不可变的最终对象以及适当的equals()和hashcode()实现将充当完美的 Java HashMap 键,并通过减少冲突来提高 Java HashMap 的性能。 

        不变性还允许缓存不同键的哈希码,这使得整个检索过程非常快,并且表明String和各种包装类(例如 Integer)在 Java HashMap 中是非常好的键。

2.HashMap重新散列

        如果地图的大小超过由负载因子定义的给定阈值,例如,如果负载因子为0.75,则一旦地图填满 75%,它将重新调整地图的大小。 

        与ArrayList等其他集合类类似,Java HashMap 通过创建一个大小为 HashMap 先前大小两倍的新存储桶数组来重新调整自身大小,然后开始将每个旧元素放入该新存储桶数组中。

        此过程称为重新散列,因为它还应用散列函数来查找新的存储桶位置。

3.如果两个 Key 具有相同的 hashcode,您将如何检索 Value 对象?

        它们将存储在同一个桶中,但没有链表的下一个节点。而keys equals()方法将用于识别HashMap中正确的键值对。

你可能感兴趣的:(java,开发语言)