看一看下面的很简单的代码,先是声明了一个Hashtable和StringBuffer对象,然后分四次把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. */ |