list最常用的遍历五种方式以及使用场景

news2024/10/7 12:19:16

目录

遍历方式的适用场景对比

迭代器遍历

列表迭代器

 增强for遍历

 Lambda表达式

lambda表达式简介

 普通for遍历

集合中通用的并且常用的六种方法


遍历方式的适用场景对比

迭代器遍历 :在遍历过程中需要删除元素,请使用迭代器

列表迭代器: 在遍历过程中需要添加元素,请使用列表迭代器

增强for遍历: 仅仅需要遍历

lambda表达式:仅仅需要遍历

普通for: 如果便利的时候想操作索引,可以使用普通for

迭代器遍历

首先定义一个list,之后添加数据到list当中,定义出一个迭代器,之后采用迭代器的next方法进行判断有没有元素,有的话就进行返回当前元素的值,之后在进行移动指针到下一位

 public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(111);
        list.add(222);
        list.add(333);
        /** 定义一个迭代器
         * hasNext方法判断是否有该元素
         * next方法 将当前结果返回 并指向下一位
         * */
        Iterator<Integer> it = list.iterator();
        while (it.hasNext()){
            Integer val = it.next();
            System.out.println(val);
        }

    }

如果我在遍历过程中需要删除某个元素,就可以采用下面这种写法,注意要用迭代器提供的remove方法进行删除,不然代码会报异常

public class ListTest {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(111);
        list.add(222);
        list.add(333);
        /** 定义一个迭代器
         * hasNext方法判断是否有该元素
         * next方法 将当前结果返回 并指向下一位
         * */
        Iterator<Integer> it = list.iterator();
        while (it.hasNext()){
            Integer val = it.next();
            if (val.equals(222)){
                it.remove();
            }
            System.out.println(val);
        }
        System.out.println(list);
    }
}

可以看到输出结构如下图,已经删除了222

 需要注意的是,方法遍历时仍然会输出222,因为next方法会先将返回值也就是222传给val,之后才调用的remove方法进行删原list,之后输出的是val的值

当然如果不想要输出要删除的元素,最直接的方法就是加上continue方法

 Iterator<Integer> it = list.iterator();
        while (it.hasNext()){
            Integer val = it.next();
            if (val.equals(222)){
                it.remove();
                continue;
            }
            System.out.println(val);
        }

列表迭代器

这是list格外多出的一种遍历方式

ListIterator<Integer> it = list.listIterator();
        while (it.hasNext()){
            Integer val = it.next();
            System.out.println(val);
        }

他可以对列表进行添加元素,当然也能够删除

 ListIterator<Integer> it = list.listIterator();
        while (it.hasNext()){
            Integer val = it.next();
            if(val.equals(111)){
                it.add(444);
            }
            System.out.println(val);
        }

输出结果如下图所示

 增强for遍历

增强for是在jdk1.5之后出现的,其内部原理就是一个Iterator迭代器

需要注意的是  这种方式只能够遍历list,无法对里面的值就行修改

  for (Integer integer : list) {
            System.out.println(integer);
        }

可以看到我下面这种写法,能不能修改list呢?

for (Integer integer : list) {
            integer = 10086;
            System.out.println(integer);
        }

        System.out.println(list);

如果只是要看遍历的输出结果 这个是肯定会有变化的,因为我们是直接修改了integer的值,输出的结果也是它,但是intege只是作为一个第三者出现,它先等于了list原来的值,也就是说 只是让integer中list的值,并不是让它等于list

可以看到输出结果如下:

 Lambda表达式

不能够操作list,但是代码简洁,只需要一行就可以完成

 list.forEach(a -> System.out.println(a));

甚至可以缩写成

list.forEach(System.out::println);

lambda表达式简介

Lambda 表达式是 Java 8 引入的一种函数式编程特性,它允许你以一种更简洁的方式表示匿名函数或对象方法的实现。Lambda 表达式的基本语法如下:

(parameters) -> { body }

其中,Lambda 表达式由以下几个部分组成:

  1. 参数列表(parameters):这是 Lambda 表达式接受的输入参数列表。你可以指定零个或多个参数,多个参数用逗号分隔。参数的类型可以明确声明,也可以根据上下文进行推导。

  2. 箭头符号(->):箭头符号分隔参数列表和 Lambda 表达式的主体。

  3. 主体(body):这是 Lambda 表达式的执行逻辑。它可以是一个单独的表达式,或者是一段代码块(用花括号括起来),包含多个语句。

