0
点赞
收藏
分享

微信扫一扫

关于 Java for 循环执行顺序一个要注意的地方


Java 基础,这里记录一下。

平时开发中 ​​for​​​ 循环使用的非常多,我们都知道 ​​for​​ 循环的顺序如下:

// exp2 为条件表达式
for(exp1;exp2;exp4){
exp3;
}

  • 先执行 ​​exp1​​​,再执行 ​​exp2​​​,如果返回 ​​true​​​,则执行 ​​exp3​​​,最后再执行 ​​exp4​​​,然后再到 ​​exp2​​;
  • 如果执行 ​​exp2​​​ 为 ​​false​​,则会跳出循环体;

接下来看一个插入排序的例子,实现方式如下:

package dongguabai.algorithm;

import java.util.stream.Stream;

/**
* @author Dongguabai
* @Description
* @Date 创建于 2021-01-06 16:54
*/
public class SortDemo {

public static void main(String[] args) {
Integer[] arr = {2, 1, 5, 3, 8, 6, 4, 5, 0, 9, 1};
insertSort1(arr);
System.out.println("正确顺序:\n0 1 1 2 3 4 5 5 6 8 9 ");
Stream.of(arr).forEach(a -> System.out.print(a + " "));

System.out.println("\n=============");
Integer[] arr2 = {2, 1, 5, 3, 8, 6, 4, 5, 0, 9, 1};
insertSort2(arr2);
System.out.println("正确顺序:\n0 1 1 2 3 4 5 5 6 8 9 ");
Stream.of(arr2).forEach(a -> System.out.print(a + " "));
}

private static void insertSort1(Integer[] arr) {
for (int i = 1; i < arr.length; i++) {
int t = arr[i];
int j;
for (j = i; j >= 1 && t < arr[j - 1]; j--) {
arr[j] = arr[j - 1];
}
arr[j] = t;
}
}

private static void insertSort2(Integer[] arr) {
for (int i = 1; i < arr.length; i++) {
int t = arr[i];
int j;
for (j = i; j >= 1; j--) {
if (t < arr[j - 1]) {
arr[j] = arr[j - 1];
}
}
arr[j] = t;

}
}
}

输出结果:

正确顺序:
0 1 1 2 3 4 5 5 6 8 9
0 1 1 2 3 4 5 5 6 8 9
=============
正确顺序:
0 1 1 2 3 4 5 5 6 8 9
1 9 5 6 6 8 5 8 8 8 9

会发现 ​​insertSort2​​​ 方法的排序是错误的,粗略看 ​​insertSort1​​​ 和 ​​insertSort2​​​ 方法效果应该是一样的,但是在第二层 ​​for​​​ 循环中,​​insertSort1​​​ 方法进入循环体的次数是少于 ​​insertSort2​​​ 的,也就是说 ​​insertSort1​​​ 方法执行 ​​j--​​​ 的次数与 ​​insertSort2​​ 是不一样的,导致两个方法最终赋值会有差异,即排序结果不同。


举报

相关推荐

0 条评论