集合的几个遍历方法

1. 集合的遍历

1.0 创建集合代码

List<String> strList = new ArrayList<>();
strList.add("huawei");
strList.add("xiaomi");
strList.add("tencent");
strList.add("google");
strList.add("baidu");

1.1 for 循环

​ 在性能要求不高的情况下,使用普通的 for 循环遍历集合是一种简单方便的选择。我们也可以使用增强 for 循环(也称为 for each 循环) 来遍历集合,但这种方式通常比普通的 for 循环慢一些

// 最基本的 for 循环
for (int i = 0;i < strList.size();i++) {
    System.out.print(strList.get(i) + "   ");
}

在这里插入图片描述

1.2 使用迭代器遍历

​ 当我们需要在遍历集合的同时对其进行修改时,使用迭代器是一个不错的选择。迭代器可以让我们在遍历集合的同时删除或添加元素,而不需要了解底层实现细节。

// 迭代器(Iterator)遍历
Iterator<String> iterator = strList.iterator();
while(iterator.hasNext()){
    System.out.print(iterator.next() + "  ");
}

在这里插入图片描述

与 for each 循环相比,使用 iterator 的方式更加灵活,因为它允许手动控制迭代过程,例如在迭代过程中修改集合、跳过元素或在多个集合之间进行迭代。比如下面样例在迭代过程中修改集合:
注意:使用 for-each 循环时不能在循环内修改集合,否则会抛出java.lang.UnsupportedOperationException 异常。

// 迭代器(Iterator)遍历
Iterator<String> iterator = strList.iterator();
while(iterator.hasNext()){
    String it = iterator.next();
    if (it.equals("google")) {
        iterator.remove();
    }
}
strList.forEach(str->{
    System.out.print(str + "  ");
});

在这里插入图片描述

1.3 使用 for each 循环(增强 for 循环)遍历

// 增强 for 循环(也称为 for each 循环) 
for (String str : stringList) {
    System.out.println(str);
}

// Java8 对 for each 的简化 1
stringList.forEach(str->{
    System.out.println(str);
});

// Java8 对 for each 的简化 2
stringList.forEach(System.out::println);

在这里插入图片描述

​ for each 循环本质上是使用了迭代器模式,它将选代器的实现细节隐藏在了语法层面。当使用 for-each 循环遍历集合时,编译器会将其转换为使用迭代器的方式。比如上面代码会被编译器转换为类似于以下代码,在底层实现上,for-each 循环和使用 iterator 的方式是等价的:

// 迭代器(Iterator)遍历
Iterator<String> iterator = stringList.iterator();
while(iterator.hasNext()){
    System.out.println(iterator.next());
}

在这里插入图片描述

1.4 使用 Stream API 的 forEach 方法遍历

​ Stream API 的 forEach 方法出了可以遍历集合的,还可以用来遍历任何支持流的对象,包括集合、数组、文件、函数生成器等。

// 使用 Stream API 的 forEach 方法遍历 1
stringList.stream().forEach(str->{
    System.out.println(str);
});

// 使用 Stream API 的 forEach 方法遍历 2
stringList.stream().forEach(System.out::println);

在这里插入图片描述

1.5 使用 ListIterator 接口遍历集合

如果我们需要在遍历 List 集合的同时进行改动,并且希望能够在遍历过程中向前或向后移动遍历位置,那么使用 Listlterator 就是一个不错的选择。

Listlterator 是 iterator 接口的子接口。Listlterator 可以向前或向后遍历列表中的元素,并允许在列表中插入、替换和删除元素。

// 从前向后遍历集合中所有元素
ListIterator<String> iterator = stringList.listIterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

// 从后向前遍历集合中所有元素
ListIterator<String> iterator = stringList.listIterator(stringList.size());
while (iterator.hasPrevious()) {
    System.out.println(iterator.previous());
}

// 从前向后遍历集合中所有元素
ListIterator<String> iterator = stringList.listIterator();
while (iterator.hasNext()) {
    String it = iterator.next();
    // 在 xiaomi 之后加入 redmi
    if (it.equals("xiaomi")) {
        iterator.add("redmi");
    }
    // 修改 baidu 为 baidu.com
    if (it.equals("baidu")) {
        iterator.set("baidu.com");
    }
    // 删除 google
    if (it.equals("google")) {
        iterator.remove();
    }
}
stringList.forEach(System.out::println);

