【问题标题】:Java 8 hashmap implementation using TreeNode instead of linkedlistJava 8 hashmap 实现使用 TreeNode 而不是linkedlist
【发布时间】:2015-10-01 03:26:53
【问题描述】:

根据这篇文章:

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

java 8 哈希映射使用树节点而不是链表(如在 java 7 中)作为数组的元素。

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

但是,这不要求键是 Comparable 或键的某种顺序存在吗?

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

【问题讨论】:

  • “但是,这不要求键是 Comparable 或者键的某种顺序存在吗?”没有偏离路线没有
  • 树箱(即元素都是 TreeNodes 的箱)主要按 hashCode 排序,但在平局的情况下,如果两个元素属于相同的“C 类实现 Comparable",然后输入它们的 compareTo 方法进行排序。
  • Shahzeb,为什么不呢? @SotiriosDelimanolis,您是否将密钥称为 C 类?如果它没有实现 Comparable 怎么办?我知道树箱是按它们的哈希码排序的,我说的是 TreeNodes 中的搜索
  • 算法似乎使用System.identityHashCode 对树节点进行排序。如果您不提供自己的hashCode(),这是默认使用的哈希码,它基于引用(有点像“地址”)。重要的是使用一些一致的值,identityHashCode 就足够了。
  • 这不是真的。哈希表包含有限数量的桶。要确定将对象放入哪个存储桶,您通常会计算 hashCode() % bucketCount。如果两个对象进入同一个存储桶,这意味着 hashCode() % bucketCount 将是相同的 - 但它确实 not 意味着 hashCode() 是相同的。因此hashCode() 仍可用于比较。即使hashCode() 相同,System.identityHashCode 仍然很可能不同。

标签: java hashmap red-black-tree


【解决方案1】:

如果键是 Comparable,它是否只使用红黑树(排序 存在多少个键)?

不,当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() 方法将在达到阈值时将所有碰撞转换为树形图。

但是,这是否要求密钥是 Comparable 或某些 键的顺序是否存在?

您可以将任何键放入 hashmap。根据java docnull 是有效密钥,由于null 不是Comparable,因此密钥不必是Comparable。如果键不是Comparable,它将是put 作为LinkedList(如果数组已经转换为树,则通过内表)。

【讨论】:

    猜你喜欢
    • 2013-09-30
    • 2017-10-10
    • 2017-05-20
    • 2015-09-06
    • 1970-01-01
    • 2015-07-07
    • 2015-08-05
    • 2010-09-24
    相关资源
    最近更新 更多