关于hashtable clone()函数

来源:百度知道 编辑:UC知道 时间:2024/06/07 12:16:54
hashtable clone()函数的API说明如下:创建此哈希表的浅表复制。复制哈希表自身的所有结构,但不克隆它的键和值。这是一个开销相对较大的操作。
本人不解,如果复制哈希表自身的所有结构,但不克隆它的键和值。那么复制后的HASTTABLE不就是一个刚实例化的HASHTABLE吗?
本人写如下语句:
int a1=1,a2=2;
Hashtable hashparm=new Hashtable();
Hashtable tem=new Hashtable();
hashparm.put("a",a1);
hashparm.put("b",a2);
tem=(Hashtable)hashparm.clone();
System.out.println( "tem:"+ tem.get("a"));
发现,在控制台可以输出:tem:1;如此说来,不克隆它的键和值是不对的。如果API说的是对的,为什么说克隆这是一个开销相对较大的操作呢?可以给一个说明吗?顺便告诉我这个函数到底做了些什么操作。
感谢2位的解说。你们的解释都让我满意。

就是说他是一个浅(shallow)克隆,它本身的内容是克隆的,但是其中引用到对象(包括键和值)没有进行克隆,就是说,如果Hashtable B是 A的克隆,A中有一对key1--value1,B中也会有key1--value1,但B中的key1和value1和A中的是使用的同一个地址,就是做B中的key1实际上还是指向了A中的key1。

import java.util.Hashtable;

public class Test8 {
public static void main(String[] args) {
int a1 = 1, a2 = 2;
Hashtable hashparm = new Hashtable();
hashparm.put("a", a1);
hashparm.put("b", a2);
Hashtable tem = (Hashtable) hashparm.clone();
System.out.println(hashparm == tem);
System.out.println(hashparm.get("a") == tem.get("a"));
}
}

这样也许会更直观,第一输出的是false,说明他们在内存中是不同的2个地址,也就是说实现了clone,但是后面的输出的是true说明他并没有重新创建key和value的对象,只是把地址的引用交给了tem,实际上并没有被复制