Java的编程之旅46——List集合

1.List集合的特殊方法

List接口是Collection接口的子接口,提供了一系列操作元素的方法。 常见的List集合实现类有ArrayList和LinkedList。ArrayList我们在前面已经介绍过了,这一章中着重介绍一下List集合的特有方法。

        List<String> list = new ArrayList<>();
        list.add("hello");
        list.add("java");
        list.add("world");

        list.add(3,"hahaha"); //通过索引增加元素

        System.out.println(list.remove(3)); //通过索引移除元素,并返回被移除的元素

        System.out.println(list.set(1,"c++"));  //用set函数通过索引修改元素,并返回修改前的元素

        System.out.println(list.get(2));        //用get函数通过索引获取元素,并返回获取到元素的值

        System.out.println(list);

1.增加元素

list.add(index,element) 方法增加元素

 2.删除元素

list.remove(index)

3.修改元素 

list.set(index,element) 

4.获取元素

 list.get(index)

 2.遍历元素

1.for循环遍历

        List<String> list = new ArrayList<>();
        list.add("hello");
        list.add("java");
        list.add("world");

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

2.foreach遍历

        List<String> list = new ArrayList<>();
        list.add("hello");
        list.add("java");
        list.add("world");

        //法二foreach
        for (String li :
                list) {
            System.out.println(li);
        }
        

3.迭代器

        List<String> list = new ArrayList<>();
        list.add("hello");
        list.add("java");
        list.add("world");

        Iterator<String> it = list.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }

该代码段使用ArrayList和Iterator来遍历列表中的元素并打印出来。 首先,代码创建了一个ArrayList对象,并向其中添加了三个字符串元素("hello","java"和"world")。 然后,通过调用list的iterator()方法获取一个Iterator对象。Iterator是一个接口,用于遍历集合中的元素。 接下来,使用while循环和Iterator的hasNext()方法来检查是否还有下一个元素可遍历。 在循环的每次迭代中,使用Iterator的next()方法获取下一个元素,并将其打印出来。 最终,循环结束后,所有元素都被遍历并打印出来。输出结果为: hello java world

4.stream流

        List<String> list = new ArrayList<>();
        list.add("hello");
        list.add("java");
        list.add("world");

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

通过调用list的stream()方法获取一个流(Stream)对象。流是Java 8中引入的一种处理集合数据的方式。 接下来,使用Stream的forEach()方法来迭代每个元素,并使用System.out::println方法引用来打印每个元素。 最终,所有元素都被遍历并打印出来。输出结果为: hello java world

5.lambda表达式

        List<String> list = new ArrayList<>();
        list.add("hello");
        list.add("java");
        list.add("world");

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

使用List的forEach()方法来循环遍历列表中的每个元素。 在forEach()方法中,我们使用System.out::println方法引用来打印每个元素。 最终,所有元素都被遍历并打印出来。输出结果为: hello java world

3.listIterator迭代器

与普通迭代器Iterator相比,listIterator提供了更多的功能。它可以向前和向后遍历集合中的元素,还可以修改集合中的元素,以及获取当前元素的索引。

        List<String> list = new ArrayList<>();
        list.add("JavaSE");
        list.add("MYSQL");
        list.add("JavaWeb");
        list.add("JavaEE");
        ListIterator<String> lt = list.listIterator();
        while (lt.hasNext()){        //正向遍历
            System.out.println(lt.next());
        }

        while (lt.hasPrevious()){
            System.out.println(lt.next());  //逆向遍历
        }

4. 并发性修改异常

并发性修改异常(ConcurrentModificationException)是Java集合框架中的一种异常,表示在迭代器遍历集合元素时,发生了结构性修改。结构性修改指的是改变集合大小或使迭代器失效的操作,如添加、删除或修改元素。

在Java集合框架中,有一些迭代器是通过快速失败机制实现的。这意味着如果在迭代器遍历集合期间进行了结构性修改,会立即抛出ConcurrentModificationException异常,而不是继续遍历。这是为了避免在并发环境下可能出现的不一致性和数据损坏。

例: 在一组列表里增加元素

        List<String> list = new ArrayList<>();
        list.add("JavaSE");
        list.add("MYSQL");
        list.add("JavaWeb");
        list.add("JavaEE");
        Iterator<String> it = list.iterator();
        while(it.hasNext()){
            String str = it.next();
            if("MYSQL".equals(str)){
                System.out.println("..........");
                list.add("JDBC");
            }
        }

