使用TreeNode而不是linkedlist实现Java 8 hashmap

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用TreeNode而不是linkedlist实现Java 8 hashmap相关的知识,希望对你有一定的参考价值。

根据这篇文章:

http://coding-geek.com/how-does-a-hashmap-work-in-java/

java 8 hashmaps使用treenode而不是链表(如在java 7中)作为数组的元素。

如果元素的数量很小,TreeNodes具有充当链表的特殊属性,如果存在大量元素,则表现为红黑树。 (因为涉及红黑树的操作是log(n))。

但是,这不是要求密钥是可比较的还是密钥的某些排序存在?

这是在java 8 hashmap中强制执行的吗?如果键是可比较的(键的排序存在),它是否只使用红黑树?

答案

如果键是可比较的(键的排序存在),它是否只使用红黑树?

不,当HashMap很小时,所有碰撞都被解析为LinkedList。看看来源:

/**
* Replaces all linked nodes in bin at index for given hash unless
* table is too small, in which case resizes instead.
*/

if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st, TREEIFY_THRESHOLD = 8
    treeifyBin(tab, hash);
    break;

当达到阈值时,treeifyBin()方法将所有碰撞转换为树形图。

但是,这不是要求密钥是可比较的还是密钥的某些排序存在?

您可以将任何键放到hashmap中。根据java docnull是一个有效的密钥,因为null不是Comparable,键不一定是Comparable。如果一个键不是Comparable它将put作为LinkedList(通过内部表,如果数组已经转换为树)。

以上是关于使用TreeNode而不是linkedlist实现Java 8 hashmap的主要内容,如果未能解决你的问题,请参考以下文章

何时在 Java 中使用 LinkedList 而不是 ArrayList?

111. Minimum Depth of Binary Tree

JDK源码LinkedList

Java重要类之LinkedList

为啥LinkedList中的类节点定义为静态而不是普通类[重复]

JDK源码学习之Arraylist与LinkedList