我是靠谱客的博主 动听豌豆,最近开发中收集的这篇文章主要介绍Map遍历(for、for-each、Iterator、Collection.forEach()、stream流),觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
几种Map遍历操作
private void mapTraversal(){
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < 6; i++) {
map.put(i,-i);
}
// 1、在for-each循环中遍历keys或values
for (Integer key : map.keySet()){
// 效率低
int value = map.get(key);
System.out.println(key + " : " + value);
}
// 0 : 0
// 1 : -1
// 2 : -2
// 3 : -3
// 4 : -4
// 5 : -5
for (Integer value:map.values()){
System.out.println("value="+value);
}
// 2、在for-each循环中使用entries来遍历
System.out.println("2、在for-each循环中使用entries来遍历:");
for(Map.Entry<Integer, Integer> entry : map.entrySet()){
int key = entry.getKey();
int value = entry.getValue();
System.out.println(key + " : " + value);
//map.remove(entry.getKey());//报错:ConcurrentModificationException
}
// 3、使用迭代器Iterator
System.out.println("3、使用迭代器Iterator:");
Iterator<Map.Entry<Integer, Integer>> iterator = map.entrySet().iterator();
while (iterator.hasNext()){
Map.Entry<Integer, Integer> entry = iterator.next();
int key = entry.getKey();
int value = entry.getValue();
// iterator.remove();
System.out.println(key + " : " + value);
}
// 4、不用泛型Iterator
System.out.println("4、不用泛型Iterator:");
Iterator iterator1 = map.entrySet().iterator();
while (iterator1.hasNext()){
Map.Entry entry = (Map.Entry)iterator1.next();
int key = (int)entry.getKey();
int value = (int)entry.getValue();
System.out.println(key + " : " + value);
}
// 5、 Collection.forEach()
System.out.println("Collection.forEach():");
map.forEach((key, value) -> System.out.println(key + " : " + value));
// Collection.forEach():
// 0 : 0
// 1 : -1
// 2 : -2
// 3 : -3
// 4 : -4
// 5 : -5
// 6、 stream流操作
System.out.println("stream流操作:");
map.entrySet().stream()
.filter(entry -> entry.getKey() == 5)
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))
.forEach((key, value) -> System.out.println(key + " : " + value));
// stream流操作:
// 5 : -5
}
补充说明:
- 我们使用的增强for循环,其实是Java提供的语法糖,其实现原理是借助Iterator进行元素的遍历。但是如果在遍历过程中,不通过Iterator,而是通过集合类自身的方法对集合进行添加/删除操作。那么在Iterator进行下一次的遍历时,经检测发现有一次集合的修改操作并未通过自身进行,那么可能是发生了并发被其他线程执行的,这时候就会抛出异常,来提示用户可能发生了并发修改,这就是所谓的fail-fast机制。
有很多种方法可以解决这类问题的。比如使用普通for循环、使用Iterator进行元素删除、使用Stream的filter、使用fail-safe的类等。
参考:https://www.cnblogs.com/baiqiantao/p/11260519.html
- stream流操作参考>:
https://juejin.im/post/5cc124a95188252d891d00f2#heading-7>
- 其他参考
https://blog.csdn.net/tjcyjd/article/details/11111401
https://www.jianshu.com/p/186bf11ffe51
最后
以上就是动听豌豆为你收集整理的Map遍历(for、for-each、Iterator、Collection.forEach()、stream流)的全部内容,希望文章能够帮你解决Map遍历(for、for-each、Iterator、Collection.forEach()、stream流)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复