这段代码创建了一个字符串类型的ArrayList,并向其中添加了四个元素。接着,通过iterator()方法获取了该ArrayList的迭代器对象,并使用while循环遍历迭代器。

在循环中,首先使用hasNext()方法检查是否还有下一个元素,然后使用next()方法获取下一个元素。如果当前元素的值等于"MYSQL",则会打印出".........."。接着,在if条件中,代码尝试往列表中添加一个新元素"JDBC"。

然而,由于在迭代器遍历过程中对列表进行了结构性修改(添加元素),根据快速失败机制,会抛出ConcurrentModificationException异常。这是因为在这个案例中,通过迭代器遍历列表,而在遍历过程中修改了列表的结构。

解决该异常我们可以使用for循环,实现元素的添加

        List<String> list = new ArrayList<>();
        list.add("JavaSE");
        list.add("MYSQL");
        list.add("JavaWeb");
        list.add("JavaEE");

        for (int i = 0; i < list.size(); i++) {
           if ("MYSQL".equals(list.get(i))){
                list.add("JDBC");
           }
        }
        System.out.println(list);

在循环中,首先通过list.get(i)获取索引为i的元素,然后判断是否等于"MYSQL"。如果相等,则在列表末尾添加一个新元素"JDBC"

还可以使用listIterator来解决

        List<String> list = new ArrayList<>();
        list.add("JavaSE");
        list.add("MYSQL");
        list.add("JavaWeb");
        list.add("JavaEE");
        ListIterator<String> lt = list.listIterator();
        while (lt.hasNext()){
            String str = lt.next();
            if ("MYSQL".equals(str)){
                lt.add("JDBC");
            }
        }
        System.out.println(list);
   

在迭代器的循环中,首先通过lt.next()方法获取下一个元素,然后判断是否等于"MYSQL"。如果相等,则使用lt.add("JDBC")方法在当前元素之前插入一个新元素"JDBC"。

在这种情况下,迭代器的添加操作不会影响迭代的继续进行,并且不会引发ConcurrentModificationException异常。迭代器内部会自动处理这种并发性修改。

最后,打印输出列表的内容。由于使用迭代器进行了元素的插入操作,因此列表中会包含"JDBC"这个新元素。结果会输出修改后的列表内容。

5.LinkedList

LinkedList集合是Java中的一种实现了List接口的链表数据结构。它是由一个个节点组成的,每个节点都包含一个值和指向下一个节点的引用。

与ArrayList不同,LinkedList内部的数据结构是一个双向链表,每个节点既有指向下一个节点的引用,也有指向前一个节点的引用。这使得在LinkedList中插入、删除元素时的操作非常高效,因为只需要修改相邻节点的引用即可,而不需要移动其他元素。

LinkedList集合支持动态的增加或删除元素,因为它不需要连续的内存分配。由于链表的特性,LinkedList对于在列表的开头或结尾插入或删除元素效率较高,但对于通过索引访问元素的效率较低。如果需要频繁地使用索引来访问元素,建议使用ArrayList。

LinkedList还实现了Deque接口,因此它可以被当作双端队列来使用,支持在队列的两端进行插入、删除操作。

总之,LinkedList集合提供了一种灵活的、高效的链表数据结构,适用于需要频繁进行插入、删除操作的场景,但在索引访问方面的性能稍逊于ArrayList。

public class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
public class StuShow {
    public static void main(String[] args) {
        LinkedList<Student> stuList = new LinkedList<>();
        stuList.add(new Student("Jack",19));
        stuList.add(new Student("Kite",14));
        stuList.add(new Student("bill",15));
        stuList.add(new Student("lily",18));

        for (int i = 0; i < stuList.size(); i++) {
            System.out.println("姓名"+stuList.get(i).getName()+"年龄"+stuList.get(i).getAge());
        }

        for (Student stu : stuList) {
            System.out.println("姓名"+stu.getName()+"年龄"+stu.getAge());
        }

        ListIterator<Student> it = stuList.listIterator();
        while(it.hasNext()){
            Student stu = it.next();
            System.out.println("姓名"+stu.getName()+"年龄"+stu.getAge());
        }
    }
}

这段代码是一个示例,展示了如何使用LinkedList集合存储和遍历Student对象。

首先,在main方法中创建了一个LinkedList对象stuList,用于存储Student对象。然后,通过stuList.add方法依次添加了4个Student对象到集合中,每个对象包含姓名和年龄信息。

