Set和HashMap

 

发现 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);
 }


附注 : 代码实例 

 

[java]  view plain copy
  1. package com.nan.an.jing;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.Iterator;  
  6. import java.util.List;  
  7. import java.util.Map;  
  8. import java.util.Map.Entry;  
  9. import java.util.Set;  
  10.   
  11. public class TestSet {  
  12.    public static void main(String[] args) {  
  13.      HashMap<String,String> map = new HashMap<String,String>();  
  14.      map.put("1""aa");  
  15.      map.put("2""bb");  
  16.      map.put("3""aa");  
  17.        
  18.      map.remove("1");  
  19.        
  20.      //必须转换为array,或者  String[] keySet = map.keySet().toArray(new String[0]);  
  21.      Object[] keySet = map.keySet().toArray();  
  22.      for (Object key : keySet) {  
  23.        map.remove((String)key);  
  24.      }    
  25.      System.out.println(map);  
  26.        
  27.      // set仅仅一个实例,set删除,map也跟随删除  
  28.      Set<String> set = map.keySet();  
  29.      set.remove("1");  
  30.      System.out.println(set);  
  31.      System.out.println(map);  
  32.    
  33.      // 采用 iterator方法删除 map  
  34.      for(Iterator<String> iterator = set.iterator();iterator.hasNext();)  
  35.      {  
  36.          iterator.next();  
  37.          iterator.remove();  
  38.      }  
  39.      System.out.println(map);  
  40.        
  41.      // 采用iterator方法获取map信息  
  42.      Set<Entry<String, String>> set0 = map.entrySet();  
  43.      for(Iterator<Map.Entry<String, String>> iterator = set0.iterator();iterator.hasNext();){  
  44.          Map.Entry<String, String> mm = iterator.next();  
  45.          String key1 = mm.getKey();  
  46.          String value = mm.getValue();  
  47.      }  
  48.       System.out.println(set0);  
  49.        
  50.       // 采用list增加元素  
  51.      HashMap<String,String> map1 = new HashMap<String,String>();  
  52.      map1.put("1""aa");  
  53.      map1.put("2""bb");  
  54.           
  55.      Set<String> set1 = map1.keySet();  
  56.      List<String> ll = new ArrayList<String>();    
  57.      for(String ss : set1){  
  58.          ll.add(ss);  
  59.      }     
  60.      ll.add("cc");  
  61.      System.out.println(ll);  
  62.      System.out.println(map1);  
  63. }  
  64. }  

http://www.360doc.com/relevant/117933138_more.shtml

转载自:http://blog.csdn.net/qingchun1987_303/article/details/7243973

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值