1.6 使用并行流遍历

​ 如果我们需要对大型集合进行并行处理,那么使用并行流就是一种不错的选择。并行流使用多个线程来并行处理集合中的元素,可以提高处理速度。

// 创建一个并行流(将 parallel 标志指定为 true 表示创建并行流)
Stream<String> parallelStream = strList.parallelStream();
// 查看流是否支持并行遍历
System.out.println("流是否支持遍历:" + parallelStream.isParallel());
// 使用 forEach 方法遍历并行流
parallelStream.forEach(str->{
    System.out.println(str);
});

运行结果如下,由于使用了多个线程同时遍历列表中的元素,输出结果可能是乱序的

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/236197.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV-Python:DevCloud CodeLab介绍及学习

1.Opencv-Python演示环境 windows10 X64 企业版系统python 3.6.5 X64OpenCV-Python 3.4.2.16本地PyCharm IDE线上注册intel账号&#xff0c;使用DevCloud CodeLab 平台 2.DevCloud CodeLab是什么&#xff1f; DevCloud是一个基于云端的开发平台&#xff0c;提供了强大的计算…

dcat admin多后台和自定义登录

多后台按照教程配置 https://learnku.com/docs/dcat-admin/2.x/multi-application-multi-background/8475 自定义登录 我的新后台的登录需要另外一个用户表&#xff0c;所以原来的逻辑要修改一下。 1、首先是模板修改 参考连接 https://learnku.com/docs/dcat-admin/2.x/ba…

我有才打造专属个人或企业知识付费平台,核心功能设计

在当今信息爆炸的时代&#xff0c;知识管理已经成为了每个人必须面对的问题。然而&#xff0c;市面上的知识付费平台大多数都是通用的&#xff0c;无法满足个性化需求。 因此&#xff0c;我有才提供了一款专属定制的适合个人的知识付费平台。核心产品能力如下&#xff1a; 一…

2023年运营级网赚网盘平台搭建指南(包含源码和教程)

源码介绍 为什么要考虑自己搭建网盘呢&#xff1f;现如今&#xff0c;许多大型网盘平台都对文件添加了各种限制&#xff0c;导致很多文件容易被删除。而且&#xff0c;大部分网盘还会限制下载速度&#xff0c;如果没有开通VIP会员&#xff0c;使用起来非常不便。 本指南提供了…

tcpdump抓包命令

tcpdump抓包命令 tcpdump 的抓包保存到文件的命令参数是-w xxx.cap 抓eth1的包 tcpdump -i eth1 -w /tmp/xxx.cap抓 192.168.1.123的包 tcpdump -i eth1 host 192.168.1.123 -w /tmp/xxx.cap抓192.168.1.123的80端口的包 tcpdump -i eth1 host 192.168.1.123 and port 80 -w …

项目经理和产品经理哪个更有发展前景?

如果是单看“钱途”的话&#xff0c;如果是在传统行业&#xff0c;可能差不多&#xff1b;如果是在IT行业的话&#xff0c;可能更需要项目经理&#xff1b;互联网行业的话&#xff0c;可能更需要产品经理。 项目经理跟产品经理两个证都挺受市场欢迎的&#xff0c;两个岗位职责…

测试 cusolver 是否必须设置 stream

cusolverDnCreate之后&#xff0c;如果不调用 cusolverSetStream&#xff0c;那么&#xff0c;cusolver的这个handle是否可以被正常使用来调用cusolver的Math API 呢&#xff1f; 1&#xff0c;不设置时会Get到 NULL stream 测试源码 #include <cuda_runtime.h> #incl…

springboot利用easyexcel在浏览器中下载excel

前言 项目中操作excel是一种很常用的功能&#xff0c;比如下载一份excel的报价单。这篇文章会介绍一款excel的处理工具以及导出遇到的三个常见异常(重要)。 之前遇到一个这样的需求&#xff1a;后台管理页面&#xff0c;点击下载按钮&#xff0c;下载一份excel格式的报价清单…

设计模式——策略模式(Strategy Pattern)

概述 策略模式又叫政策模式&#xff0c;是一种对象行为型模式。它是将定义的算法家族分别封装起来&#xff0c;让它们之间可以互相替换&#xff0c;从而让算法的变化不会影响到使用算法的用户。策略模式的主要目的是将算法的定义与使用分开&#xff0c;也就是将算法的行为和环…

