关于Map表循环过程删除操作出现的java.util.ConcurrentModificationException 异常

使用Iterate

List list = new ArrayList();
list.add("a");list.add("b");list.add("c");

//for结构 自动生成
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
String s = (String) iterator.next();
if(s.equals("b")){
iterator.remove();
}
}

System.out.println(list.size());



以下代码会抛出异常
package tristan;

import java.util.HashMap;
import java.util.Map;

public class Test {

public static void main(String[] args) {
Map<String,String> map = new HashMap<String, String>();
map.put("1", "a1");
map.put("2", "a2");
map.put("3", "a3");
map.put("4", "a4");
map.put("5", "a5");

for(String key : map.keySet()){
if("a2".equals(map.get(key))){
map.remove(key);
}
}
System.out.println(map.size());
}
}



应该深拷贝一个tmpMap,在迭代的过程中,对tmpMap进行remove操作
之后将map 赋值为 tmpMap.
package tristan;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.HashMap;
import java.util.Map;

public class Test {

public static void main(String[] args) throws Exception {
Map<String,String> map = new HashMap<String, String>();
map.put("1", "a1");
map.put("2", "a2");
map.put("3", "a3");
map.put("4", "a4");
map.put("5", "a5");

Map<String,String> tmpMap = (Map<String, String>) clone(map);

for(String key : map.keySet()){
if("a2".equals(map.get(key))){
tmpMap.remove(key);
}
}

map = tmpMap;

System.out.println(map.size());
}

public static Object clone(Object obj) throws Exception {
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
ObjectOutputStream outStream = new ObjectOutputStream(byteOut);
outStream.writeObject(obj);
ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
ObjectInputStream inStream = new ObjectInputStream(byteIn);
return inStream.readObject();
}
}



但是这种写法可能有未知的问题, 就像四国中 灭掉一家时出现的问题一样。
最好是用下列方法
package tristan;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Test {

public static void main(String[] args) throws Exception {
Map<String,String> map = new HashMap<String, String>();
map.put("1", "a1");
map.put("2", "a2");
map.put("3", "a3");
map.put("4", "a4");
map.put("5", "a5");

List<String> delList = new ArrayList<String>();

for(String key : map.keySet()){
if("a2".equals(map.get(key))){
delList.add(key);
}
}

for(String key : delList){
map.remove(key);
}

System.out.println(map.size());
}

}



谢谢latent同学的建议,最好还是采用Iterate来做,List Set也适用


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

public class Test {
public static void main(String[] args) throws Exception {
testMap();
}

public static void testSet() {
Set<String> set = new HashSet<String>();
set.add("a1");
set.add("a2");
set.add("a3");
set.add("a4");
set.add("a5");

Iterator<String> it = set.iterator();
while (it.hasNext()) {
String v = it.next();
if ("a2".equals(v)) {
it.remove();
}
}

for (String v : set) {
System.out.println(v);
}
}

public static void testList() {
List<String> list = new ArrayList<String>();
list.add("a1");
list.add("a2");
list.add("a3");
list.add("a4");
list.add("a5");

Iterator<String> it = list.iterator();
while (it.hasNext()) {
String v = it.next();
if ("a2".equals(v)) {
it.remove();
}
}

for (String v : list) {
System.out.println(v);
}
}

public static void testMap() {
Map<String, String> map = new HashMap<String, String>();
map.put("1", "a1");
map.put("2", "a2");
map.put("3", "a3");
map.put("4", "a4");
map.put("5", "a5");

/* Set<Entry<String, String>> set = map.entrySet();
Iterator<Entry<String, String>> it = set.iterator();
while (it.hasNext()) {
String v = it.next().getValue();
if (v.equals("a2")) {
it.remove();
}
} */

Set<String> set = map.keySet();
Iterator<String> it = set.iterator();
while (it.hasNext()) {
String k = it.next();
if (map.get(k).equals("a2")) {
it.remove();
}
}

for (Map.Entry<String, String> e : map.entrySet()) {
System.out.println(e.getValue());
}

}
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值