下面是一些使用 Lambda 表达式的示例:

无参数的 Lambda 表达式:

() -> System.out.println("Hello, world!");

有参数的 Lambda 表达式: 

(x, y) -> {
    int sum = x + y;
    System.out.println(sum);
}

有返回值的 Lambda 表达式: 

(x, y) -> x + y

 方法引用:

System.out::println

 普通for遍历

这是利用了list的索引就行遍历的方式,但是需要注意的是set是没有索引的,因此要想遍历set就不能用这种方式

 for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }

集合中通用的并且常用的六种方法

1.add

list中元素是可以重复的,因此调用add方法 返回值永远是true set中则是不可以重复的,如果添加相同的元素就会返回false

2.clear

这个是将集合清空的方法

3.remove

返回值也是boolean类型的,删除成功返回true 失败返回false

4.contains

判断元素是否包含

底层是依赖equals方法进行判断是否存在的,如果存的是自定对象,这一定要重写equals(在自定义的javaBean中重写equals就行

5.isEmpty

判断集合是否为空

6.size

找到集合的长度

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java如何实现定时读取json文件里的内容

Java实现定时读取json文件里的内容 项目背景代码实现读取json配置文件定时任务 测试 项目背景 有时候我们会需要定时来读取JSON配置文件里的内容&#xff0c;来执行一些业务逻辑上的操作。 比如&#xff1a;开发一个物流运输系统&#xff0c;系统需要定期读取一个包含货物信息…

6个真正免费的平面设计素材网站

新手设计师没有自己的素材库&#xff0c;找素材费时又费力&#xff0c;找到了还不一定能免费下载或商用&#xff0c;别急&#xff01;我带着我收藏多年的素材库来了&#xff0c;平面、UI、免扣、高清背景图、设计元素、字体等素材全部都有&#xff0c;重点是免费下载&#xff0…

线程池学习(四)任务调度

线程池有几个重要的属性&#xff0c;核心线程数&#xff0c;最大线程数&#xff0c;阻塞任务队列。 一、调度流程 1. 接收新的任务后&#xff0c;先判断核心线程数是否已满&#xff0c;未满则创建新的线程去执行任务 2. 如果核心线程数已满&#xff0c;再判断阻塞任务队列是否…

Vue Router相关理解2

路由的query参数 传递参数 <!-- <router-link to"/home/message/detail?id666&title你好啊">{{ m.title }}</router-link> --><!-- 跳转路由并携带query参数&#xff0c;to的字符串写法 --><!-- <router-link :to"/home/m…

MySql如何卸载干净经验分享

第一步&#xff1a;首先打开注册表&#xff1a;点击电脑的开始按钮&#xff0c;打开找到运行&#xff0c;输入regedit&#xff0c;进入注册表&#xff1b; 第二步&#xff1a;删除mysql再注册表中的信息&#xff0c;以下三个目录&#xff1a; 1.HKEY_LOCAL_MACHINE\SYSTEM\Cont…

Unity中指定物体的模型面数分析

给定一架飞机模型&#xff0c;需要分析该模型中&#xff0c;各个3D物体的面数和三角形数&#xff0c;目的是用于观察哪些物体面数过多&#xff0c;需要减面。 一、模型面数分析 二、脚本代码 using System.Collections; using System.Collections.Generic; using UnityEngine…

用VMware运行linux CentOS7时,Network中没有wired选项,只有VPN的情况解决方案

毫无征兆&#xff0c;平时使用正常的CentOS7在今天打开后发现无法连接到网络&#xff0c;wired图标也莫名的消失&#xff0c;并且在打开网络设置&#xff0c;也没有对wired的设置模块&#xff0c;这种问题很有可能是之前对云端之类的源进行操纵以及主机上挂梯子等一系列情况综合…

fastadmin+python+mysql +wxbot实现万能模糊查询(和chatgpt一起完成的)

废话不多说直接上代码&#xff1a; 功能&#xff0c;fastadmin后台管理这些机房服务器的信息&#xff0c;wxbot 通过/指令任意字段的信息查询 让wxbot去数据库里查询相关的信息&#xff0c;在通过wx发送给你。 1.创建数据库 CREATE TABLE fa_databank (ID INT AUTO_INCREMEN…

简单认识MySQL数据库日志和数据的备份恢复

文章目录 Mysql 备份与还原一、数据备份的重要性二、数据库备份类型1 、物理备份2 、逻辑备份 三、常见的备份方法1、 物理冷备2、 专用备份工具 mysqldump 或 mysqlhotcopy3、 启用二进制日志进行增量备份3.4 第三方工具备份 四、MySQL完全备份1、简介2、优点&#xff1a;3、缺…

避雷!7月有4本SCIE期刊被剔除!(附目录下载)

2023年7月SCI、SSCI期刊目录更新 2023年7月17日&#xff0c;科睿唯安更新了WOS期刊目录&#xff0c;继上次6月WOS期刊目录剔除3本SCIE&SSCI期刊之后&#xff0c;此次7月更新又有4本SCIE期刊发生变动&#xff0c;其中有3本期刊被踢出SCIE数据库&#xff0c;1本期刊更改了名…

通过new FormData提交简单数据

通过new FormData提交简单数据 效果示例图代码 效果示例图 代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style type"text/css">* {padding: 0px;margin: 0px;box-sizing: border-…

CSS 渐变边框及动画

转载请注明出处&#xff0c;点击此处 查看更多精彩内容 用 CSS 实现渐变边框及动画&#xff0c;下面对关键点进行解释说明&#xff0c;查看完整代码及预览效果请 点击这里。 简单说明原理&#xff1a;使用伪元素 ::before 绘制一个渐变色&#xff0c;然后使用伪元素 ::after 绘…

详解Windows安装分布式版本控制系统git

文章目录 前言下载安装相关链接 前言 git是一个分布式版本控制软件&#xff0c;最初由Linux创作者Linus Torvalds创作&#xff0c;并于2015年以GPL许可协议发布。git易于学习&#xff0c;占用空间小&#xff0c;性能却快如闪电&#xff0c;可以快速、 高效的管理从小到大的项目…

STM32 HAL/STD库驱动HC-SR04测距

STM32 HAL/STD库驱动HC-SR04测距 ✨说明:本文不介绍HC-SR04原理。 &#x1f4cc;相关篇《STM32F103VCDS18B20温度hc-sr04超声波测距I2C OLED显示》 &#x1f33f;HAL库实现方法比较简易&#xff0c;只需配置2个IO引脚&#xff1a;一个配置为输入&#xff0c;一个配置为输出即可…

【正点原子STM32连载】第六十四章 UCOSII实验2-信号量和邮箱摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html# 第六…

【C++】多线程交替打印奇偶数

目录 版本1 双信号量版 版本二 单信号量版 版本三 信号量版 共享资源是100个数字&#xff08;一个计数器的 由两个进程争抢完成&#xff09; 首先访问临界资源&#xff08;对计数器操作&#xff09;是肯定的要加锁的&#xff0c;交替打印肯定要用条件变量来互相唤醒 互相锁死…

计及需求侧响应日前—日内两阶段鲁棒备用优化(matlab代码)

目录 1 主要内容 日前计划模型 日内调整模型 不确定集建模 2 部分代码 3 程序结果 1 主要内容 该程序复现文章《计及需求侧响应日前—日内两阶段鲁棒备用优化》&#xff0c;以6节点系统为例&#xff0c;综合考虑风电出力不确定性与电力设备 N-k强迫停运&#xff0c;增强电…

创建型模式 - 原型模式

概述 用一个已经创建的实例作为原型&#xff0c;通过复制该原型对象来创建一个和原型对象相同的新对象。 结构 原型模式包含如下角色&#xff1a; 抽象原型类&#xff1a;规定了具体原型对象必须实现的的 clone() 方法。 具体原型类&#xff1a;实现抽象原型类的 clone() 方…

如何用3D格式转换工具HOOPS Exchange读取颜色和材料信息?

作为应用程序开发人员&#xff0c;非常希望导入部件的图形表示与它们在创作软件中的外观尽可能接近。外观可以在每个B-Rep面的基础上指定&#xff0c;而且&#xff0c;通过装配层次结构的特定路径可以在视觉外观上赋予父/子覆盖。HOOPS ExchangeHOOPS Exchange可捕获有关来自各…

创建型模式 - 建造者模式

概述 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 分离了部件的构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。这个模式适用于&#xff1a;某个对象的构建过程复杂的情况。 由于实现了构建和装配的解耦。…