2 u013790128 u013790128 于 2014.02.27 06:22 提问

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(...)呢?谢谢了!

2个回答

u011483829
u011483829   2014.02.27 09:40

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,,

u013790128
u013790128 这样啊,谢谢啦
3 年多之前 回复
gz_benwu
gz_benwu   2014.02.27 23:33

楼上正解啊!

System.out.println(v);
这样写的时候,打印的是v的toString()方法,而Vector的toString方法就是像上面说的那个,遍历整个集合并组成"[o1,o2,...]"这样的字符串。当然,在取得o1这个对像的字符串的时候也是toString了。

而你开头问的问题,为什么不是打印"列表的首地址",这是因为有些对象是没有像Vector这样独立实现了toString方法的,所以还是使用最原始的Object.toString,而Object的toString方法,就是返回你认为的那个"列表的首地址"。

最后一点,在Java中是没有"列表的首地址"这个像你说的Windows中的句柄的东西的,也没有指针,你看到的那个"列表的首地址"其实是hashCode方法有关的返回值,和内存地址也有关。

http://www.minidownend.com/

Csdn user default icon
上传中...
上传图片
插入图片