對 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 碰到的一些問題的總結。