Java循环对比:传统for循环、增强型for循环和forEach循环

这篇具有很好参考价值的文章主要介绍了Java循环对比:传统for循环、增强型for循环和forEach循环。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、传统for循环

传统的for循环是一种经典的循环结构,在Java中广泛使用。

以下是传统for循环的特点:

灵活控制:传统for循环使用形式为for (初始化表达式; 终止条件; 步进表达式)的语法,可以手动控制循环的索引,并根据需要执行自定义操作。

索引访问:传统for循环通过索引访问集合或数组中的元素,可以直接读取和修改元素的值。

例如:

import java.util.Arrays;
import java.util.List;

public class Demo {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

        for (int i = 0; i < numbers.size(); i++) {
            System.out.println(numbers.get(i));  // 读取元素的属性值或执行操作是允许的
            numbers.set(i, 10);  // 直接修改元素的值是允许的
        }
    }
}

底层操作:相比增强型for循环,传统for循环提供了更底层的操作,更加灵活,但也更加繁琐。

适用对象:适用于任何实现了Iterable或Iterator接口的集合类。

示例代码:

public class Demo {
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3, 4, 5};
        for (int i = 0; i < numbers.length; i++) {
            System.out.println(numbers[i]);
        }
    }
}

传统for循环代码结构是这样的:

for(循环变量的初始声明;循环的判定条件;改变循环变量的条件){

循环体

}

其中执行顺序是:①循环变量的初始声明(声明循环变量) ②循环的判断条件(判定是否继续执行循环,是boolean值) ③循环体(想要重复执行的代码段) ④改变循环变量的条件(用于结束循环) ⑤再回到2中判断是否跳出循环,如果判断结果是true,继续上述过程。如果判断结果是false,则跳出整个循环代码段,执行后续代码。

如测试通过遍历方式,实现为数组赋值,赋值为100,200,300,400,500

import java.util.Arrays;

public class Demo {
    public static void main(String[] args) {
        int[] arr = new int[5];
        int num = 100;
        for (int i = 0; i < arr.length; i++) {
            arr[i] = num;
            num += 100;
        }
        System.out.println(Arrays.toString(arr));
    }
}

代码的输出结果是这样的:[100, 200, 300, 400, 500]

显而易见,普通for循环通过下标索引,将值赋值到了数组内部。

2、增强型for循环

增强型for循环,也称为foreach循环,是一种简化版的循环语法。它可以用于遍历数组或实现了Iterable接口的集合类。

以下是增强型for循环的特点:

语法简洁:增强型for循环使用形式为for (元素类型 元素变量 : 集合或数组)的语法,使代码更易读和编写。

只读访问:在每次迭代中,增强型for循环提供对当前元素的只读访问权限,不能直接修改元素的值。

例如:

import java.util.ArrayList;
import java.util.List;

public class Demo {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("Hello");
        list.add("World");
        System.out.println(list);
        for (String s : list) {
            s = "New Value";  // 尝试修改元素的值
        }
        System.out.println(list);
    }
}

 

适用对象:适用于数组或实现了Iterable接口的集合类。

示例代码:

import java.util.Arrays;
import java.util.List;

public class Demo {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("Apple", "Banana", "Orange");
        for (String fruit : list) {
            System.out.println(fruit);
        }
    }
}

 

增强型for循环代码结构是这样的:

for(接收数组元素的类型 变量名:数组){

变量名代表数组中的每一个数据

}

增强for可以遍历数组中的每一个元素,用前面的变量名来接收。我强调一下是接收,因为类型所定义的变量只是用来接收数组中各个元素,而不是将每个元素分离出来。

列如上面问题,测试通过2种遍历方式,分别实现为数组赋值,赋值为100,200,300,400,500

import java.util.Arrays;

public class Demo {
    public static void main(String[] args) {
        int[] arr = new int[5];
        int num = 100;
        for (int i : arr) {
            i = num;
            num += 100;
        }
        System.out.println(Arrays.toString(arr));
    }
}

代码输出结果是这样的:[0, 0, 0, 0, 0]

