简单的答案是HashSet在第一次遇到它时创建一个并将每个节点添加到集合中.
唯一不起作用的情况是,如果您已经重载hashCode()并且equals(Object)节点类基于节点内容(或其他)实现相等性.然后你需要:
IdentityHashMap它采用类==和System.identityHashcode而不是equals(Object)和hashCode(),或难道java对象只是引用内存中的位置吗?
是的,不是.是的,引用由内存地址表示(在大多数JVM上).问题是1)你无法获得地址,2)它可以在GC重新定位对象时改变.这意味着您不能将对象地址用作哈希码.
该identityHashCode方法通过返回最初基于内存地址的值来处理此问题.如果您再次调用identityHashCode同一个对象,则可以保证获得与以前相同的值...即使该对象已重新定位.
我想知道如果碰撞有多少问题......
identityHashCode方法生成的哈希值可能会发生冲突.(也就是说,两个不同的对象可以具有相同的标识哈希码值.)任何使用这些值的东西都必须处理这个问题.(标准HashSet和IdentityHashMap类会处理这些冲突......如果您选择使用它们.)
| 归档时间: |
|
| 查看次数: |
2860 次 |
| 最近记录: |