Map的循环遍历,修改,删除

预制数据

        Map map = new HashMap<>();
        map.put("aaa","123");
        map.put("bbb","123");
        map.put("CCC","123");

只循环key ---> map.keyset()

for (String key : map.keySet()) {
   System.out.println(key);
}

print:
aaa
CCC
bbb

只循环value ---> map.values()

for (String value : map.values()){
    System.out.println(value);
}

print:
123
123
123

同时循环 key 和 value  --->  map.entrySet()   

for (Map.Entry entry : map.entrySet()) {
    String key = entry.getKey();
    String value = entry.getValue();
    System.out.println(key + " : " + value);
}

print : 循环的数据其实和插入的顺序是不一样的
aaa : 123
CCC : 123
bbb : 123

同时循环 key 和 value  --->  迭代器 iterator

Iterator> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
    Map.Entry next = iterator.next();
    String key = next.getKey();
    String value = next.getValue();
    System.out.println(key + " : " + value);
}

print:
aaa : 123
CCC : 123
bbb : 123

注意 : iterator.hasNext()用于while循环条件,判断是否还有下一个值,而iterator.next() 是调用下一个值(每次调用都会获取下一个值!),因此在每个循环里,如果需要同时获取key和value,需要先把iterator.next()作为临时变量存起来,不能同时调用两次iterator.next():

while (iterator.hasNext()) {
    String key = iterator.next().getKey(); // 每个循环获取两次next
    String value = iterator.next().getValue(); // 只有三个值,因此第二次循环,这里报错
    System.out.println(key + " : " + value);
}

print
aaa : 123
Exception in thread "main" java.util.NoSuchElementException
	at java.util.HashMap$HashIterator.nextNode(HashMap.java:1447)
	at java.util.HashMap$EntryIterator.next(HashMap.java:1479)
	at java.util.HashMap$EntryIterator.next(HashMap.java:1477)
	at testMapRemoveAdd.main(testMapRemoveAdd.java:40)

map中数据的删除

1、keySet 或者是 entrySet 都不能删除数据

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

Exception in thread "main" java.util.ConcurrentModificationException
	at java.util.HashMap$HashIterator.nextNode(HashMap.java:1445)
	at java.util.HashMap$KeyIterator.next(HashMap.java:1469)
	at testMapRemoveAdd.main(testMapRemoveAdd.java:15)
        for (Map.Entry enrty : map.entrySet()) {
            if (enrty.getKey().equals("CCC")) {
                map.remove(enrty.getKey());
            }
        }
        System.out.println(map);

Exception in thread "main" java.util.ConcurrentModificationException
	at java.util.HashMap$HashIterator.nextNode(HashMap.java:1445)
	at java.util.HashMap$EntryIterator.next(HashMap.java:1479)
	at java.util.HashMap$EntryIterator.next(HashMap.java:1477)
	at testMapRemoveAdd.main(testMapRemoveAdd.java:15)

发生 ConcurrentModificationException 的原因:

简单查看源码可以得知,在对map进行操作时(put、remove等)都会  ++modCount 操作,因此在循环过程中,由于删除导致modCount变化,导致和expectedModCount预期结果不一致,就会抛出异常。

Map的循环遍历,修改,删除_第1张图片

 

map中删除数据的正确操作:

1、调用iterator迭代器进行删除

Iterator> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
    if (iterator.next().getKey().equals("CCC")) {
        iterator.remove();
    }
}
System.out.println(map);

print:
{aaa=123, bbb=123}

2、使用java8中的removeif删除

map.keySet().removeIf(key -> key.equals("CCC"));

map.values().removeIf(value -> value.equals("123"));

map中修改key的方法:

我们知道,map中如果想要修改value,那么重要执行put方法就可以了,那么如果想要修改key的值怎么办?map其实是不支持key的修改的,因此只能new一个map,循环过程中将想要修改的KV加进去,删除旧的KV,最后在将新的KV赋值进去。

Map map1 = new HashMap<>();
Iterator> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
    Map.Entry next = iterator.next();
    if (next.getKey().equals("CCC")) {
        map1.put("ccc", next.getValue());
        iterator.remove();
    }
}
map.putAll(map1);
System.out.println(map); // {aaa=123, ccc=123, bbb=123}

你可能感兴趣的:(Java基础,java,jvm,servlet)