您的位置:程序门 -> java -> j2se / 基础类



==========java里hashmap的问题,应该有很多人遇到过或即将遇到==========


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


==========java里hashmap的问题,应该有很多人遇到过或即将遇到==========[已结贴,结贴人:water_mys]
发表于:2007-02-26 16:23:23 楼主
请教大家:我有一个嵌套的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还是跟着变空了.不知道这个问题该如何解决,请达人指点.
发表于:2007-02-26 16:26:291楼 得分:0
我看到了一群 "大hashmap ", "小hashmap "……头都晕了
发表于:2007-02-26 16:28:192楼 得分:0
我之所以把临时的hashmap只定义一次是因为要处理的键值对太多,如果每来一个键值对就new一个临时的小hashmap会消耗很大,即占用空间又占用时间.
发表于:2007-02-26 16:31:563楼 得分:0
帮   流氓   顶一下   希望早日解决!

友情up  

www.jf.gov
发表于:2007-02-26 16:32:214楼 得分:0
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);
...........
发表于:2007-02-26 16:44:115楼 得分:0
tkendy,你这样的方法我也用过,关键是tempmap   =   orgmap.get(key1);以后orgmap.get(key1)是个对象,你下一次tempmap   =   orgmap.get(key2);以后,orgmap.get(key1)还在那占用内存,虚拟机在内存要耗尽之前不会花那么多时间在垃圾内存的回收上的.这样不停的累积的结果就是占用了大量的时间和空间.我要处理1000w个键值对的.
发表于:2007-02-26 16:55:246楼 得分:0
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);
发表于:2007-02-26 17:01:327楼 得分:0
呵呵,部队
发表于:2007-02-26 17:03:048楼 得分:10
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);
发表于:2007-02-26 17:46:189楼 得分:0
shan1119(大天使,大菜鸟),你好像没完全看懂我的意思.
发表于:2007-02-27 10:05:2310楼 得分:0
把你的代码贴出来看看.看你的表述,你的问题好象是出在clear(who   clear   who)上.
发表于:2007-02-27 10:10:4911楼 得分:0
楼主的表达看的好晕
发表于:2007-02-27 12:45:2912楼 得分:10
试一下自己重写hashmap中的clone()方法,
以hashmap为基类派生出自己的hashmap子类,然后重写clone()

看了一下hashmap中的clone是public   object   clone();
好象hashmap本身没重载clone(),是用的object   class中默认的clone();
发表于:2007-02-27 15:46:3113楼 得分:0
那么一堆大的小的,看不过来,我只想说一句,有用的是在用着的,没有用着的是没有用的,你操那份心做什么。
发表于:2007-02-27 16:11:4514楼 得分:0
楼主要注意一下,hashmap放的是值还是址
发表于:2007-02-27 17:37:0815楼 得分:0
我只当hashmap是什么都能装的大垃圾堆。
发表于:2007-02-27 17:37:3016楼 得分:0
mark一下吧,好晕
发表于:2007-02-27 20:28:4717楼 得分:10
当hashmap中insert一个key的时候,实际你是想把这个key对象产生一个copy然后再insert进一个hashmap中是吗。
java中的都是对象的引用所以导致在外面执行了tmpkey.clear后,hashmap中的那个key也被clear了
,因为它们是同一个key对象的引用。

由于这样的原因所以要用到clone,注意一下hashmap的object   clone();这个函数是怎么实现的。
发表于:2007-02-28 08:35:5418楼 得分:0
关注中
发表于:2007-02-28 10:54:1319楼 得分:0
顶一下
发表于:2007-03-01 12:15:5020楼 得分:0
很明显,你说的大map小map这两个引用是指向了同一个对象,也就是操作了同一块内存


快速检索

最新资讯
热门点击