接下来,通过两种方式进行遍历集合中的元素。第一种方式是使用for循环和索引,通过stuList.size()方法获取集合的大小,使用get方法获取指定索引位置的Student对象,然后通过getName和getAge方法获取对象的姓名和年龄,并打印出来。

第二种方式是使用增强for循环,直接遍历stuList中的每个Student对象,并通过getName和getAge方法获取对象的姓名和年龄,并打印出来。

第三种方式通过ListIterator迭代器来遍历集合中的元素。首先,通过stuList.listIterator()方法获取ListIterator对象,然后使用while循环和it.hasNext()方法判断是否有下一个元素,如果有则通过it.next()方法获取下一个Student对象,再通过getName和getAge方法获取对象的姓名和年龄,并打印出来。

这段代码展示了LinkedList集合的常见用法,包括添加、遍历、获取元素等操作。

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

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

相关文章

第3章.中央服务器的物联网模式--规则引擎

规则引擎 规则引擎本质上是物联网事件和需要与这些事件相关联的动作之间的映射。在物联网环境中&#xff0c;事件通常使用传感器生成&#xff0c;所需的动作由执行器采取。本书中用于该图案的符号如下图所示&#xff1a; 图3.6–“规则引擎”模式的符号 一个有趣的类比是将规则…

Linux 摄像头编号固化

一、前言 在工业领域&#xff0c;一台设备会有很多个摄像头&#xff0c;可以使用命令&#xff1a;ll /dev/video* 进行查看&#xff1b; 在代码中&#xff0c;如果需要使用摄像头&#xff0c;那么都是需要具体到哪个摄像头编号的&#xff0c;例如 open("/dev/video4"…

数据库数据插入全解析:语法与示例

目录 一、基础数据插入 &#x1f38a;基本语法 &#x1f384;示例 二、使用 SET 进行数据插入 &#x1f697;基本语法 &#x1f3a2; 示例 三、插入查询结果 &#x1f953;基本语法 &#x1f95e;示例 四、插入并获取自增ID &#x1f68d;示例&#xff08;MySQL&…

昇思25天学习打卡营第13天 | SSD目标检测

模型简介 SSD&#xff0c;全称Single Shot MultiBox Detector&#xff0c;是Wei Liu在ECCV 2016上提出的一种目标检测算法。使用Nvidia Titan X在VOC 2007测试集上&#xff0c;SSD对于输入尺寸300x300的网络&#xff0c;达到74.3%mAP(mean Average Precision)以及59FPS&#x…

为什么进口主食冻干那么高贵?必入榜主食冻干总结分享

新手养猫人常常会有这样的疑问&#xff1a;为何进口主食冻干价格如此昂贵&#xff0c;但仍有大量养猫达人对其推崇备至&#xff1f;与国产主食冻干相比&#xff0c;进口产品的价格高出3-4倍之多&#xff0c;那么这高昂的价格背后&#xff0c;进口主食冻干是否真的值得推荐&…

智慧消防视频监控烟火识别方案,筑牢安全防线

一、方案背景 在现代化城市中&#xff0c;各类小型场所&#xff08;简称“九小场所”&#xff09;如小餐馆、小商店、小网吧等遍布大街小巷&#xff0c;为市民生活提供了极大的便利。然而&#xff0c;由于这些场所往往规模较小、人员流动性大、消防安全意识相对薄弱&#xff0…

GPU相关的一些截图(备查,待整理)

GPU相关的一些截图 这里记录一些与GPU相关的截图,方便查阅

信息安全驱动汽车行业快速向数字化转型

开发一款安全性良好的软件是困难的&#xff0c;它需要专业知识的积累以及对常见编程缺陷和规则的了解&#xff0c;例如检查输入范围、管理内存分配和回收、寻址字符串格式、避免悬空指针等等。通常情况下&#xff0c;编写安全代码与开发人员编写“流畅”代码的自然愿望形成了对…

MPI hello world SSH 免密互联

目标&#xff1a; 我们想实现2台主机免密互联&#xff0c;将MPI Hello World跑起来 假设hostname是node01,node02,&#xff08;Linux shell窗口一般是UserNameHostName&#xff0c;node1和node2一定要和HostName一样&#xff09; hostname是/etc/hosts中的配置&#xff0c;如下…

Ubuntu18.04安装AutoWare.ai(完整版)

目录 目录 一、安装Opencv 1.1 下载安装包Opencv官网 1.2 安装opencv_contrib 二、安装Eigen库 1. 解压文件 2. 安装Eigen 3. 配置路径&#xff1a; 三、安装Ros和rosdepc 四、安装Autoware.ai-1.14.0 4.1 安装依赖 4.2 下载Autoware.ai 1.在home路径下打开终端输…

