本意是想删除记录中value小于 20的记录,且看代码
import java.util.*;public class TestHashMap { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
HashMap<String, Integer> staff = new HashMap<String, Integer>();
staff.put("qqq", 22);
staff.put("www", 20);
staff.put("aaa", 15);
staff.put("sss", 12);
System.out.println("Before:");
for ( Map.Entry<String, Integer> e : staff.entrySet()) {
System.out.print(" <" + e.getKey() + "--" + e.getValue() +"> ");
}
System.out.println(); for ( Map.Entry<String, Integer> e : staff.entrySet()) {
String str = e.getKey();
double value = staff.get(str);
if (value < 20) {
staff.remove(str);
}
}
System.out.println("After:");
for ( Map.Entry<String, Integer> e : staff.entrySet()) {
System.out.print(" <" + e.getKey() + "--" + e.getValue() +"> ");
} }}出现如下错误信息:
Before:
<qqq--22> <aaa--15> <sss--12> <www--20>
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:793)
at java.util.HashMap$EntryIterator.next(HashMap.java:834)
at java.util.HashMap$EntryIterator.next(HashMap.java:832)
at org.guet.collection.TestHashMap.main(TestHashMap.java:26) 而只删除其中一条记录 如<sss 12> 用staff.remove("sss");确实可以的。 这是为什么? 哪位大侠帮忙解释一下。谢谢!
import java.util.*;public class TestHashMap { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
HashMap<String, Integer> staff = new HashMap<String, Integer>();
staff.put("qqq", 22);
staff.put("www", 20);
staff.put("aaa", 15);
staff.put("sss", 12);
System.out.println("Before:");
for ( Map.Entry<String, Integer> e : staff.entrySet()) {
System.out.print(" <" + e.getKey() + "--" + e.getValue() +"> ");
}
System.out.println(); for ( Map.Entry<String, Integer> e : staff.entrySet()) {
String str = e.getKey();
double value = staff.get(str);
if (value < 20) {
staff.remove(str);
}
}
System.out.println("After:");
for ( Map.Entry<String, Integer> e : staff.entrySet()) {
System.out.print(" <" + e.getKey() + "--" + e.getValue() +"> ");
} }}出现如下错误信息:
Before:
<qqq--22> <aaa--15> <sss--12> <www--20>
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:793)
at java.util.HashMap$EntryIterator.next(HashMap.java:834)
at java.util.HashMap$EntryIterator.next(HashMap.java:832)
at org.guet.collection.TestHashMap.main(TestHashMap.java:26) 而只删除其中一条记录 如<sss 12> 用staff.remove("sss");确实可以的。 这是为什么? 哪位大侠帮忙解释一下。谢谢!
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;public class TestHashMap { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
HashMap<String, Integer> staff = new HashMap<String, Integer>();
// Map<String, Integer> staff = new ConcurrentHashMap<String, Integer>();
staff.put("qqq", 22);
staff.put("www", 20);
staff.put("aaa", 2);
staff.put("sss", 2);
System.out.println("Before:");
for ( Map.Entry<String, Integer> e : staff.entrySet()) {
System.out.print(" <" + e.getKey() + "--" + e.getValue() +"> ");
}
System.out.println();
Set<Map.Entry<String,Integer>> entrys = staff.entrySet();
for(Iterator i = entrys.iterator();i.hasNext();) {
Map.Entry entry = (Map.Entry)i.next();
if((Integer)entry.getValue()< 20) {
i.remove();
}
}
/**
* 另外一种方法
* */
/*Set<String> keys=staff.keySet();
List<String> l=new ArrayList<String>();
for(Iterator<String> it=keys.iterator();it.hasNext();){
String key=it.next();
if(staff.get(key)<20){
l.add(key);
}
}
for(String s:l){
staff.remove(s);
}*/
System.out.println("After:");
for ( Map.Entry<String, Integer> e : staff.entrySet()) {
System.out.print(" <" + e.getKey() + "--" + e.getValue() +"> ");
} }}