这 11 个 for 循环优化你得会

简介: 这 11 个 for 循环优化你得会

日常开发中,经常会遇到一些循环耗时计算的操作,一般也都会采用 for 循环来处理,for 作为编程入门基础,主要是处理重复的计算操作,虽然简单好用,但在写法上也有很多的考究,如果处理不好,可能成为拖垮程序的罪魁祸首,下面总结 10 多条 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的作用域不够小,违反了最小作用域原则
  2. 不能在for循环中操作list的大小,比如除去或新加一个元素

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

for (int i = 0, n = list.size(); i < n; i++) {

   System.out.println(list.get(i));

}

  • 优点:不必每次都计算 ,变量的作用域遵循最小范围原则
  • 缺点:
  1. m的作用域不够小,违反了最小作用域原则
  2. 不能在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);

}

  • 优点:简洁结合泛型使用更简洁
  • 缺点:
  1. jdk1.4向下不兼容
  2. 无法直接拿到索引

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

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) {

}

不过这种写法也不是绝对,需要考虑循环过程中如果出现异常是否要中止流程,如果不需要中止循环,就需要将异常处理放在循环体内,用来捕获单次循环出现的异常,避免因为单词异常导致整个for循环后续中止

方式十:倒序删除

如果不使用迭代器遍历删除时,可以采用倒叙的方式遍历删除元素,避免因为索引变化导致异常

for (int i = list.size()-1; i >= 0; i--) {

   // 循环体

   list.remove(i);

}

优化后的代码:

for (int i = list.size()-1; i >= 0; i--) {

   // 循环体

   list.remove(i);

}

方式十一:减少方法调用

在循环体内部尽可能减少方法的调用,可以避免重复的方法调用开销。对于频繁调用的方法,可以将结果缓存起来。

int size = list.size();

for (int i = 0; i < size; i++) {

   // 频繁调用的方法

   // 这部分调用和当前的循环没有直接性关系,就可以不放在循环体内

   int result = calculateResult();

   // 循环体

}

优化后的代码:

int size = list.size();

int result = calculateResult();

for (int i = 0; i < size; i++) {

   // 使用缓存的结果

   // 循环体

}

以上是一些常见的for循环,很多都是一些不起眼的小细节,改或不改都不会影响代码的正常执行,但用户多了之后,众多小问题累积起来可能就影响到整个系统的运行,所以,需要在日常开发中多注意这些小细节,避免日后再来还技术债...

相关文章
|
1月前
|
JavaScript 前端开发 Java
for 循环学习
【10月更文挑战第4天】
70 5
|
2月前
|
并行计算 算法 编译器
使用 prange 实现 for 循环的并行
使用 prange 实现 for 循环的并行
44 1
使用 prange 实现 for 循环的并行
|
5月前
|
C语言
循环迭代判断\丢番图
循环迭代判断\丢番图
27 2
|
Java
常见的for循环优化方式
经常使用一些循环,进行耗时计算的操作,特别是 for 循环,它是一种重复计算的操作,如果处理不好,耗时就比较大,如果处理书写得当,将大大提高效率,下面总结几条 for 循环的常见优化方式。
122 0
|
6月前
|
测试技术
循环复杂度
循环复杂度
37 0
|
6月前
while循环和do while循环有什么区别
while循环和do while循环有什么区别
80 0
|
存储 算法 数据处理
for 循环嵌套 for 循环,你需要懂的代码性能优化技巧!
本篇分析的技巧点其实是比较常见的,但是最近的几次的代码评审还是发现有不少兄弟没注意到。 所以还是想拿出来说下。
233 4
while循环和do while循环有什么区别?
while循环和do while循环有什么区别?
139 0
|
存储 算法 C++
计算1到n的和(不用循环且逐步限制条件)
注:满足题目要求的解法有递归实现的第三种、公式实现、C++调用构造函数累加法三种方法、
66 0
|
Web App开发 测试技术
优化循环的方法-循环展开
优化循环的方法-循环展开
93 0