也就是说增强for循环根本没有将值传到数组内部。这也是普通for与增强for的区别,普通for循环可以实现为数组赋值,根据索引操作;foreach只能遍历获取,不能修改数组中的数据。

除此之外,:前面是接收数组元素的类型,这里强调的是,这里定义的类型是接受数组元素的类型,不必是数组的类型关系。

for(long|float|double|.. i:arr){
	i=num;
	num+=100;
}

其实类型没有那么严格,只要是能接收这个int型的数组arr的元素即可。当然不能接收的其他类型,比如byte,short ,char…就会报错。

 

3、forEach循环

forEach是Java 8中引入的一个方法,用于遍历集合中的元素并对其执行某种操作。它可以接受一个函数作为参数,这个函数会对集合中的每个元素进行操作。这个函数可以是Lambda表达式,也可以是一个普通的函数接口。

Lambda表达式在Java 8中被引入,是一种简洁,函数式的方法来编写某些操作。Lambda表达式主要被用于创建只有一个方法的接口,这个接口可以包含一个参数列表和一个表达式或一个块语句。这种表达式或块语句就是Lambda体。

以下是Lambda表达式for循环的特点:

函数式风格:Lambda表达式for循环采用函数式编程风格,通过Lambda表达式定义循环体的操作,使代码更加简洁和易读。

自动迭代:与增强型for循环类似,Lambda表达式for循环自动迭代集合或数组中的元素,无需手动控制索引。

例如:

import java.util.Arrays;
import java.util.List;

public class Demo {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("Apple", "Banana", "Cherry");
        // 使用Java 8的forEach和Lambda表达式
        list.forEach(fruit -> System.out.println(fruit));
    }
}

4、效率简单对比

说明:测试可能有不严谨的地方,时间,机器,执行顺序,cpu运行后效率降低也有可能,仅供参考

import java.util.ArrayList;
import java.util.List;

public class Demo {
    public static void main(String[] args) {
        long[] numbers = {10000L, 100000L, 1000000L, 10000000L};
        for (int j= 0; j < numbers.length; j++) {
            long times = numbers[j];
            System.out.println("操作次数:" + times);
            List<String> list = new ArrayList<>();
            List<String> list1 = new ArrayList<>();
            List<String> list2 = new ArrayList<>();
            List<String> list3 = new ArrayList<>();
            for (int i = 0; i < times; i++) {
                list.add(new String());
            }
            long startTime = System.currentTimeMillis();
            //普通for
            for (int i = 0; i < list.size(); i++) {
                list1.add(list.get(i));
            }
            long endTime = System.currentTimeMillis();
            System.out.println("普通for时间(毫秒):" + (endTime - startTime));
            //增强for
            long startTime1 = System.currentTimeMillis();
            for (String s : list) {
                list2.add(s);
            }
            long endTime1 = System.currentTimeMillis();
            System.out.println("增强for时间(毫秒):" + (endTime1 - startTime1));

            long startTime2 = System.currentTimeMillis();
            //forEach
            list.forEach(s -> list3.add(s));
            long endTime2 = System.currentTimeMillis();
            System.out.println("forEach时间(毫秒):" + (endTime2 - startTime2));
        }
    }
}

执行结果:

操作次数:10000

普通for时间(毫秒):1

增强for时间(毫秒):1

forEach时间(毫秒):59

操作次数:100000

普通for时间(毫秒):2

增强for时间(毫秒):2

forEach时间(毫秒):3

操作次数:1000000

普通for时间(毫秒):37

增强for时间(毫秒):10

forEach时间(毫秒):8

操作次数:10000000

普通for时间(毫秒):203

增强for时间(毫秒):170

forEach时间(毫秒):184

5、适用场景的选择

选择合适的循环方式取决于具体的需求和操作。以下是一些建议的使用场景:

传统for循环:适用于需要手动控制索引、执行自定义操作或修改集合或数组元素值的场景。

增强型for循环:适用于简单的遍历和只读操作,不需要修改集合或数组的元素。

Lambda表达式+forEach循环:适用于函数式编程风格,简化代码,并且无需手动控制索引的场景。

