仅仅是个人使用for 循环的经历 不完整的话请见谅
for (int i = 0; i < 10; i++)
这个是最早接触的for循环 在初学的时候也使用了很长时间 平常测试也会用到
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
list.add(i);
}
for (int i = 0; i < list.size(); i++) {
Integer integer = list.get(i);
System.out.println(integer);
}
最大的特定是需要我们手动去通过下标进行值的获取
使用场景
1、当我需要通过不同的下标去做不同操作
的时候这个是比较合适的一种方式
2、当我需要进行倒循环
的时候 也可以直接使用
快捷方式(IDEA)
list.forr
这个就是倒序循环
for (int i = list.size() - 1; i >= 0; i--) {
Integer integer = list.get(i);
System.out.println(integer);
}
优点和缺点是并存的 我们可以更灵活的操作下标数据 同时也增加相应的操作
能满足绝大多数情境下的循环要求 对于初学者比较友好
还有就是这种形式对于映射集合不太友好 map
的循环就不会去使用for (int i = 0; i < 10; i++) 这种形式
for (Integer integer : list)
这个我喜欢说是 for 循环的简易版增强版
首先这个减少我们手动的get(index)
的操作
结构就是 for(类型(也就是List<泛型>) 值 :集合)
for (Integer integer : list) {
System.out.println(integer);
}
使用场景
1、这个基本能覆盖大部分的集合操作 就是 上一个 的简化版。但是 进行倒序循环的时候就没那么便捷
2、不需要去操作下标的时候
可以优先选择 减少我们的代码操作 少一行算一行
3、在需要对Map
形式的集合进行遍历的时候也相对友好一点
3.1 多说一点Map的循环吧这个很容易忘记 相对于List这个会比较长一点
1、分别拿key和value
for(String key : map.keySet()){
System.out.println("key="+key);
}
for(String value:map.values()){
System.out.println("value="+value);
}
2、拿取key 和 value
for (Map.Entry<String, Object> entry : map.entrySet()) {
System.out.println("key="+entry.getKey()+" value="+entry.getValue());
}
3、通过value 拿取 Key
for(String key: map.keySet()){
String mapName = map.get(key);
if(mapName.indexOf(name)>=0){
c = key;
return c;
}
}
这种相对来说还是有点烦的 长时间不用就会忘记 可能我记忆不行
小总结
以上两种for 循环其实差不多 各有好处 只是不同的使用场景发挥不同的作用 共同点是
for循环里面,想要提前结束(终止)循环体使用"break"
;
结束本轮循环,进行下一轮循环使用"continue"
;
另外,在普通for里,如果使用"return",不仅强制结束for循环体,还会提前结束包含这个循环体的整个方法。
forEach()
这个真的又爱又烦
上一个循环在进行Map 循环的时候不好记 forEach
就是记忆力差的救星
HashMap<Integer, Integer> map = new HashMap<>();
map.put(1, 2);
// 这里的 Key,value 可以随意命名
map.forEach((key, value) -> {
System.out.println(key + "" + value);
});
真的超喜欢这个
普通集合
list.forEach(item -> System.out.println(item));
也是很方便 包括一些对象的操作 都可以简化操作
List<dicDataVo> dicDataVos = new ArrayList<>();
dicDataVo dicData = new dicDataVo();
dicData.setLabel("测试");
dicDataVos.add(dicData);
dicDataVos.forEach(dic -> dic.setLabel("hhhh"));
dicDataVos.forEach(item -> System.out.println(item));
BUT!!!!!
这个有几个比较烦的点
1、不能直接给外部参数赋值
转换成AtomicXXX
应该是为了安全考虑
AtomicInteger i = new AtomicInteger();
list.forEach(item -> {
i.set(2);
});
2、结束循环不太优美
以上两个循环可以通过 break(推荐)
和 return
结束循环 但是forEach
不支持通过break
结束循环
return
也改变含义 只能跳过当前循环但是不能停止
那么怎么结束循环呢
进行异常跑抛出 通过异常进行停止
如果不用try { }catch (Exception e){ }
进行捕获 就等于”自杀“
所以在终止方面 不是很舒服 但是依然是一个很便捷的循环方式
总结
每个循环各有优点 还是根据个人业务和习惯进行使用