java - 创建我自己的 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
在地图中显示对象身份的原始方式。
- 有没有什么办法解决这一问题?
- 有没有一种方法可以调用 ListNode 来显示
ListNode@57829d67
?
我唯一能看到的不是重写 toString 方法,而是创建一个不同的方法来显示我的链表对象的字符串。我不确定这是否是个好主意
谢谢
解决方案
那不是“身份”;这是hashCode()
你的ListNode
。随时致电hashCode()
获取“57829d67”。
推荐阅读
- python - 如何在 Python 中找到可执行文件的位置?
- authentication - 如何跨不同 API 对 JSON Web 令牌 (JWT) 进行身份验证?
- r - 您是否有想法从某个点(例如 3. 空格)删除,直到 r 中的文本结束?
- routes - 通过重定向防止暴力攻击
- php - 在另一个页面上显示连接结果
- php - 使用表单提交删除laravel中的多条记录
- php - Laravel DatabaseTransactions 不适用于 DB Facade
- php - 如何在数据库 Laravel 的日历视图中显示日期
- java - java.time.format.DateTimeParseException:无法从格式为 ddMMyyyyhhmmss 的 TemporalAccessor 获取 ZonedDateTime
- sql - Invoke-Sqlcmd:无效的对象名称“Inventar”