Collection c = new HashSet();
c.add(new Name("name1","ttt"));
c.add(new Name("name2","fff"));
c.add(new Name("name3","ggg"));
System.out.println(c);
为什么可以直接打印出c出来?
c.add(new Name("name1","ttt"));
c.add(new Name("name2","fff"));
c.add(new Name("name3","ggg"));
System.out.println(c);
为什么可以直接打印出c出来?
println(Object x)
打印 Object,然后终止该行。这里调用的就是这个方法。
HashSet extends AbstractSet<E>AbstractSet<E> extends AbstractCollection<E>AbstractCollection重写了toString():public String toString() {
Iterator<E> i = iterator();
if (! i.hasNext())
return "[]"; StringBuilder sb = new StringBuilder();
sb.append('[');
for (;;) {
E e = i.next();
sb.append(e == this ? "(this Collection)" : e);
if (! i.hasNext())
return sb.append(']').toString();
sb.append(", ");
}
}
这个我理解,可是为什么不是打印出来类名加@那种格式的呢?应该是重写了toString方法,可是不知道怎么重写的
下面是toString的代码:public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}可以看出,它打印的是String.valueOf(x),x是一个Object.再看看valueOf的代码:public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}可以看出这里调用了toString;
你可以去找找源码看看
public static String valueOf(Object obj)返回 Object 参数的字符串表示形式。 参数:
obj - 一个 Object。
返回:
如果参数为 null,则字符串等于 "null";否则,返回 obj.toString() 的值。
另请参见:
Object.toString()
也就是调用了toString()方法,这里调用的是HashSet父类的toString()方法。
定义如下:
toString
public String toString()返回此 collection 的字符串表示形式。该字符串表示形式由 collection 元素的列表组成,这些元素按其迭代器返回的顺序排列,并用方括号 ("[]") 括起来。相邻元素由字符 ", "(逗号加空格)分隔。通过 String.valueOf(Object) 可以将元素转换成字符串。
此实现会创建一个空字符串缓冲区,追加一个左方括号,然后在 collection 上进行迭代,依次追加每个元素的字符串表示形式。每追加一个元素后(最后一个元素除外),将追加字符串 ", "。最后,追加一个右括号。从字符串缓冲区获取一个字符串并返回它。
覆盖:
类 Object 中的 toString
返回:
此 collection 的字符串表示形式。
从类 java.util.AbstractCollection 继承的方法
addAll, containsAll, retainAll, toArray, toArray, toString
你查HashSet的API,肯定能看到这一行,再找AbstractCollection的方法,看toString()方法的定义,应该就能明了了。
Iterator<E> i = iterator();
if (! i.hasNext())
return "[]"; StringBuilder sb = new StringBuilder();
sb.append('[');
for (;;) {
E e = i.next();
sb.append(e == this ? "(this Collection)" : e);
if (! i.hasNext())
return sb.append(']').toString();
sb.append(", ");
}
}这是hashset的tostring方法
其中,sb.append(e == this ? "(this Collection)" : e);中的e就是你集合里面的对象,调用了e 的tostring方法的返回结果append进去。
在你这里是一个Name类,也就是说,他会打印出类似[Name(..).toString],[Name(..).toString],[Name(..).toString]的东西。
LZ应该把你的name类和最终打印出来的东西放上来才好参考。