今天在学习HashMap源码的时候,看到人家写的for循环里用的是++i,但是自己对代码的逻辑理解觉得应该是i++,平时写for循环也都是i++,于是就上网查了下for循环里的++i和i++的区别,有人说这两个在for循环里执行是一样的,于是抱着将信将疑的态度自己动手写了个for循环输出了下试试,结果果然是一样的。后来就接着上网查这两种写法的区别,找了几篇文章总结如下:
参考文章:
https://blog.csdn.net/github_37847975/article/details/77369851
https://blog.csdn.net/zy1691/article/details/4849808
首先我们应该都知道++i与i++的区别是: ++i 是先执行 i=i+1 再使用 i 的值,而 i++ 是先使用 i 的值再执行 i=i+1;
然后我们也知道for循环的执行顺序如下:
for(A;B;C) { D; }
1.进入循环执行A;//只是进入的时候执行.
2.执行B;//条件为真才执行D,不然就跳出for了.
3.执行D;
4.执行C;
5.再回到第2步开始执行
接着看下面的实例:
1.for(int i=0; i<10; i++)
for(int i = 0; i<10; i++) { System.out.println(i); }
相当于:
for(int i=0; i<10;) { System.out.println(i); i++; }
2.for(int i=0; i<10; ++i)
for(int i = 0; i<10; ++i) { System.out.println(i); }
相当于:
for(int i=0; i<10;) { System.out.println(i); ++i; }
在上述的循环体中,i++ 和 ++i 的作用是一样的。
然而到这步我们也只是知道了作用效果是一样,但是他们肯定是有一定区别的,得出的结果是:
i++由于是在使用当前值之后再+1,所以会需要一个临时变量来转储,而++则直接+1,不存在这样的问题,也就是说i++语句是需要一个临时变量取存储返回自增前的值,而++i不需要。
对于两者的执行效率,接着往下看,网上有两种结果:
一种结论是执行相同的次数,++i的效率要优于i++的效率;
另一种结论是在没有编译器优化的情况下,++i更好。优化过后两者都一样,看起来似乎喜欢怎样写都无所谓了。 但是如果这里的i不是int而是迭代器,那么++在前和在后就会有所不同,使用++i将会有切实的更高的效率。虽然int情况下没多少区别,但为了语法上的统一,最好一律改用++i这种形式。 所以,建议在这种地方一律改用++i的形式。
对于以上的结论,总之改用++i的形式就得了。
于是本人也做了个例子:
执行100次的时候:
int c = 0; long st = System.nanoTime(); for (int i = 0; i < 100; i++) { c = c + i; } long et = System.nanoTime(); System.out.println("c=" + c); System.out.println("times:" + (et - st)); 结果: c=4950 times:1614 ------------------------------------------- 改成++i: int c = 0; long st = System.nanoTime(); for (int i = 0; i < 100; ++i) { c = c + i; } long et = System.nanoTime(); System.out.println("c=" + c); System.out.println("times:" + (et - st)); 结果: c=4950 times:1520
执行1000次的时候:
int c = 0; long st = System.nanoTime(); for (int i = 0; i < 1000; i++) { c = c + i; } long et = System.nanoTime(); System.out.println("c=" + c); System.out.println("times:" + (et - st)); 结果: c=499500 times:12399 ---------------------------------------------------- int c = 0; long st = System.nanoTime(); for (int i = 0; i < 1000; ++i) { c = c + i; } long et = System.nanoTime(); System.out.println("c=" + c); System.out.println("times:" + (et - st)); 结果: c=499500 times:11135
执行10000次的时候:
int c = 0; long st = System.nanoTime(); for (int i = 0; i < 10000; i++) { c = c + i; } long et = System.nanoTime(); System.out.println("c=" + c); System.out.println("times:" + (et - st)); 结果: c=49995000 times:117984 -------------------------------------- int c = 0; long st = System.nanoTime(); for (int i = 0; i < 10000; ++i) { c = c + i; } long et = System.nanoTime(); System.out.println("c=" + c); System.out.println("times:" + (et - st)); 结果: c=49995000 times:117968
结论:注意本人测试的时间都是纳秒(因为毫秒结果输入是0),而且比较的结果几乎没有影响,所以在此本人认为这两者的效率我更赞同结论二,在int情况下是没有什么区别的,但还是建议改用++i的形式。
相关推荐
本文将详细讲解Java中的for循环及其与其他循环的比较。 **一、For循环语句** 1. **语法**: ```java for (初始化; 条件; 更新) { // 循环体 } ``` 这里,初始化通常设置循环变量的初始值,条件是控制循环...
通过深入学习和实践这份"JAVA学习笔记"中的内容,初学者不仅可以掌握Java编程的基础,还能进一步了解高级特性和最佳实践,从而成为一名熟练的Java开发者。这份笔记的实用性确保了学习过程的高效性和趣味性,让学习...
Java中的For循环是编程语言中最基础且常用的控制流结构之一,尤其在处理迭代或重复任务时,它的灵活性和效率使其成为...确保下载并查看压缩包中的“javafor”文件,这可能是教程的详细笔记、示例代码或其他辅助材料。
它包括变量声明、数据类型(如整型、浮点型、字符型、布尔型等)、运算符(算术、关系、逻辑、位等)、流程控制(如if语句、switch语句、for循环、while循环等)。 2. **类与对象**:Java是面向对象的语言,类是...
5. **控制结构**:包括条件语句(if、if-else、switch)和循环语句(for、while、do-while)。这些结构允许程序根据特定条件执行不同的代码块或重复执行某段代码。 6. **数组**:数组是相同类型数据的集合,可以...
在Java中,声明变量、赋值、控制流(如if语句、for循环和while循环)以及函数的使用都是基础语法的一部分。 接着,深入学习面向对象编程(OOP)原理。封装、继承、多态是OOP的三大特性。封装确保数据的安全,继承...
1. **语法基础**:了解Java的基本语法,包括变量、数据类型、运算符、控制流(如if语句、for循环、while循环)以及方法的定义与调用。 2. **类与对象**:深入理解面向对象编程的基础,包括类的定义、对象的创建、...
Java提供了多种控制流语句,如if-else、switch-case、for循环、while循环等。 #### 5. 数组 数组是存储相同类型元素的有序集合。Java支持一维数组和多维数组。 - **声明数组**:指定数组的类型和名称。 - **创建...
- for循环:初始化、条件判断、迭代三部分构成。 #### 四、数组和字符串处理 - **数组** - 数组是用来存储相同类型元素的一种数据结构。 - 数组的长度固定,在创建时确定。 - 数组元素可以通过索引访问,索引...
例如,下面的示例比较了使用FOR循环和FORALL循环插入数据的性能差异: ```sql -- 使用FOR循环 FOR i IN 1..500000 LOOP INSERT INTO parts VALUES(pnums(i), pnames(i)); END LOOP; -- 使用FORALL循环 FOR...
3.java嵌套循环中内部循环使用break或者continue来控制,外部循环结束或者跳过可以使用标签,示例代码: out: for (int i = 0; i < 10; i++) { System.out.print("i = " + i + "\t"); for (int j = 0; j < ...
- `for`循环、`while`循环和`do-while`循环的示例。 - 不同类型的循环可以实现同样的功能,但根据具体需求选择最合适的循环类型。 #### 三、面向对象编程 **3.1 类与对象** - **构造方法**:明确地编写无参数构造...
这些章节涵盖了Java的基础语法,包括变量、数据类型、运算符、控制结构(如if-else、switch、for、while循环)、类、对象、封装、继承、多态等。这些是任何Java程序员必须掌握的基本概念。 3. **输入/输出(IO流....
- **流程控制**:如if语句、switch、for循环、while循环等。 2. **面向对象编程**: - **类与对象**:类是对象的蓝图,对象是类的实例。 - **封装**:通过访问修饰符(public、private、protected)实现数据隐藏...
3. **控制结构**:包括条件语句(if-else、switch-case)和循环语句(for、while、do-while),用于实现程序的逻辑流程。 4. **数组**:讲解一维和多维数组的概念、声明、初始化及操作,以及数组在实际问题中的应用...
控制结构包括条件语句(if、if-else、switch)、循环语句(for、while、do-while)和跳转语句(break、continue)。 【数组】 数组是同类型元素的集合,Java提供了单维、多维数组。声明数组时需要指定元素类型和数...
该笔记主要介绍Java基础中的一些程序案例,包括打印星号、数据结构基础的原理程序等,可以用来复习Java基础知识,通过反复练习,巩固旧识。 1. a1_15_1【程序目标】打印 * * * 该程序的目标是打印一个由星号组成的...
1. **for循环**:Java的for循环是最常用的循环类型,它由三个部分组成:初始化、条件检查和更新。例如: ```java for (int i = 0; i ; i++) { System.out.println(i); } ``` 这段代码会从0开始打印到9,因为每次...
### Java 数组学习笔记 #### 一、Java 数组概述 **数组定义**: 数组是一种基本的数据结构,用于存储固定数量的同类型元素。在 Java 中,数组是一种对象,具有以下特点: - **数据类型一致**:数组中的所有元素...