如何为仅包含对下一个节点的引用的节点实现 HashCode()?
Posted
技术标签:
【中文标题】如何为仅包含对下一个节点的引用的节点实现 HashCode()?【英文标题】:how to implement HashCode() for a node containing only reference to next node? 【发布时间】:2012-03-20 17:54:22 【问题描述】:public class Node
private Node nextNode;
@Override
public int hashCode()
//How to implement this?
//Because you just have a attribute which is a reference.
//I think the attribute is almost useless, because if you use the HashCode of the attribute, you will finally fall into a useless loop.
//Thus, I think you should find a way to represent the HashCode of reference (instance) itself.
从代码中的注释来看,我的问题实际上是如何唯一标识引用本身,比如 C 中的地址。
【问题讨论】:
我猜这应该是一个基类。如果是这样,请不要费心实现它,因为仅指向下一个节点的节点没有用,是吗?我猜你永远不会在不扩展它的情况下使用它。也许让类抽象来强制执行这一点? 如果你确实想覆盖哈希码,正确的声明是public int hashCode()
【参考方案1】:
你不需要在这里做任何事情,Node
已经有默认实现,它根据它所在的内存位置返回一个哈希码。
【讨论】:
现在情况不再如此,hashCode()
与实际的内存地址无关。见bugs.openjdk.java.net/browse/JDK-8199394【参考方案2】:
如果您希望Node
的哈希码代表其自己的 引用——也就是说,如果你没有覆盖equals(Object)
——那么你不需要覆盖@ 987654325@。
如果您希望Node
的哈希码代表其nextNode
的引用——也就是说,如果您的equals(Object)
看起来像这样:
@Override
public boolean equals(Object that)
return ((that instanceof Node) && (nextNode == ((Node) that).nextNode));
——那么你可以使用the JDK's System.identityHashCode(Object)
utility method:
@Override
public int hashCode()
return System.identityHashCode(nextNode);
【讨论】:
谢谢!接受,因为提到 1.“identityHashCode”。 HashCode和indentityHashCode的区别可以看***.com/questions/4930781/… 2.你是对的 Sun的SDK hashCode()方法的默认实现,是一个返回值*,就是对象的内存地址。以上是关于如何为仅包含对下一个节点的引用的节点实现 HashCode()?的主要内容,如果未能解决你的问题,请参考以下文章