根据具体的需求,我们可以灵活选择不同的循环方式,以实现代码的简洁、可读性和性能的平衡。文章来源地址https://www.toymoban.com/news/detail-731007.html

到了这里,关于Java循环对比:传统for循环、增强型for循环和forEach循环的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • TD-W89841N增强型无线路由器怎么设置宽带自动拨号上网?

    在设置宽带自动拨号上网前,我们需要了解无线路由器后端的端口起到什么作用。无线猫兼路由器后面的端口可以分为:【1】ADSL端口;【2】小区宽带LAN/WAN端口;【3】电脑连接端口;(LAN1至LAN4:在使用的是ADSL端口下并且未开启IPTV功能时。)【4】IPTV端口即LAN2(需开启IPT

    2024年02月08日
    浏览(37)
  • FQPF27P06 P沟道增强型MOS管电压、原理、导通条件!

    关于P沟道增强型功率MOSFET? P沟道增强型功率MOSFET是一种常见的功率场效应晶体管,它主要用于功率放大和开关电路。与N沟道增强型MOSFET相比,P沟道增强型MOSFET的工作原理相反。 在P沟道增强型MOSFET中,沟道区域是由P型材料形成的。当施加正电压到晶体管栅极上时,电场会

    2024年02月11日
    浏览(27)
  • MOS管工作区间及开通过程分析——以N沟道增强型MOS为例

    N沟道增强型MOS管的结构如图1所示,P型衬底上制作两个高掺杂的N区,引出作为漏极D和源极S,衬底上再制作一块绝缘层,绝缘层上在制作一层金属电极,引出作为栅极G,即构成了常见的N沟道增强型MOS管。一般而言,衬底B和S极会连在一起,当在栅极处加正电压时,靠近衬底的

    2024年02月09日
    浏览(28)
  • java 增强for循环

    学的不是技术,更是梦想!!!

    2024年02月14日
    浏览(23)
  • Kotlin基础入门 - for、forEach 循环

    不论身处何方 for循环这种操作都随处可见,鉴于大多数Android开发都是从Java转到Kt的,所以我的思路是从Java的使用习惯来讲一些Kt 的for、forEach 循环方式 基础 for循环 for循环 一般作用于 list、map数据集合 ,这里我直接创建了一个只读List集合 提前了解 惯性 for循环 所谓的惯性

    2024年01月16日
    浏览(29)
  • 【JS】for 与 forEach 分别如何跳出循环

    for 循环 在 for 循环中,退出循环的两种方式: break; 退出整个循环 continue; 退出当次循环 break 退出整个循环 continue 退出当次循环 forEach 在JavaScript中, forEach 方法是用于遍历数组的方法,它会对数组中的每个元素执行指定的操作。 forEach 方法本身 并不提供直接的方式来跳出循

    2024年02月12日
    浏览(32)
  • matlab中的foreach、for in 循环、迭代器

    I 是个行向量,对于行向量,可以像上面的语法那样在 for 循环中使用,遍历 I 中的每一个元素。 如果 I 是列向量,就不行了。 可以看到 a 直接被赋值成整个列向量。 可见,for 循环中被用来迭代的矩阵会被看成只有一行,里面的元素是一个个列向量,for 循环一次取出里面的

    2024年02月11日
    浏览(37)
  • 数组的5种遍历(for循环、for...in、for...of、forEach()、map()

    数组:内存中一块连续的存储单元,这些存储单元具有共同的名称,不同的索引(下标)。 数组5种遍历: 1、for循环        任何数组都可以使用for循环进行遍历,使用频率最高                                 for (let i = 0; i arr.length; i++) {                            

    2024年02月06日
    浏览(32)
  • 常见遍历方法 for循环、forEach、map、filter、find、findIndex、some、every

    来自于远古的遍历方式,并且涵盖多种手段,例如for in 和for of。 for循环 中使用break和continue语句(终止和跳过本次循环): for of 用来遍历数组也是可以的 for of 中也可以用break和continue for in 也可以遍历数组,但不推荐 for in 中也可以用break和continue forEach是ES5中操作数组的一种

    2024年02月08日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包