我已经将arraylist定义如下:
ArrayList<Node> nodes = new ArrayList<Node>();
其中 Node 是一个类,它具有一种用于存储单个字符的字符数据类型。
输出显示一些垃圾值而不是打印字符:
这是一个代码片段。谁能解释为什么?
for(Node d : nodes){
System.out.println(d);
}
我已经将arraylist定义如下:
ArrayList<Node> nodes = new ArrayList<Node>();
其中 Node 是一个类,它具有一种用于存储单个字符的字符数据类型。
输出显示一些垃圾值而不是打印字符:
这是一个代码片段。谁能解释为什么?
for(Node d : nodes){
System.out.println(d);
}
您的Node
类不会覆盖该toString
方法。这就是为什么调用默认实现,产生看起来像“垃圾”的原因。
在您的Node
类中添加一个toString
不带参数的方法,并返回一个String
以特定于应用程序的方式描述节点内容的方法。这将修复输出。
除非您继承 ArrayList 并覆盖 toString 方法,否则只需在 ArrayList 上调用 println 将打印对象引用的地址(这是您看到的垃圾),而不是 arraylist 的实际内容。要获得您想要的结果,请使用:
System.out.println(Arrays.toString(nodes.toArray());
顺便说一句-其他人是正确的,您还需要覆盖节点类的 toString() 方法(通常,覆盖您设计的任何类的 toString() 方法始终是最佳实践)。
为了解决您在下面的评论中提到的问题:
public String toString(){
return Character.toString(label);
}
System.out.println(d)
相当于System.out.println(d.toString())
如果你没有toString()
在你的类中重新定义方法Node
,java 会使用toString()
你的对象继承的类的方法。
默认情况下,所有类都继承了Object
方法toString()
定义为的超类:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
这就是为什么它看起来像“垃圾”