如何为仅包含对下一个节点的引用的节点实现 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()?的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法学习-单向链表的实现

如何为 ctree(打包方)的终端节点添加标签?

如何为每个 XML 节点添加换行符?

在网络上部署Corda节点时,哪些JAR必须完全相同?

如何为单列和双列节点c ++构造模板层次结构

如何为 MWS 上的产品 Feed 提交创建 Item 节点?