
当使用system.out.println()输出自定义类(如banking)实例时,默认调用object类的tostring()方法,导致显示内存地址(如banking@7852e922);需在类中重写tostring()方法,返回可读字符串。
在Java中,所有类都隐式继承自java.lang.Object,而其默认的toString()方法仅返回类名加“@”符号及哈希码十六进制表示(例如org.encap.Banking@7852e922)。这正是你在控制台看到“内存地址”格式输出的根本原因——并非Map或LinkedHashMap的问题,而是Banking对象未提供有意义的字符串表示。
要解决该问题,只需在Banking类中显式重写toString()方法。推荐使用@Override注解确保正确覆盖,并按业务逻辑组织字段输出。以下是优化后的Banking.java:
package org.encap;
public class Banking {
private int username;
private String password;
// Getters and Setters (unchanged)
public int getUsername() {
return username;
}
public void setUsername(int username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
// ✅ Critical: Override toString() for human-readable output
@Override
public String toString() {
return "Banking{" +
"username=" + username +
", password='" + password + '\'' +
'}';
}
}完成修改后,再次运行Website类,输出将变为:
Banking{username=111, password='Password'}
Banking{username=222, password='Password2'}
[Banking{username=111, password='Password'}, Banking{username=222, password='Password2'}]
[1=Banking{username=111, password='Password'}, 2=Banking{username=222, password='Password2'}]✅ 关键注意事项:
立即学习“Java免费学习笔记(深入)”;
- toString() 方法应只用于调试和日志展示,不建议包含敏感信息(如明文密码),生产环境可脱敏处理(例如显示 "password='***'");
- 若使用IDE(如IntelliJ IDEA或Eclipse),可通过右键 → Generate → toString() 快速生成标准实现;
- 对于复杂对象或嵌套结构,可结合Objects.toString()或第三方库(如Apache Commons Lang的ToStringBuilder)提升可维护性;
- Map.values() 和 Map.entrySet() 的输出也依赖其中值(即Banking对象)的toString()实现,因此重写一次即可全局生效。
通过这一改动,你不仅解决了当前LinkedHashMap输出不可读的问题,也为后续调试、单元测试和日志记录打下了坚实基础。











