
当java自定义类(如banking)未重写tostring()方法时,将其存入linkedhashmap后直接打印对象或集合,会输出类似`banking@7852e922`的哈希码形式,而非实际字段值;解决方法是在类中显式重写tostring()方法。
Java中,所有类默认继承自Object类,而Object.toString()的默认实现返回的是类名 + @ + 对象哈希码的十六进制表示(例如 org.encap.Banking@7852e922)。这正是你在控制台看到内存地址格式输出的根本原因——它并非真正的“内存地址”,而是hashCode()的字符串化表现。
要让System.out.println(mp.get(1))、mp.values()或mp.entrySet()等操作输出可读的业务数据(如用户名和密码),必须在Banking类中重写toString()方法,明确指定如何将对象状态转换为字符串。
✅ 正确做法:在 Banking.java 中补充 toString() 方法(推荐使用 @Override 注解确保覆盖正确):
package org.encap;
public class Banking {
private int username;
private String password;
// Getters and Setters (existing code)
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;
}
// ✅ 重写 toString() 方法 —— 关键修复
@Override
public String toString() {
return "Banking{" +
"username=" + username +
", password='" + password + '\'' +
'}';
}
}? 补充说明与最佳实践:
立即学习“Java免费学习笔记(深入)”;
- 不要在toString()中暴露敏感信息:本例中密码明文打印仅用于教学演示。生产环境中应避免在toString()中输出密码、密钥等敏感字段,可替换为"***"或直接省略;
- 推荐使用IDE自动生成:IntelliJ IDEA 或 Eclipse 均支持右键 → Generate → toString(),可快速生成符合规范的实现(支持选择字段、格式模板);
- 若需结构化输出(如JSON):可引入 Jackson/Gson 库,但toString()仍是基础调试首选;
- 其他集合行为同步生效:一旦重写toString(),不仅System.out.println(mp.get(1))会变友好,mp.values()、mp.entrySet()、Arrays.toString(array)等所有依赖对象字符串表示的场景均自动受益。
运行修复后的代码,输出将变为:
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'}]✅ 总结:toString() 是Java对象对外“自我描述”的标准接口。任何需要被直接打印、日志记录或调试查看的自定义类,都应合理重写该方法——这不是可选项,而是专业Java开发的必备实践。











