预制数据
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、调用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}