智源十大行业高质量数据集开放申请,经验证可显著提升模型行业能力!

近日&#xff0c;智源研究院非开源、高质量行业预训练数据集开放申请。该数据集覆盖医疗、教育、文学、金融、旅游、法律、体育、汽车、新闻、农业十大行业&#xff0c;总量达597GB。 智源研究院对较难获取的非开源高质量数据、合作伙伴贡献的数据、有行业特征的开源数据进行了…

【vmbox centos7 网络配置】【centos7 glances 安装】【centos7 安装MySQL5.7】

文章目录 vmbox centos7 网络配置centos7 修改镜像地址centos7 安装 glancesCentOS 7 上安装 MySQL 5.7 并进行基本的安全配置使用 firewalld 开放 3306 端口 可以远程连接mysql vmbox centos7 网络配置 目前 能组建集群 虚拟机网络互通&#xff0c;虚拟机能访问外网 创建一个…

鸿蒙:1.入门

概述 简介 鸿蒙操作系统&#xff08;HarmonyOS&#xff09;是华为公司发布的一款智能终端系统&#xff0c;是基于微内核的面向全场景的分布式操作系统。它致力于提供更加安全、高效、低延迟、低功耗的操作体验&#xff0c;可通过技术手段对应用程序和设备进行智能协同&#xf…

软件性能测试有哪几种测试方法?专业性能测试报告出具

软件性能测试是指对软件系统在特定负载条件下的性能进行评估和验证的过程&#xff0c;目的是确保软件在正常使用的情况下能够满足用户的要求&#xff0c;并在稳定的性能水平下运行&#xff0c;在软件开发过程中起到了至关重要的作用&#xff0c;可以确保软件产品的质量和可靠性…

经典卷积神经网络 LeNet

一、实例图片 #我们传入的是28*28&#xff0c;所以加了padding net nn.Sequential(nn.Conv2d(1, 6, kernel_size5, padding2), nn.Sigmoid(),nn.AvgPool2d(kernel_size2, stride2),nn.Conv2d(6, 16, kernel_size5), nn.Sigmoid(),nn.AvgPool2d(kernel_size2, stride2),nn.Flat…

安卓请求服务器[根据服务器的内容来更新spinner]

根据服务器的内容来更新spinner 本文内容请结合如下两篇文章一起看: 腾讯云函数node.js返回自动带反斜杠 腾讯云函数部署环境[使用函数URL] 现在有这样一个需求,APP有一个下拉选择框作为版本选择,因为改个管脚就变成一个版本,客户需求也很零散,所以后期会大量增加版本,这时候每…

三菱PLC标签使用(I/O的映射)与内容

今天&#xff0c;小编继续开始三菱PLC的学习&#xff0c;今天的内容是标签及其标签的内容说明&#xff0c;如果对你有帮助&#xff0c;欢迎评论收藏。 标签的种类&#xff0c;等级&#xff0c;定义 种类 三菱3U的PLC的种类分别为二种&#xff1a;全局标签与局部标签 全局标签…

【大数据】—量化交易实战案例(海龟交易策略)

声明&#xff1a;股市有风险&#xff0c;投资需谨慎&#xff01;本人没有系统学过金融知识&#xff0c;对股票有敬畏之心没有踏入其大门&#xff0c;今天用另外一种方法模拟炒股&#xff0c;后面的模拟的实战全部用同样的数据&#xff0c;最后比较哪种方法赚的钱多。 海龟交易…

交互未来入选“北京市通用人工智能产业创新伙伴计划”模型伙伴

在“开启数智新时代&#xff0c;共享数字新未来”的宏大主题下&#xff0c;2024全球数字经济大会于近日盛大开幕&#xff0c;汇聚全球智慧&#xff0c;共谋数字经济新篇章。大会首日&#xff0c;备受瞩目的人工智能专题论坛率先拉开帷幕&#xff0c;以“应用即未来——大模型赋…

PLC工作原理

PLC&#xff08;可编程逻辑控制器&#xff09;的工作原理简述为&#xff1a;集中采样、集中输出、周期性循环扫描。 西门子PLC 一、集中采样 顺序读取所有输入端子的通断状态&#xff0c;并将所读取的信息存到输入映像寄存器中&#xff0c;此时输入映像寄存器被刷新&#xff…