Java中自定义类在Map中打印显示内存地址的解决方案

当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 +

'\'' + '}'; } }

? 补充说明与最佳实践:

  • 不要在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开发的必备实践。