2016-09-18 43 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);