java hashmap keyset_发现Set<String> set = hashMap.keySet()的奥秘

发现 Set和HashMap之间还是有很多需要注意的地方:

HashMap map = new HashMap();

map.put("1", "aa");

map.put("2", "bb");

map.put("3", "aa");

Set set = map.keySet();

1.  map的keySet()方法只返回一个set实例,所以当从key1中删除一个对象时候,其他也将会受到影响。

2.  针对于 set不能进行 add操作 ,否则会报“java.lang.UnsupportedOperationException” 。原因 如下 :

public Set keySet()返回此映射中所包含的键的 set 视图。该集合受映射的支持,所以映射的变化也反映在该集合中,反之亦然。该集合支持元素的移除,通过          Iterator.remove、Set.remove、removeAll、retainAll

和 clear 操作,从该映射中移除相应的映射关系。它不支持 add 或 addAll 操作。

3.

Set 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 map = new HashMap();

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 set = map.keySet();

set.remove("1");

System.out.println(set);

System.out.println(map);

// 采用 iterator方法删除 map

for(Iterator iterator = set.iterator();iterator.hasNext();)

{

iterator.next();

iterator.remove();

}

System.out.println(map);

// 采用iterator方法获取map信息

Set> set0 = map.entrySet();

for(Iterator> iterator = set0.iterator();iterator.hasNext();){

Map.Entry mm = iterator.next();

String key1 = mm.getKey();

String value = mm.getValue();

}

System.out.println(set0);

// 采用list增加元素

HashMap map1 = new HashMap();

map1.put("1", "aa");

map1.put("2", "bb");

Set set1 = map1.keySet();

List ll = new ArrayList();

for(String ss : set1){

ll.add(ss);

}

ll.add("cc");

System.out.println(ll);

System.out.println(map1);

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值