HashMap遍历删除元素

前言:今天要做一个功能,设计到map的删除工作。于是我按照常规的方法去就去遍历, 但是报错,百度才知道集合删除,需要迭代。

错误的做法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class Test {
public static void main(String[] args) {
HashMap<String,String> detailmap = new HashMap<String, String>();
detailmap.put("CONTACT_TASK_TITLE", "代理商外呼");
detailmap.put("TAG_01", "甩单编号");
detailmap.put("TAG_02", "订单编号");
detailmap.put("TAG_03", "退单人员联系方式");
detailmap.put("TAG_04", "退单来源系统");
HashMap<String,String> dimmap = new HashMap<String, String>();
dimmap.put("TAG_01", "REJECTION_CODE");
dimmap.put("TAG_02", "ORDER_NUM");
dimmap.put("TAG_03", "REJECT_USER_PHONE");
HashMap<String,String> resultMap = new HashMap<String, String>();
for (String key : detailmap.keySet()) {
if("TAG_01".equals(key)){
detailmap.remove(key);//注意看这里
}
}
System.out.println(resultMap.toString());
}
}

报错的信息是:

1
2
3
4
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextNode(HashMap.java:1437)
at java.util.HashMap$KeyIterator.next(HashMap.java:1461)
at com.ideal.ims.agentConsumer.service.impl.Test.main(Test.java:26)

正确的做法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public static void main(String[] args) {
// getPreMonthTimeZones();
Map<String, String> map = new HashMap<>();
map.put("1", "one");
map.put("2", "two");
map.put("3", "three");
//****需要迭代*****
Set<Entry<String,String>> entrySet = map.entrySet();
Iterator<Entry<String, String>> iterator = entrySet.iterator();
while(iterator.hasNext()) {
Entry<String, String> next = iterator.next();
String key = next.getKey();
if("2".equals(key)) {
iterator.remove();//但是迭代没有put方法
}
}
System.out.println(map.toString());
}

为什么需要迭代来删除:

  • HashMap 类映射不保证顺序;某些映射可明确保证其顺序: TreeMap 类

    示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    HashMap<String,String> detailmap = new HashMap<String, String>();
    detailmap.put("CONTACT_TASK_TITLE", "代理商外呼");
    detailmap.put("TAG_01", "甩单编号");
    detailmap.put("TAG_02", "订单编号");
    detailmap.put("TAG_03", "退单人员联系方式");
    detailmap.put("TAG_04", "退单来源系统");
    System.out.println(detailmap.toString());
    //输出的结果是:
    {TAG_03=退单人员联系方式, TAG_04=退单来源系统, CONTACT_TASK_TITLE=代理商外呼, TAG_01=甩单编号, TAG_02=订单编号}
  • 在遍历Map过程中,不能用map.put(key,newVal),map.remove(key)来修改和删除元素, 会引发 并发修改异常,可以通过迭代器的remove(): 从迭代器指向的 collection 中移除当前迭代元素
坚持原创技术分享,您的支持将鼓励我继续创作!

分享
Fork me on GitHub