發現Set set = hashMap.keySet()的奧祕


發現 Set和HashMap之間還是有很多需要注意的地方: 

HashMap<String,String> map = new HashMap<String,String>();
map.put("1", "aa");
map.put("2", "bb");
map.put("3", "aa");
 
Set<String> set = map.keySet();

1.  map的keySet()方法只返回一個set實例,所以當從key1中刪除一個對象時候,其他也將會受到影響。

2.  針對於 set不能進行 add操作 ,否則會報“java.lang.UnsupportedOperationException” 。原因 如下 : 

    public Set<K> keySet()返回此映射中所包含的鍵的 set 視圖。該集合受映射的支持,所以映射的變化也反映在該集合中,反之亦然。該集合支持元素的移除,通過          Iterator.remove、Set.remove、removeAll、retainAll 和 clear 操作,從該映射中移除相應的映射關係。它不支持 add 或 addAll 操作。

3. 

  Set<String> set= map.keySet();

  for (String key : set) {

      map.remove(key);

  }

此代碼 報這個異常: Exception in thread "main" java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(Unknown Source)
at java.util.HashMap$KeyIterator.next(Unknown Source)
at com.nan.an.jing.TestSet.main(TestSet.java:23)

原因 爲 :  因爲刪除了一個Entry之後,因爲ketSet不正確,在for循環時出的問題。


改正的方法爲:

 String[] keySet = map.keySet().toArray(new String[0]);

  for (String key : keySet) {

      map.remove(key);

  }

或者 

 Object[] keySet = map.keySet().toArray();
 for (Object key : keySet) {
     map.remove((String)key);
 }


附註 : 代碼實例 

package com.nan.an.jing;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class TestSet {
   public static void main(String[] args) {
	 HashMap<String,String> map = new HashMap<String,String>();
	 map.put("1", "aa");
	 map.put("2", "bb");
	 map.put("3", "aa");
	 
	 map.remove("1");
	 
	 //必須轉換爲array,或者  String[] keySet = map.keySet().toArray(new String[0]);
	 Object[] keySet = map.keySet().toArray();
	 for (Object key : keySet) {
	   map.remove((String)key);
	 }  
	 System.out.println(map);
	 
	 // set僅僅一個實例,set刪除,map也跟隨刪除
	 Set<String> set = map.keySet();
	 set.remove("1");
	 System.out.println(set);
	 System.out.println(map);
 
	 // 採用 iterator方法刪除 map
	 for(Iterator<String> iterator = set.iterator();iterator.hasNext();)
     {
         iterator.next();
         iterator.remove();
     }
	 System.out.println(map);
	 
	 // 採用iterator方法獲取map信息
	 Set<Entry<String, String>> set0 = map.entrySet();
	 for(Iterator<Map.Entry<String, String>> iterator = set0.iterator();iterator.hasNext();){
		 Map.Entry<String, String> mm = iterator.next();
		 String key1 = mm.getKey();
		 String value = mm.getValue();
	 }
	  System.out.println(set0);
	 
	  // 採用list增加元素
	 HashMap<String,String> map1 = new HashMap<String,String>();
	 map1.put("1", "aa");
	 map1.put("2", "bb");
		
	 Set<String> set1 = map1.keySet();
	 List<String> ll = new ArrayList<String>();	 
	 for(String ss : set1){
		 ll.add(ss);
	 }	 
	 ll.add("cc");
	 System.out.println(ll);
	 System.out.println(map1);
}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章