【发布时间】: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