树箱:使用identityHashCode来订购不可比较的东西会让工作变得毫无用处吗



几乎是HashMap中IdentityHashCode的扩展';s bucket:

据我所知,Java 8 HashMap实现中的树仓被吹捧为可以将查找的最坏情况复杂性降低到O(lg(n((而不是O(n(,例如对于大仓。但对于不可比较的类,它们使用identityHashCode进行排序插入。因此,当finding时,我们需要在两个子树中查找。

现在查看这两个子树可以立即转换最坏情况下的复杂性:O(n(而不是O(lg(n((。那么,在UNTREEIFY_THRESHOLD上转换为树和返回树的所有努力都是浪费的,我们没有任何优势?

我错过了什么?

对于不可比较的对象,bin后面的树可以更快地查找映射到同一bin的具有不同hashCode()值的对象。

对于hashCode()值相同的对象,由于没有区别特征,因此无法执行任何操作。系统必须对具有相同hashCode()值的所有关键字进行全面搜索。

正如相关问题所说,identityHashCodes仅在插入过程中用作平局决胜符。它不能在查找过程中使用,因为查找具有相同内容的不同对象(即不同的identityHashCodes(时,必须查找hashCode()equals()定义的匹配项。

最新更新