首页 > 解决方案 > 创建我自己的 toString 方法后丢失了 java 对象标识

问题描述

假设我有自己的链表实现:

class ListNode {
    int val;
    ListNode next;

    ListNode(int x) {
        val = x;
    }
}

当我有这个简单的设置时,我可以在 Map 中使用一个节点:

ListNode A = new ListNode(1);
ListNode B = new ListNode(2);
ListNode C = new ListNode(3);
A.next = B;
B.next = C;

Map<ListNode, Integer> hmp = new HashMap<>(Map.ofEntries(
    Map.entry(A, 1)
));

当我打印 Map 对象时,我得到:

System.out.println(hmp);
// >>> {ListNode@57829d67=1}

但是,在我为我的链表实现了一个 toString 方法之后,我可以直接打印出来:

public String toString() {
    if (this.next != null) {
        return this.val + "->" + this.next.showString();
    } else {
        return String.valueOf(A.val);
    }
}

现在如果我可以很好地打印链接列表,但如果我再次打印地图:

System.out.println(A);
// >>> 1->2->3
System.out.println(hmp);
// >>> {1->2->3=1}

你可以看到我失去了ListNode在地图中显示对象身份的原始方式。

  1. 有没有什么办法解决这一问题?
  2. 有没有一种方法可以调用 ListNode 来显示ListNode@57829d67

我唯一能看到的不是重写 toString 方法,而是创建一个不同的方法来显示我的链表对象的字符串。我不确定这是否是个好主意

谢谢

标签: javaidentity

解决方案


不是“身份”;这是hashCode()你的ListNode。随时致电hashCode()获取“57829d67”。


推荐阅读