JAVA面试宝典:HashMap原理(整理的通俗易懂容易记忆)

HashMap是一种散列表(也称散列映射)的实现,它是一种将键映射到值的对象。HashMap的实现通过将键的散列值与数组下标相关联来实现快速查找。当多个键散列值相同时,它们被存储在链表中,每个链表都从数组中的索引开始,并将所有链表连接在一起。

HashMap的实现包括计算散列值、解决散列冲突以及重新散列(扩展散列表的大小)。计算散列值通过对键调用hashCode()方法并将其与散列表大小进行模运算来实现。散列冲突可以通过链表解决,也可以通过红黑树解决,但链表在效率方面更高。重新散列时,散列表的大小会增加,从而减少散列冲突的数量。


HashMapJava 之间和在 Java中有几个区别Hashtable:

1.Hashtable是同步的,而HashMap不是。这HashMap对非线程应用程序更好,因为非同步对象通常比同步对象执行得更好。

2.Hashtable不允许null键或值。 HashMap允许一个null键和任意数量的null值。

3.HashMap 的一个子类是LinkedHashMap,所以如果您想要可预测的迭代顺序(默认情况下是插入顺序),您可以轻松地换出HashMapfor a LinkedHashMap。如果您使用Hashtable.


Hashtable key和 val 为null ,会报错
key>>>>key.hashCode();
val >>>空指针


HashMap
如果你想让 HashMap 线程安全,使用Collections.synchronizedMap()

解决线程安全,可以这样做:
如:Map map = Collections.synchronizedMap(new HashMap<>());
或者 Map map0 = new ConcurrentHashMap();
Collections.synchronizedMap() 或使用比哈希表更高效的 ConcurrentHashMap


原理:
HashMap是一种常用的哈希表数据结构,它使用键-值对存储数据,根据键来快速查找对应的值。它的实现原理如下:

哈希表中的每个元素实际上是一个链表,这个链表称为桶(Bucket)。
桶的个数是固定的,通常为2的幂,比如16,32等等。
当需要往哈希表中插入一个键-值对时,先根据键的哈希值计算出该键值对应的桶的索引位置。
如果该位置为空,则直接插入键值对;如果该位置已经有其他键值对,则将其插入到链表的末尾。
当需要根据键查找对应的值时,同样先根据键的哈希值计算出对应的桶的索引位置,然后在对应的链表中查找该键值对。
由于哈希表中每个元素都是一个链表,因此在发生哈希碰撞的时候,它能够通过链表解决冲突,从而保证了查找、插入和删除的时间复杂度都是O(1)级别的。

扫描二维码关注公众号,回复: 14964730 查看本文章

在Java中,HashMap的实现有很多细节,比如扩容、负载因子等等。如果你想深入了解HashMap的原理,可以参考Java官方文档中关于HashMap的详细介绍:
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/HashMap.html


HashMap1.7和1.8版本有什么不同,原理分别是?
HashMap是Java中常用的数据结构之一,它是一种哈希表实现,可以提供常数时间复杂度的插入、删除和查找操作。HashMap在1.7和1.8版本中有一些不同点,主要包括以下几个方面:

数据结构:HashMap 1.7和1.8的底层数据结构不同。HashMap 1.7使用的是数组+链表的数据结构,而HashMap 1.8则使用了数组+链表+红黑树的结构。在1.8版本中,当链表的长度达到阈值(默认为8)时,会将链表转化为红黑树,以提高查询效率。

并发性:HashMap 1.7和1.8在并发性方面也有所不同。HashMap 1.7在并发操作时需要使用同步机制(如synchronized)保证线程安全,这会导致并发性能较差。而HashMap 1.8则使用了CAS算法和synchronized来保证线程安全,在一定程度上提高了并发性能。

速度:由于HashMap 1.8使用了红黑树,因此在一些情况下可以提高查询速度。在数据量比较大、链表长度较长时,查询操作的时间复杂度从O(N)降低到了O(logN),因此在一定程度上提高了HashMap的性能。

扩容机制:HashMap 1.7和1.8在扩容机制方面也有所不同。HashMap 1.7的扩容机制是当链表长度达到8时扩容,而HashMap 1.8的扩容机制是当链表长度达到8并且数组长度达到阈值(默认为64)时扩容。在扩容时,HashMap 1.7是将原数组中的元素重新计算哈希值插入到新数组中,而HashMap 1.8则是将原数组中的元素拆分为两部分,一部分是哈希值高位为0的元素,另一部分是哈希值高位为1的元素,分别放到新数组的不同位置中。

综上所述,HashMap 1.7和1.8的主要不同在于底层数据结构、并发性、速度和扩容机制等方面。在实际应用中,可以根据自己的需要选择合适的版本。

猜你喜欢

转载自blog.csdn.net/bug_love/article/details/130294213