几乎是HashMap中IdentityHashCode的扩展';s bucket:
据我所知,Java 8 HashMap实现中的树仓被吹捧为可以将查找的最坏情况复杂性降低到O(lg(n((而不是O(n(,例如对于大仓。但对于不可比较的类,它们使用identityHashCode
进行排序插入。因此,当find
ing时,我们需要在两个子树中查找。
现在查看这两个子树可以立即转换最坏情况下的复杂性:O(n(而不是O(lg(n((。那么,在UNTREEIFY_THRESHOLD
上转换为树和返回树的所有努力都是浪费的,我们没有任何优势?
我错过了什么?
对于不可比较的对象,bin后面的树可以更快地查找映射到同一bin的具有不同hashCode()
值的对象。
对于与hashCode()
值相同的对象,由于没有区别特征,因此无法执行任何操作。系统必须对具有相同hashCode()
值的所有关键字进行全面搜索。
正如相关问题所说,identityHashCodes仅在插入过程中用作平局决胜符。它不能在查找过程中使用,因为查找具有相同内容的不同对象(即不同的identityHashCodes(时,必须查找hashCode()
和equals()
定义的匹配项。