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
相关产品推荐
相关产品推荐

