1. 程式人生 > >對 HashMap remove 有一些元素無法清除的現象 總結(不完整版)

對 HashMap remove 有一些元素無法清除的現象 總結(不完整版)

今天寫專案的時候發現了這樣的一個奇怪的現象:

下面將我寫的原始碼貼出來

searchedData 是我定義好的一個 並且資料put成功的一個HashMap,並且MapKey也保證了一致,也保證不會出現OutOfIndexException

 for (int i = JSONStrLength; i < searchedData.size(); i++) { 
    Log.e("remove",
    searchedData.remove(HISTORY + i)); 
}
用上面這段程式碼去移除相應的元素的時候發現在移除的時候,呼叫searchedData.size()方法,發現總會有那麼幾個元素無法移除.

但是換了一種方法的話,就能夠移除成功了,詳見下面程式碼

			for (Iterator<String> iterator = searchedData.values().iterator(); iterator
					.hasNext();) {
				iterator.next();
				iterator.remove();
			}

 以上是利用迭代器去刪除HashMap的元素 至於為什麼的話,暫時沒想到,之後想到一定會上來重新編輯!

 還有一個是這種情況

以下是示例: 

HashMap<Point,String> hashMap = new HashMap<Point, String>(); 


Point A = new Point(2,2); 
hashMap.put(A,"A");//將2,2點作為Key值存入HashMap 
A.x = 1;//修改A點的x值 
A.y = 1;//修改A點的y值 
System.out.println(hashMap.get(A));//此時結果為Null 已經找不到了 

//我們試著迭代一下 
System.out.println(hashMap.size());//此處為1 
for(Iterator<String> iterator = hashMap.values().iterator();iterator.hasNext();){ 
iterator.next(); 

iterator.remove(); 

System.out.println(hashMap.size());//此處依舊為1 即無法銷燬 

所以 使用Point作為HashMap的Key時大家要注意了 這個Point應當是Final態 即不可修改的 否則將發生在HashMap中無法找到對應Value也無法迭代刪除的錯誤 

當然其他以物件作為Key值時也應當注意 
原因是hashMap的索引是通過Key的hashcode進行的 當用戶人為修改物件的內部屬性後會造成hashcode的變化 從而造成無法取得Value的錯誤 

以上是對於我在使用 HashMap 碰到的一些問題的總結。