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 这样啊,谢谢啦
4 年多之前 回复
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
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
windows 句柄理解
句柄是一个让你操纵某个对象的标识符。在windows中句柄有很多类型,有的是指针,有的是指向指针的指针,有的是一个数组索引。 但在编程中不需要在乎句柄是怎么样的,因为winapi调用掩盖了句柄操作的细节。为什么我们需要句柄?     更准确地说,是windows需要句柄。win
qt和boost.asio
boost.asio中对socket的阻塞性质的设置如果放置在生效前会导致句柄无效的错误提示。 qt中debug调试qoci插件,出现malloc.c或者free.c错误,后来发现是由于链接部分填写的动态库有问题,应该是qsqld.lib,没有qsql.lib。
幸运数(向量Vector类练习)
题目要求: 幸运数是波兰数学家乌拉姆命名的。它采用与生成素数类似的“筛法”生成。 首先从1开始写出自然数1,2,3,4,5,6,....  1 就是第一个幸运数。  我们从2这个数开始。把所有序号能被2整除的项删除,变为:     1 _ 3 _ 5 _ 7 _ 9 ....  把它们缩紧,重新记序,为:    1 3 5 7 9 .... 。这时,3为第2个幸运数,然后把所
java vector 对象排序例子
import java.util.Collections; import java.util.Comparator; import java.util.Vector; public class Test {     /**      * @param args      */     public static void main(String[] args) {
c++ new 和 vector
我们知道可以通过new操作符来创建新的对象或者动态分配一定的内存。同样vector也可以。 但是这两者是有一定区别的。 比方说我们现在需要设定一个数组,数组的大小为10,我们可以这样操作。 int *p1 = new int[10];  //开辟10个int的内存大小,不初始化,值是随机的。 // 或者   int *p1 = new int [10]();//开辟10int的内存大小,
STL中vector的实现及面试问题
一、前言: 在学习c++的时候我们会接触两个库,一个是boost库另外一个就是STL库。关于STL库候捷先生的《STL源码剖析》中已经写的很详细了,今天我就关于STL中的vector实现及面试中的一些与之相关的问题做一个讲解。 在面试C++的时候关于vector是作为基础知识经常被问到的,如果面试官问你vector的实现原理,你会怎么回答呢? 二、vector的实现原理及实现机制 关于v
java学习笔记之vector的排序
Vector的基本类型排序 在这里不介绍不是基本类型的排序,详细见我上一篇博文,一样的道理。 对vector的排序有两种,一种是从小到大排序,一种是从小到大排序。 代码来啦: public class Main{ static Scanner cin = new Scanner(System.in); static PrintWriter out = new PrintWrite
JAVA排序,从小到大的Vector
排序
【Java集合源码剖析】Vector源码剖析
Vector简介 Vector也是基于数组实现的,是一个动态数组,其容量能自动增长。 LinkedList是JDK1.0引入了,它的很多实现方法都加入了同步语句,因此是线程安全的(其实也只是相对安全,有些时候还是要加入同步语句来保证线程的安全),可以用于多线程环境。 LinkedList没有丝线Serializable接口,因此它不支持序列化,实现了Cloneable接口,能被克隆,实现了RandomAccess接口,支持快速随机访问。 Vector源码剖析 Vector的
vector过时的代替建议
原答案https://stackoverflow.com/questions/1386275/why-is-java-vector-class-considered-obsolete-or-deprecatedVector在每个单独的操作上同步。这几乎从来没有你想要做的。通常你想同步整个操作序列。同步单个操作不太安全(例如,如果您遍历Vector,则仍需要取出锁以避免其他人同时更改集合,这会在迭代...