问题描述
- Java中关于Vector句柄的问题
-
这段代码中:
import java.util.*;
class CrashJava{
?public static void main(String[] args) ?{
? ?Vector v = new Vector();
? ?for(int i = 0; i < 10; i++)
???v.addElement(new CrashJava());
??System.out.println(v);
?}
}
为什么打印出的是Vector中的所有元素的地址呢?v不是只是指向列表的首地址吗,为什么不需要用for就会打印出所有的呢?而如果要打印出它们的内容,则需要用for(...)呢?谢谢了!
解决方案
Vector是继承了抽象类并且实现了List接口的线程安全类,当用户打印对象的时候,实际上调用的是Vector的toString()方法,以下是toString()方法的实现
public String toString() {
Iterator 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(", ");
}
}
从代码中可以看出,实际上是将Vector内部的元素连接并打印出来的,,
纯手打,请采纳,如有不理解,请查看相关API,,
解决方案二:
楼上正解啊!
System.out.println(v);
这样写的时候,打印的是v的toString()方法,而Vector的toString方法就是像上面说的那个,遍历整个集合并组成"[o1,o2,...]"这样的字符串。当然,在取得o1这个对像的字符串的时候也是toString了。
而你开头问的问题,为什么不是打印"列表的首地址",这是因为有些对象是没有像Vector这样独立实现了toString方法的,所以还是使用最原始的Object.toString,而Object的toString方法,就是返回你认为的那个"列表的首地址"。
最后一点,在Java中是没有"列表的首地址"这个像你说的Windows中的句柄的东西的,也没有指针,你看到的那个"列表的首地址"其实是hashCode方法有关的返回值,和内存地址也有关。
时间: 2024-08-02 13:33:54