日期:2014-05-20  浏览次数:20595 次

==========JAVA里HashMap的问题,应该有很多人遇到过或即将遇到==========
请教大家:我有一个嵌套的HashMap     如:{key1={a=1,b=2,c=3},key2={d=1,e=2},...},我现在是要根据传过来的一对k,v值(k对应大HashMap的key,v对应小HashMap的key)来对这个嵌套的HashMap进行更新.比如现在传过来key1,a   我就把key1对应的小HashMap{a=1,b=2,c=3}拿出来放进预先定义的一个临时HashMap里.然后把a对应的出现次数,即数字1拿出来加1后再放回去,这样这个小HashMap就变为{a=2,b=2,c=3},然后我再将小HashMap   put回大HashMap里,于是大HashMap就是{key1={a=2,b=2,c=3},key2={d=1,e=2},...}了.现在的问题是那个临时的HashMap我只在程序前面定义了一次,我在每次把小HashMap   put回大HashMap后都会调用小HashMap的clear来移除所有映射关系,以便下一次的使用.现在问题是我调用完clear后,大HashMap里已经存在的小HashMap也跟着变空了.我于是就再定义一个临时的HashMap用来存放那个临时小HashMap的clone,把这个clone的HashMap   put回大HashMap里.但是还是一样,调用clone的HashMap的clear后大HashMap里已经存在的小HashMap还是跟着变空了.不知道这个问题该如何解决,请达人指点.

------解决方案--------------------
HashMap <String, HashMap> hp = new HashMap <String, HashMap> ();
HashMap <String, String> hpP = new HashMap <String, String> ();
hpP.put( "k1 ", "1 ");
hpP.put( "k2 ", "2 ");
hp.put( "k1 ", hpP);
hp.put( "k2 ", hpP);
hp.put( "k3 ", hpP);

System.out.println(hp);
Iterator i=hp.keySet().iterator();
int k=0;
while(i.hasNext()){
String key = (String)i.next();
HashMap hparam=(HashMap)hp.get(key).clone();
hp.remove(hparam);
hparam.put( "k1 ",k);
hp.put(key,hparam);
k=k+1;
}
System.out.println(hp);
------解决方案--------------------
试一下自己重写HashMap中的clone()方法,
以HashMap为基类派生出自己的HashMap子类,然后重写clone()

看了一下HashMap中的clone是public object clone();
好象HashMap本身没重载clone(),是用的object Class中默认的clone();

------解决方案--------------------
当HashMap中insert一个key的时候,实际你是想把这个key对象产生一个copy然后再insert进一个HashMap中是吗。
JAVA中的都是对象的引用所以导致在外面执行了tmpkey.clear后,HashMap中的那个key也被clear了
,因为它们是同一个key对象的引用。

由于这样的原因所以要用到clone,注意一下HashMap的Object clone();这个函数是怎么实现的。