今天用到了map中keySet方法,出现了一个错误,记录下来。

出现错误原因:没有注意到map中keySet方法返回的是一个Set集合镜像,所以在修改该Set集合镜像时,map中所对应的键值对也会相应的被修改。

HashMap中keySet方法源码:

测试类:

 

[java] view plain copy
 
  1. import java.util.HashMap;  
  2. import java.util.Iterator;  
  3. import java.util.Map;  
  4. import java.util.Set;  
  5.   
  6. /** 
  7.  * map的keySet()方法 
  8.  * 
  9.  * @author feige 
  10.  */  
  11. public class RemoveSet {  
  12.   
  13.     public static void main(String[] args) {  
  14.         Map<Integer, String> testMap = new HashMap<Integer, String>();  
  15.         testMap.put(1, "一");  
  16.         testMap.put(2, "二");  
  17.         testMap.put(3, "三");  
  18.         testMap.put(4, "四");  
  19.         testMap.put(5, "五");  
  20.         Set<Integer> testKey = testMap.keySet();  
  21.         Iterator<Integer> it = testKey.iterator();  
  22.         System.out.println("移除前map的大小为:" + testMap.size());  
  23.         System.out.println("移除前的遍历");  
  24.         while (it.hasNext()) {  
  25.             Integer testInt = it.next();  
  26.             System.out.println(testInt);  
  27.             // 移除key为3的键  
  28.             if (testInt == 3) {  
  29.                 it.remove();  
  30.             }  
  31.         }  
  32.         System.out.println("移除了key为3的键");  
  33.         System.out.println("移除后map的大小为:" + testMap.size());  
  34.         System.out.println("移除后的遍历");  
  35.         it = testKey.iterator();  
  36.         while (it.hasNext()) {  
  37.             Integer testInt = it.next();  
  38.             System.out.println(testInt);  
  39.         }  
  40.     }  
  41. }  

测试结果为:

 

可见map中keySet方法返回的是map中key的镜像,对keySet方法返回的Set的修改就是对map中key的修改。