⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 blog.csdn.net/csdn_aiyang/article/details/75162134 「艾阳Blog」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

前言

我们都经常使用一些循环耗时计算的操作,特别是for循环,它是一种重复计算的操作,如果处理不好,耗时就比较大,如果处理书写得当将大大提高效率,下面总结几条for循环的常见优化方式。

首先,我们初始化一个集合 list,如下:

List<String> list = new ArrayList<String>();

方法一:最常规的不加思考的写法

for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}

  • 优点:较常见,易于理解
  • 缺点:每次都要计算list.size()

方法二:数组长度提取出来

int m = list.size();
for (int i = 0; i < m; i++) {
System.out.println(list.get(i));
}

  • 优点:不必每次都计算

  • 缺点:

    1. m的作用域不够小,违反了最小作用域原则
  1. 不能在for循环中操作list的大小,比如除去或新加一个元素

方法三:数组长度提取出来

for (int i = 0, n = list.size(); i < n; i++) {
System.out.println(list.get(i));
}

  • 优点:不必每次都计算 ,变量的作用域遵循最小范围原则

  • 缺点:

    1. m的作用域不够小,违反了最小作用域原则
  1. 不能在for循环中操作list的大小,比如除去或新加一个元素

方法四:采用倒序的写法

for (int i = list.size() - 1; i >= 0; i--) {
System.out.println(list.get(i));
}

  • 优点:不必每次都计算 ,变量的作用域遵循最小范围原则
  • 缺点:1、结果的顺序会反 2、看起来不习惯,不易读懂
  • 适用场合:与显示结果顺序无关的地方:比如保存之前数据的校验

方法五:Iterator 遍历

for (Iterator<String> it = list.iterator(); it.hasNext();) {
System.out.println(it.next());
}

  • 优点:简洁

方法六:jdk1.5后的写法

for (Object o : list) {
System.out.println(o);
}

  • 优点:简洁结合泛型使用更简洁
  • 缺点:jdk1.4向下不兼容

方法七:循环嵌套外小内大原则

for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10000; j++) {
}
}

原因

图片图片

方法八:循环嵌套提取不需要循环的逻辑

 //前:
int a = 10, b = 11;
for (int i = 0; i < 10; i++) {
i = i * a * b;
}


//后:
int c = a * b;
for (int i = 0; i < 10; i++) {
i = i * c;
}

方法九:异常处理写在循环外面

反例

for (int i = 0; i < 10; i++) {
try {

} catch (Exception e) {

}
}

正例

try {
for (int i = 0; i < 10; i++) {
}
} catch (Exception e) {

}

文章目录
  1. 1. 前言
  2. 2. 方法一:最常规的不加思考的写法
  3. 3. 方法二:数组长度提取出来
  4. 4. 方法三:数组长度提取出来
  5. 5. 方法四:采用倒序的写法
  6. 6. 方法五:Iterator 遍历
  7. 7. 方法六:jdk1.5后的写法
  8. 8. 方法七:循环嵌套外小内大原则
  9. 9. 方法八:循环嵌套提取不需要循环的逻辑
  10. 10. 方法九:异常处理写在循环外面