2016-09-18 84 views
-1

当我试图在HashSet中添加HashMap时,它显示错误的值。带HashMap的HashSet显示错误的值

CODE

HashSet<HashMap> arList = new HashSet<HashMap>(); 
HashMap<String, String> hm = new HashMap<String, String>(); 
hm.put("name", "Amit"); 
hm.put("device_id", "192.168.1.100"); 
hm.put("ip", "192.168.1.100"); 
System.out.println("hm:"+hm); 
arList.add(hm); 
//add again 
arList.add(hm); 

hm.put("name", "Mani"); 
hm.put("device_id", "192.168.1.102"); 
hm.put("ip", "192.168.1.102"); 
arList.add(hm); 

System.out.println("hm:"+hm); 
System.out.println("arList: " + arList); 

输出

hm:{name=Amit, device_id=192.168.1.100, ip=192.168.1.100} 
hm:{name=Mani, device_id=192.168.1.102, ip=192.168.1.102} 
arList: [{name=Mani, device_id=192.168.1.102, ip=192.168.1.102}, {name=Mani, device_id=192.168.1.102, ip=192.168.1.102}] 

预期输出

hm:{name=Amit, device_id=192.168.1.100, ip=192.168.1.100} 
hm:{name=Mani, device_id=192.168.1.102, ip=192.168.1.102} 
arList: [{name=Amit, device_id=192.168.1.100, ip=192.168.1.100}, {name=Mani, device_id=192.168.1.102, ip=192.168.1.102}] 
+1

当你添加一个引用的集合,只补充参考。它不会添加引用的对象的副本。 –

回答

0

hm变量指向一个(1)HashMap实例,随后将其添加到HashSet两次(或甚至三次,使用您的// add again块)。 HashMap实例将包含最后放置的值,并且该集合将包含对相同映射的两个(或三个)引用。

创建两个单独的HashMap情况下,使其正常工作:

HashSet<HashMap> hs = new HashSet<HashMap>(); 
HashMap<String, String> hm1 = new HashMap<String, String>(); 
hm1.put("name", "Amit"); 
hm1.put("device_id", "192.168.1.100"); 
hm1.put("ip", "192.168.1.100"); 

hs.add(hm1); 

HashMap<String, String> hm2 = new HashMap<String, String>(); 
hm2.put("name", "Mani"); 
hm2.put("device_id", "192.168.1.102"); 
hm2.put("ip", "192.168.1.102"); 

hs.add(hm2);