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

时间:2015-07-12 23:41:29

标签: java hashmap red-black-tree

根据这篇文章:

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

  

如果键是可比较的(订购时)它是否只使用红黑树   存在的密钥)?

不,当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中。根据{{​​3}},null是有效密钥,由于null不是Comparable,因此密钥不必是Comparable。如果某个键不是Comparable,那么put将为LinkedList(如果数组已经转换为树,则通过内部表)。