方便记忆的“HashMap的数据结构”

一、数组+链表+红黑树

jkd1.8 数组+链表+红黑树

二、为了解决散列冲突和查找效率

HashMap是Java集合框架中的一种散列表(Hash Table)实现方式。它使用数组加链表(或红黑树)的数据结构来存储键值对。

HashMap之所以采用数组+链表+红黑树的设计,是为了解决两个问题:散列冲突和查找效率

散列冲突是指不同的键可能会映射到散列表中相同的位置,如果简单地使用数组来存储键值对,就会出现键冲突的情况。为了解决这个问题,HashMap采用了散列表的机制,在数组的每个位置上存储一个链表或者红黑树,将具有相同hash值的键值对存储在同一个链表或红黑树中。当发生散列冲突时,只需要在对应位置的链表或红黑树中进行查找即可。

查找效率是指在散列表中查找某个键值对的时候,需要尽量减少不必要的查找次数。由于散列表是按照hash值进行存储的,因此可以通过优化hash函数、增加桶的数量、使用链表或红黑树等方式来提高查找效率。在HashMap中,当链表长度超过8个节点时,链表会自动转换为红黑树,这样可以进一步提高查找效率。

综上所述,HashMap之所以采用数组+链表+红黑树的设计,是为了解决散列冲突和查找效率两个问题,使得HashMap在实际应用中具有较高的性能和可扩展性。

三、链表转红黑树:数组超过TREEIFY_THRESHOLD默认8 并且 链表大于等于MIN_TREEIFY_CAPACITY默认64。红黑树转链表:数组少于UNTREEIFY_THRESHOLD默认6。

在Java 8中,HashMap的实现使用了一个称为TREEIFY_THRESHOLD的参数,表示将链表转化为红黑树的阈值。当某个桶中的元素数量达到这个阈值时,就会将该桶中的链表转化为红黑树以提高查找、插入和删除等操作的性能。默认情况下,TREEIFY_THRESHOLD的值为8。

另外,Java 8引入了一个新的参数MIN_TREEIFY_CAPACITY,表示触发将链表转化为红黑树所需要容量的最小值。当HashMap的容量(也就是数组大小)小于这个值时,不会触发将链表转化为红黑树的操作。默认情况下,MIN_TREEIFY_CAPACITY的值为64。

因此,当某个桶中元素数量超过TREEIFY_THRESHOLD(默认为8),同时HashMap的容量(数组大小)大于等于MIN_TREEIFY_CAPACITY(默认为64)时,就会将链表转化为红黑树,以提高查找、插入和删除等操作的性能。

总之,在Java 8中,当HashMap中某个桶中元素数量超过TREEIFY_THRESHOLD,同时数组大小大于等于MIN_TREEIFY_CAPACITY时,会将链表转换为红黑树。

在Java 8中,HashMap的实现采用了一个称为UNTREEIFY_THRESHOLD的机制,表示将红黑树转化为链表的阈值。当某个桶中的元素数量少于这个阈值时,就会将该桶中的红黑树转化为链表以降低内存消耗。默认情况下,UNTREEIFY_THRESHOLD的值为6。

具体地,当从某个桶中移除元素后,如果该桶中元素数量少于UNTREEIFY_THRESHOLD(默认为6),同时该桶中原本是红黑树结构,那么就会将该桶中的所有元素重新构建为链表结构,以减少内存占用。

需要注意的是,此操作只在删除操作中使用,即只有在执行remove操作,且当前桶中采用红黑树存储时,才会将其转换为链表,否则不会进行转换。

总之,当HashMap中某个桶中元素数量少于UNTREEIFY_THRESHOLD(默认为6),同时该桶之前使用红黑树存储时,如果执行了删除操作,就会将该桶中的所有元素转换为链表结构,以减少内存消耗。

四、红黑树是一种自平衡二叉搜索树(BST)。。。

HashMap使用红黑树的原因是因为红黑树可以提供较好的性能和平衡。红黑树是一种自平衡二叉搜索树(BST),具有以下特点:

  1. 每个节点为黑色或红色,并且根节点为黑色。
  2. 如果一个节点是红色,则其子节点必须为黑色。
  3. 每个叶子节点(NIL节点)都是黑色的空节点。
  4. 任意节点到其每个叶子节点的路径都包含相同数量的黑色节点。
  5. 红黑树是一棵近似平衡的二叉搜索树,可以保证在最坏情况下,基本动态操作的时间复杂度为O(log n)。

相比较于普通的二叉搜索树和平衡树,红黑树能够在插入和删除元素时保持树的平衡,从而避免退化成链表,保证基本动态操作的时间复杂度始终为O(log n)。此外,相比较于其他数据结构如AVL树等,红黑树的维护代价更低,因为红黑树的旋转只有两种类型,而AVL树的旋转则有四种类型,因此,实现起来也更加简单。

在HashMap的实现中,由于数组大小固定且可能较小,因此对于每个桶内的元素,使用红黑树能够提升查找和插入的效率,同时保证极端情况下的时间复杂度仍然为O(log n),是一种很好的平衡方案。

猜你喜欢

转载自blog.csdn.net/samsung_samsung/article/details/130870985