You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HashMap的toString()方法未打印键值对文本表示的问题排查

问题分析与解决方案

嘿,这个问题我太熟了!你之所以打印出来的是哈希码而非键值对的文本内容,核心原因是存在于HashMap中的自定义对象没有重写toString()方法。

为什么会这样?

Java里所有类默认继承自Object类,而Object类的toString()方法默认返回的是「类名@哈希码」格式的字符串。你代码里的activities.get(name).toString()调用的就是这个默认方法,所以才会打印出哈希码,而不是你想要的aName、aDate、aTime的内容。

解决办法有两种,推荐第一种:

1. 给自定义对象类重写toString()方法

假设你存在HashMap里的对象类叫Activity(对应变量名activities),只需要在这个类里添加重写的toString()方法,把三个字段按你想要的格式拼接起来就行:

public class Activity {
    private String aName;
    private String aDate;
    private String aTime;

    // 这里省略构造方法、getter/setter方法

    @Override
    public String toString() {
        // 你可以自定义格式,比如用逗号分隔或者更清晰的结构
        return String.format("名称:%s,日期:%s,时间:%s", aName, aDate, aTime);
    }
}

这样再运行你的循环,activities.get(name).toString()就会返回你定义的包含三个参数的文本内容了。

2. 手动获取对象字段拼接(应急可用)

如果你暂时不想修改类的代码,也可以在循环里直接调用对象的getter方法获取字段值再拼接:

for (Integer name: activities.keySet()) { 
    String key = name.toString(); 
    // 先拿到对象,再逐个取字段
    Activity activity = activities.get(name);
    String value = activity.getAName() + " | " + activity.getADate() + " | " + activity.getATime();
    System.out.println(key + " " + value); 
}

不过这种方式复用性差,不如重写toString()来得优雅。

内容的提问来源于stack exchange,提问作者weng tee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:33:34