java哈希对象

lol*_*ter 0 java hash reference cycle

我希望能够确定我之前是否遇到过一个对象 - 我有一个图形实现,我想看看我是否创建了一个循环,可能是通过使用tortoise/hare floyd算法迭代Node对象.

但我希望每次都避免通过我的"看到"节点列表进行线性搜索.如果我只有键的哈希表,这将是很好的.我可以以某种方式哈希一个对象吗?难道java对象只是引用内存中的位置吗?我想知道如果碰撞有多少问题......

Ste*_*n C 5

简单的答案是HashSet在第一次遇到它时创建一个并将每个节点添加到集合中.

唯一不起作用的情况是,如果您已经重载hashCode()并且equals(Object)节点类基于节点内容(或其他)实现相等性.然后你需要:

  • 使用IdentityHashMap它采用类==System.identityHashcode而不是equals(Object)hashCode(),或
  • 使用您自己的对象标识来自己构建一个哈希表.

难道java对象只是引用内存中的位置吗?

是的,不是.是的,引用由内存地址表示(在大多数JVM上).问题是1)你无法获得地址,2)它可以在GC重新定位对象时改变.这意味着您不能将对象地址用作哈希码.

identityHashCode方法通过返回最初基于内存地址的值来处理此问题.如果您再次调用identityHashCode同一个对象,则可以保证获得与以前相同的值...即使该对象已重新定位.

我想知道如果碰撞有多少问题......

identityHashCode方法生成的哈希值可能会发生冲突.(也就是说,两个不同的对象可以具有相同的标识哈希码值.)任何使用这些值的东西都必须处理这个问题.(标准HashSetIdentityHashMap类会处理这些冲突......如果您选择使用它们.)