NV040D语音芯片应用于取暖桌:智能语音提高用户体验

科技与生活的结合&#xff0c;是科技发展的展示。天气的降温&#xff0c;取暖桌越来越取得用户的心&#xff0c;时至今日传统的取暖桌已经没有办法满足用户的需求&#xff0c;智能语音取暖桌给用户的生活带来了不一样的体验。 NV040D语音芯片是一款性能稳定的芯片&#xff0c;拥…

arcgis api for js 图层标注文本不显示

在打包arcgis api for js 项目后&#xff0c;更新到现场所有地图文本要素不显示的时候。 可能就是环境设置问题了&#xff0c;需要配置iis或者ngixs里边配置如下类型 iis发布的项目 1、打开iis中发布的网站 2、找到网站的MIME类型如下图 3、添加一下类型&#xff08;一个都不…

CentOS系统下配置HTTP服务器的步骤

在CentOS系统下配置HTTP服务器涉及到一系列的步骤。以下是一个基本的步骤概述&#xff0c;帮助你了解如何为CentOS系统配置HTTP服务器。 安装HTTP服务器软件&#xff1a; 首先&#xff0c;你需要在CentOS系统上安装HTTP服务器软件。常见的选择是Apache HTTP服务器。你可以使用…

前端开发新趋势:Web3、区块链与虚拟现实

文章目录 Web3&#xff1a;下一代互联网区块链技术去中心化应用程序&#xff08;DApps&#xff09; 区块链&#xff1a;重塑数字世界数字钱包NFT&#xff08;非同质化代币&#xff09; 虚拟现实&#xff1a;沉浸式体验WebVR和WebXR三维图形 新挑战与机会性能与复杂性安全性创新…

9.静态路由

静态路由 中小型网络都会用到&#xff0c;防火墙核心交换机用的很多&#xff0c;一般是用在出口 路由表&#xff1a;路由器用来转发数据包唯一的依据 NextHop下一跳 Static静态路由需要手动设置 ip route-static 目标网段 掩码 下一跳例如&#xff1a;ip route-static 192…

我们一起做过的SPA——Nuxt.js介绍

Nuxt.js 1 我们一起做过的SPA SPA&#xff08;single page web application&#xff09;单页 Web 应用&#xff0c;Web 不再是一张张页面&#xff0c;而是一个整体的应用&#xff0c;一个由路由系统、数据系统、页面&#xff08;组件&#xff09;系统等等&#xff0c;组成的应…

VMware虚拟机cpu不支持avx指令集处理

原创作者&#xff1a;运维工程师 谢晋 VMware虚拟机cpu不支持avx指令集处理 客户虚拟化环境内有台虚拟机内应用程序需要使用到avx指令集&#xff0c;排查过物理主机CPU是支持avx指令集&#xff0c;但虚拟机内缺无法正常应用&#xff0c;需将虚拟机CPU修改为硬件模式。将虚拟…

高压配电系统智能监测

高压配电系统智能监测是一种基于现代信息技术的电力系统监测手段&#xff0c;依托电易云-智慧电力物联网&#xff0c;旨在提高高压配电系统的安全性、可靠性和运行效率。具体而言&#xff0c;高压配电系统智能监测包括以下方面&#xff1a; 实时监测&#xff1a;通过安装传感器…

笔记69:Conv1d 和 Conv2d 之间的区别

笔记地址&#xff1a;D:\work_file\&#xff08;4&#xff09;DeepLearning_Learning\03_个人笔记\4. Transformer 网络变体 a a a a a a a a a a a

L1-028:判断素数

题目描述 本题的目标很简单&#xff0c;就是判断一个给定的正整数是否素数。 输入格式&#xff1a; 输入在第一行给出一个正整数N&#xff08;≤ 10&#xff09;&#xff0c;随后N行&#xff0c;每行给出一个小于231的需要判断的正整数。 输出格式&#xff1a; 对每个需要判断的…

stable video diffusion:scaling latent video diffusion models to large datasets

【AIGC-AI视频生成系列-5】Stable Video Diffusion -长文解读视频/3D生成变革的开始 - 知乎一句话总结&#xff1a;长文解读一份Stability AI 最新力作Stable Video Diffusion&#xff0c;如同实验报告的论文&#xff0c;构建了一个高质量的视频生成通用模型&#xff0c;在多种…