请教大家:我有一个嵌套的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还是跟着变空了.不知道这个问题该如何解决,请达人指点.

解决方案 »

  1.   

    我看到了一群"大Hashmap","小Hashmap"……头都晕了
      

  2.   

    我之所以把临时的HashMap只定义一次是因为要处理的键值对太多,如果每来一个键值对就new一个临时的小HashMap会消耗很大,即占用空间又占用时间.
      

  3.   

    帮 流氓 顶一下 希望早日解决!友情up www.jf.gov
      

  4.   

    Map orgMap = new HashMap();
    Map tempMap = orgMap.get(key1);
    tempMap.put("a",value);
    orgMap.put(key1,tempMap);
    tempMap = orgMap.get(key2);
    tempMap.put("a",value);
    orgMap.put(key2,tempMap);
    ...........
      

  5.   

    Tkendy,你这样的方法我也用过,关键是tempMap = orgMap.get(key1);以后orgMap.get(key1)是个对象,你下一次tempMap = orgMap.get(key2);以后,orgMap.get(key1)还在那占用内存,虚拟机在内存要耗尽之前不会花那么多时间在垃圾内存的回收上的.这样不停的累积的结果就是占用了大量的时间和空间.我要处理1000W个键值对的.
      

  6.   

    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();
    while(i.hasNext()){
    String key = (String)i.next();
    HashMap hparam=(HashMap)hp.get(key);
    hp.remove(hparam);
    hparam.put("k1","2");
    hp.put(key,hparam);
    }
    System.out.println(hp);
      

  7.   

    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);
      

  8.   

    shan1119(大天使,大菜鸟),你好像没完全看懂我的意思.
      

  9.   

    把你的代码贴出来看看.看你的表述,你的问题好象是出在clear(who clear who)上.
      

  10.   

    试一下自己重写HashMap中的clone()方法,
    以HashMap为基类派生出自己的HashMap子类,然后重写clone()看了一下HashMap中的clone是public object clone();
    好象HashMap本身没重载clone(),是用的object Class中默认的clone();
      

  11.   

    楼主要注意一下,HashMap放的是值还是址
      

  12.   

    我只当hashmap是什么都能装的大垃圾堆。
      

  13.   

    当HashMap中insert一个key的时候,实际你是想把这个key对象产生一个copy然后再insert进一个HashMap中是吗。
    JAVA中的都是对象的引用所以导致在外面执行了tmpkey.clear后,HashMap中的那个key也被clear了
    ,因为它们是同一个key对象的引用。由于这样的原因所以要用到clone,注意一下HashMap的Object clone();这个函数是怎么实现的。
      

  14.   

    很明显,你说的大Map小Map这两个引用是指向了同一个对象,也就是操作了同一块内存