风雨无阻

Hashtable真的能存储对象吗?

 

看一看下面的很简单的代码,先是声明了一个HashtableStringBuffer对象,然后分四次把StriingBuffer对象放入到Hashtable表中,在每次放入之前都对这个StringBuffer对象append()了一些新的字符串:

package reference;

import java.util.*;

public class HashtableAdd{

    public static void main(String[] args){

        Hashtable ht = new Hashtable();

        StringBuffer sb = new StringBuffer();

        sb.append("abc,");

        ht.put("1",sb);    

        sb.append("def,");

        ht.put("2",sb);

        sb.append("mno,");

        ht.put("3",sb);

        sb.append("xyz.");

        ht.put("4",sb);

       

        int numObj=0;

        Enumeration it = ht.elements();

        while(it.hasMoreElements()){

            System.out.print("get StringBufffer "+(++numObj)+" from Hashtable: ");

            System.out.println(it.nextElement());

        }

    }

}

如果你认为输出的结果是:
get StringBufffer 1 from Hashtable: abc,
get StringBufffer 2 from Hashtable: abc,def

get StringBufffer 3 from Hashtable: abc,def,mno,
get StringBufffer 4 from Hashtable: abc,def,mno,xyz.

那么你就要回过头再仔细看一看上一个问题了,把对象时作为入口参数传给函数,实质上是传递了对象的引用,向Hashtable传递StringBuffer对象也是只传递了这个StringBuffer对象的引用!每一次向Hashtable表中put一次StringBuffer,并没有生成新的StringBuffer对象,只是在Hashtable表中又放入了一个指向同一StringBuffer对象的引用而已。

Hashtable表存储的任何一个StringBuffer对象(更确切的说应该是对象的引用)的改动,实际上都是对同一个"StringBuffer"的改动。所以Hashtable并不能真正存储能对象,而只能存储对象的引用。也应该知道这条原则对与Hashtable相似的Vector, List, Map, Set等都是一样的。

上面的例程的实际输出的结果是:

/* RUN RESULT

get StringBufffer 1 from Hashtable: abc,def,mno,xyz.

get StringBufffer 2 from Hashtable: abc,def,mno,xyz.

get StringBufffer 3 from Hashtable: abc,def,mno,xyz.

get StringBufffer 4 from Hashtable: abc,def,mno,xyz.

*/

posted on 2008-03-14 10:45 秋枫故事 阅读(572) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
 
<2008年3月>
2425262728291
2345678
9101112131415
16171819202122
23242526272829
303112345

导航

统计

常用链接

留言簿(2)

随笔分类

随笔档案

新闻档案

搜索

最新评论

阅读排行榜

评论排行榜