几乎是IdentityHashCode in HashMap's bucket的一个扩展:
据我所知,Java8 HashMap实现中的树形存储箱被吹捧为将最坏情况下的查找复杂度降低到O(lg(n))而不是O(n),例如对于大存储箱。但对于不可比较的类,它们使用identityHashCode
进行排序插入。因此,当find
ing时,我们需要在两个子树中查找。
现在,查看这两个子树会立即转换最坏情况的复杂度: O(n)而不是O(lg(n))。因此,所有转换为树的辛勤工作,以及在UNTREEIFY_THRESHOLD
上重新解树的努力都白费了,我们没有得到任何优势?
我错过了什么?
发布于 2020-04-16 09:10:51
对于不可比较的,存储箱后面的树利用更快的查找速度来查找映射到同一存储箱的具有不同hashCode()
值的对象。
对于具有相同hashCode()
值的对象,由于没有区分特征,因此无法执行任何操作。系统必须对具有相同hashCode()
值的所有键进行全面搜索。
正如链接的问题所说,identityHashCodes仅在插入过程中用作平局断路器。它不能在查找期间使用,因为查找具有相同内容的不同对象(即不同的identityHashCodes)时,必须找到hashCode()
和equals()
定义的匹配项。
https://stackoverflow.com/questions/61246305
复制