list,set 这种容器对象,为什么不打印出类似:类名+@+ hashCode() 这种格式,是因为java所有的对对象的输出(print)操作,都是输出的 String.toValue(obj)操作。可看PrintStream源码。
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}而String类的这个静态方法valueOf(Object obj), 是返回的 obj.toString().
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}任何对象都继承自Object, Object 对这个 toString()方法的定义是:返回类名 + @ + 对象的hashCode值。 public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
所以一般的对象(不重写这个toString()方法的话),都会输出“返回类名 + @ + 对象的hashCode值”这样的结果。但List 和Set 这些接口的实现类,都重写了这个方法。实现List接口的类,比如ArrayList,继承了 AbstractList类,而Arstarctlist类,继承了 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(", ");
}
}
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable。。public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable。。
类似, 实现接口Set的类都继承自AbstractSet类,而这个类继承了类AbstractCollection,所以输出也改变了。以HashSet为例,看看继承关系:public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
。
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> {。对于String 本身,就不再转换,直接输出了。 public void println(String x) {
synchronized (this) {
print(x);
newLine();
}
public void print(String s) {
if (s == null) {
s = "null";
}
write(s);
}对于StringBuffer ,重写了toString() 方法。 public synchronized String toString() {
return new String(value, 0, count);
}所以都不输出 带类名 @ + hashCode的格式了。以上为个人浅见,共楼主参考。
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}而String类的这个静态方法valueOf(Object obj), 是返回的 obj.toString().
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}任何对象都继承自Object, Object 对这个 toString()方法的定义是:返回类名 + @ + 对象的hashCode值。 public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
所以一般的对象(不重写这个toString()方法的话),都会输出“返回类名 + @ + 对象的hashCode值”这样的结果。但List 和Set 这些接口的实现类,都重写了这个方法。实现List接口的类,比如ArrayList,继承了 AbstractList类,而Arstarctlist类,继承了 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(", ");
}
}
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable。。public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable。。
类似, 实现接口Set的类都继承自AbstractSet类,而这个类继承了类AbstractCollection,所以输出也改变了。以HashSet为例,看看继承关系:public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
。
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> {。对于String 本身,就不再转换,直接输出了。 public void println(String x) {
synchronized (this) {
print(x);
newLine();
}
public void print(String s) {
if (s == null) {
s = "null";
}
write(s);
}对于StringBuffer ,重写了toString() 方法。 public synchronized String toString() {
return new String(value, 0, count);
}所以都不输出 带类名 @ + hashCode的格式了。以上为个人浅见,共楼主参考。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货