Java中向ArrayList<自定义类>添加元素后打印对象字符串属性的方法
自定义类集合遍历打印输出内存地址的解决方法
问题场景
- 实际开发需求:创建包含字符串属性的自定义类(示例中为
Token类),在同包其他类中创建ArrayList<Token>集合存储该类的实例对象,需要打印每次创建对象时传入的字符串参数(例如new Token("Hello")中的"Hello")。 - 异常表现:遍历集合并直接打印对象时,输出结果为类路径拼接哈希值的内存地址形式,无法获取存储的字符串值。
- 现有代码片段:
Token j = new Token(part); // Token为前述的自定义类类型 tokenfinal.add(j); // tokenfinal为ArrayList<Token>类型的集合 // Token类定义 public class Token { public String tok; public Token(String tok) { this.tok = tok;
问题根因
Java中所有类默认继承
java.lang.Object基类,当直接打印对象引用时,会自动调用Object类中默认实现的toString()方法,该方法的输出规则为「类全限定名@对象哈希值十六进制字符串」,也就是看到的内存地址格式输出,该行为和集合存储的类型没有关联。
可落地的解决方案
- 方案1:遍历集合时直接访问类的公开字符串属性
由于示例中Token类的tok属性为public修饰,可在遍历过程中直接读取属性值输出,无需修改原有类定义:
// 遍历集合的执行代码 for (Token item : tokenfinal) { // 直接访问公开的tok属性,输出构造时传入的字符串 System.out.println(item.tok); }
- 方案2:为自定义类重写
toString()方法
这是Java自定义类的通用编码规范,重写后直接打印对象即可输出自定义的内容,不需要每次遍历都手动读取属性:
// 补充完善后的Token类定义 public class Token { public String tok; public Token(String tok) { this.tok = tok; } // 重写toString方法,自定义对象打印时的输出规则 @Override public String toString() { // 直接返回存储的字符串属性作为输出内容 return tok; } }
完成方法重写后,遍历集合时直接打印对象即可得到目标字符串输出:
for (Token item : tokenfinal) { // 直接打印item对象,会自动调用重写的toString方法输出tok值 System.out.println(item); }
内容的提问来源于stack exchange,提问作者Sesto Roll
相关产品推荐
相关产品推荐

