Java集合进阶(一)

news2025/1/31 3:04:56

文章目录

    • 一、Collection
      • 1. 概述
      • 2. 常用方法
      • 3. 集合遍历
      • 4. 案例
    • 二、List
      • 1. 概述
      • 2. 特有方法
      • 3. 并发修改异常
      • 4. 列表迭代器
      • 5. 增强 for 循环
      • 6. 数据结构
        • 6.1 栈和队列
        • 6.2 数组和链表
      • 7. List 子类特点
        • 7.1 LinkedList

一、Collection

集合类的特点:提供一种存储空间可变的存储模型,存储的数据容量可以随时发生改变。

1. 概述

Collection 集合是单例集合的顶层接口,它表示一组对象,这些对象也称为 Collection 的元素。JDK 不提供此接口的任何直接实现,它提供更具体的子接口(如 Set 和 List)实现。

如何创建 Collection 集合的对象?
① 采用多态的方式;
② 具体的实现类是 ArrayList。

//Test.java

package com.an;

import java.util.ArrayList;
import java.util.Collection;

public class Test {
    public static void main(String[] args) {
        Collection<String> c = new ArrayList<String>();
        c.add("I");
        c.add("love");
        c.add("you");
        System.out.println(c); //[I, love, you]
    }
}

2. 常用方法

在这里插入图片描述

快捷键 Alt + 7 打开一个窗口,能够看到类的所有信息!

3. 集合遍历

Iterator:迭代器,集合的专用遍历方式。
迭代器是通过集合的 Iterator() 方法得到的,所以我们说它是依赖于集合而存在的。

Iterator 中的常用方法:
① next(),返回迭代中的下一个元素;
② hasNext(),如果迭代具有更多元素,则返回 true

//Test.java

package com.an;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class Test {
    public static void main(String[] args) {
        Collection<String> c = new ArrayList<String>();
        c.add("I");
        c.add("love");
        c.add("you");
        Iterator<String> it = c.iterator();
        while (it.hasNext()) {
            String s = it.next();
            System.out.println(s);
        }
    }
}

在这里插入图片描述

集合遍历步骤:
① 通过集合对象获取迭代器对象;
② 通过迭代器对象的 hasNext() 方法判断后面是否还有元素;
③ 通过迭代器对象的 next() 方法获取下一个元素。

4. 案例

需求:创建一个存储学生对象的集合,存储 3 个学生对象,使用程序实现在控制台遍历该集合。
思路:
① 定义学生类;
② 创建 Collection 集合对象;
③ 创建学生对象;
④ 把学生添加到集合;
⑤ 遍历集合(迭代器方式)。

//Student.java

package com.an;

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;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

//Test.java

package com.an;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class Test {
    public static void main(String[] args) {
        Student s1 = new Student("张三", 12);
        Student s2 = new Student("李四", 24);
        Student s3 = new Student("王五", 19);
        Collection<Student> c = new ArrayList<Student>();
        c.add(s1);
        c.add(s2);
        c.add(s3);
        Iterator<Student> it = c.iterator();
        while (it.hasNext()) {
            Student s = it.next();
            System.out.println(s);
        }
    }
}

在这里插入图片描述

二、List

1. 概述

List 集合是有序集合,用户可以精确控制列表中每个元素的插入位置,用户可以通过整数索引访问元素,并搜索列表中的元素,与 Set 集合不同,列表通常允许重复的元素。

List 集合特点:
① 有序:存储和取出的元素顺序一致;
② 可重复:存储的元素可以重复。

List<String> list = new ArrayList<String>();
list.add("I");
list.add("love");
list.add("you");
list.add("love");
System.out.println(list); //[I, love, you, love]

2. 特有方法

在这里插入图片描述

List 集合的遍历是有两种方式的:

//方式一,采用迭代器遍历
Iterator<String> it = list.iterator();
while (it.hasNext()) {
    Student s = it.next();
    System.out.println(s);
}

//方式二,用for循环遍历
for (int i = 0; i < list.size; i++) {
    String s = list.get(i);
    System.out.println(s);
}

3. 并发修改异常

并发修改异常的出现场景:
给出一个集合,遍历该集合,得到每一个元素,看看有没有 “world” 这个元素,如果有,就添加一个 “javaee” 元素。
并发修改异常产生原因:迭代器遍历过程中,通过集合对象修改了集合中元素的长度,造成了迭代器获取元素中判断预期修改值和实际修改值不一致!

这时候我们只能用 for 循环进行遍历,不能使用迭代器遍历,因为在给集合添加元素的时候,迭代器内部会进行一个判断,如果预期修改值和实际修改值不一致,就会抛出并发异常,throw new ConcurrentModificationException()。

//正确应使用for循环遍历
for (int i = 0; i < list.size(); i++) {
    String s = list.get(i);
    if (s.equals("world")) {
        list.add("javaee");
    }
}

也就是说,如果我们所做的改动会影响到集合的长度,那么使用迭代器遍历集合时就会产生并发修改异常,如果长度未变则不会抛出异常!

4. 列表迭代器

ListIterator:列表迭代器。

特点:
(1)通过 List 集合的 listIterator() 方法得到,所以它是 List 集合特有的迭代器;
(2)用于允许程序员沿任一方向遍历列表的列表迭代器,在迭代期间修改列表,并获取列表中迭代器的当前位置。

常用方法:
① next(),返回迭代中的下一个元素;
② hasNext(),如果迭代具有更多元素,则返回 true;
③ previous(),返回列表中的上一个元素;
④ hasPrevious(),如果此列表迭代器在相反方向遍历列表时具有更多元素,则返回 true;
⑤ add(e),将指定的元素插入列表。

ListIterator<String> lit  = l.listIterator();
while (lit.hasPrevious()) {
    String s = lit.previous();
    System.out.println(s);
}

迭代器的指针默认在最左边,所以直接使用逆向遍历是没有元素的,需要先使用正向遍历,反向才能输出,逆向遍历了解即可!

还记得我们上面的并发修改异常,不能用 Iterator 迭代器遍历添加元素,会抛出异常。接下来的 ListIterator 列表迭代器可以帮我们解决这个问题,也就是说,它是可以通过迭代器直接给列表添加元素的。

ListIterator<String> lit = list.listiterator();
while (lit.hasNext()) {
    String s = lit.next();
    if (s.equals("world")) {
        lit.add("javaee");
    }
}
System.out.println(list);

不会抛出并发修改异常,因为它的底层最终会把实际修改值赋值给预期修改值!

5. 增强 for 循环

增强 for:简化数组和 Collection 集合的遍历。

① 实现 Iterator 接口的类允许其对象成为增强型 for 语句的目标;
② 它是 JDK5 之后出现的,其内部原理是一个 Iterator 迭代器。

List<String> list  = new ArrayList<String>();
list.add("My");
list.add("beautiful");
list.add("baby");
for (String s : list) {
    System.out.println(s);
}

以下是一个案例,List 集合存储学生对象并遍历,这里学生类与上面的相同不变,所以只展示测试类。

//Test.java

package com.an;

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

public class Test {
    public static void main(String[] args) {
        Student s1 = new Student("刘德华", 60);
        Student s2 = new Student("张学友", 58);
        Student s3 = new Student("李易峰", 37);
        List<Student> list  = new ArrayList<Student>();
        list.add(s1);
        list.add(s2);
        list.add(s3);
        for (Student s : list) {
            System.out.println(s);
        }
    }
}

在这里插入图片描述
List 集合的遍历有三种方式,增强 for 是最方便的遍历方式,如果在遍历过程中要使用索引,那么我们就用普通的 for 循环即可!

6. 数据结构

数据结构是计算机存储、组织数据的方式,是指相互之间存在一种或多种特定关系的数据元素的集合。精心选择的数据结构可以带来更高的运行或者存储效率。

6.1 栈和队列

① 栈是一种数据先进后出的模型。数据进入栈模型的过程称为进栈,数据离开栈模型的过程称为出栈。
在这里插入图片描述

② 队列是一种数据先进先出的模型。数据从后端进入队列模型的过程称为入队列,数据从前端离开队列模型的过程称为出队列。
在这里插入图片描述

6.2 数组和链表

① 数组是一种查询快,增删慢的模型。查询数据通过索引定位,查询任意数据耗时相同,查询效率高;删除数据时,要将原始数据删除,同时后面的每个数据前移,删除效率低;添加数据时,先将添加位置后的每个数据后移,再添加元素,添加效率极低。

在这里插入图片描述

② 链表是一种增删快、查询慢的模型。链表可以通过修改下一结点的地址,来实现数据的增加和删除操作,速度较快;但是想要查询某一数据,它是要从头(head)开始查询的,显然查询效率很低。

在这里插入图片描述

存储一个数据 A 保存在地址 11 的位置,再存储一个数据 C 保存在地址 37 的位置,再存储一个数据 D 保存在地址 96 的位置,如下图:

在这里插入图片描述

head 是头结点表示开始,^ 是结点指向空地址表示结束!

在数据 AC 之间添加一个数据 B,保存在地址 54 位置,则数据 B 对应的下一个数据地址指向数据 C,数据 A 对应的下一个数据地址指向数据 B,如下图:

在这里插入图片描述
删除操作同理,若要删除数据 BD 之间的数据 C,可以让数据 B 对应的下一个数据地址指向数据 D,再删除数据 C 即可。

7. List 子类特点

List 集合常用子类:ArrayList,LinkedList。

① ArrayList,底层数据结构是数组,查询快,增删慢;
② LinkedList,底层数据结构是链表,查询慢,增删快。

//Test.java

package com.an;

import java.util.ArrayList;
import java.util.LinkedList;

public class Test {
    public static void main(String[] args) {
        ArrayList<String> list  = new ArrayList<String>();
        list.add("s1");
        list.add("s2");
        list.add("s3");
        for (String s : list) {
            System.out.println(s);
        }

        LinkedList<String> li  = new LinkedList<String>();
        li.add("S1");
        li.add("S2");
        li.add("S3");
        for (String s : li) {
            System.out.println(s);
        }
    }
}

7.1 LinkedList

LinkedList 集合的特有功能:

在这里插入图片描述

//Test.java

package com.an;

import java.util.LinkedList;

public class Test {
    public static void main(String[] args) {

        LinkedList<String> li  = new LinkedList<String>();
        li.add("S1");
        li.add("S2");
        li.add("S3");
        li.addFirst("what");
        li.addLast("www");
        System.out.println(li);
        System.out.println(li.getFirst());
        li.remove("S1");
        System.out.println(li);
        li.set(3, "hh");
        System.out.println(li);
    }
}

在这里插入图片描述

你可能会有疑问,这些方法能对列表的开头和结尾实施操作,那如果想操作中间部分怎么办呢?
不要忘了 LinkedList 可是 List 的一个子类,我们这里仅仅讲的是 LinkedList 的特有方法,想操作中间部分直接用 and、remove 和 set 等方法就行了,父类的方法子类都是可以直接拿来用的。

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

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

相关文章

raspberry Pi 连接蓝牙(小爱同学)

参数valueraspberry pi MOdel4B&#xff0c;4Gbbluetooth MOdel小爱同学writeTime2023年 2月11日 下午13&#xff1a;14分raspberry System ModelLinux raspberrypi 5.15.61-v8 #1579 SMP PREEMPT Fri Aug 26 11:16:44 BST 2022 aarch64 GNU/Linux 连接蓝牙 请在小爱同学app上…

Linux 网络编程(UDP模型,libevent库使用)

1.ctags的使用安装命令&#xff1a;sudo apt install exuberant-ctags要使用ctags需要在当前目录生成 tags 文件&#xff0c;可以组织目录内所有.c间函数调用关系生成方法&#xff1a;1.在项目目录下输入命令&#xff1a;ctags ./* -R2.在任意一个文件内使用 ctrlp一些快捷命令…

python入门项目06:批量处理文件

文章目录前言一、理论知识1.1 OS模块1.2 XML的解析二、使用步骤1.引入库2.创建新文件夹3文件操作4 修改文件总结前言 本文要完成的是对于较多XML文档的自动修改&#xff0c;这部分往往在大量的图像标注的修改中会使用到&#xff0c;同时也不要局限于本文中所提到的使用场景。 …

springbboot随笔

无效的源发行版问题 改springboot版本 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http:…

高校竞赛信息管理系统

摘要随着当今社会的发展&#xff0c;时代的进步&#xff0c;各行各业也在发生着变化&#xff0c;比如高校竞赛信息管理这一方面&#xff0c;利用网络已经逐步进入人们的生活。传统的高校竞赛信息管理&#xff0c;都是学生去学校查看竞赛信息然后再进行报名&#xff0c;这种传统…

linux面试高级篇

题目目录1.虚拟机常用有几种网络模式&#xff1f;请简述其工作原理或你个人的理解&#xff1f;2. Dockerfile中最常见的指令是什么&#xff1f;3.docker网络模式有哪些&#xff1f;4.Kubernetes有哪些核心组件这些组件负责什么工作&#xff1f;5. Pod是什么&#xff1f;6.描述一…

H264编码原理

1.什么是音视频&#xff1f; 比如我们下载的mp4格式&#xff08;还有rmvb、avi&#xff09;的电影 2.什么是h264&#xff1f; 对摄像头采集的每一帧视频需要进行编码&#xff0c;由于视频中存在空间和时间的冗余&#xff0c; 需要用算法来去除这些冗余。H264是专门去除这些冗…

SQL基础语句小结

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; 目录 一、SQL概述 1.简介 2.格式语法 3.SQL分类 二、DDL操作数据库 1.创建数据库 2.查询与使用 3.删除数据库 三、DDL:操作表 (1)数据类型 (2)创建表 (3)查询当前数据库的表 (4)删除表 (5)修改表 四、DML…

小鹏汽车「错失」智能化好牌

本周&#xff0c;作为小鹏品牌销售主力的P7正式迎来改款发布。3月6日&#xff0c;小鹏P7i迎来首发&#xff0c;作为P7的改款车型&#xff0c;在整车电子架构、三电系统、智能化硬件配置上都进行了全面升级。 基于和G9相同的双Orin-X计算平台两个盲区激光雷达&#xff0c;P7i实现…

RocketMQ基础篇(一)

目录一、发送消息类型1、同步消息2、异步消息3、单向消息4、顺序消费5、延迟消费二、消费模式1、集群模式2、广播模式3、消费模式扩展4、如何配置三、其他用法1、事务消息2、过滤消息1&#xff09;Tag过滤2&#xff09;SQL方式过滤源码放到了GitHub仓库上&#xff0c;地址 http…

HyperLPR3车牌识别-Android-SDK光速部署与使用

简介HyperLPR在2023年初已经更新到了v3的版本&#xff0c;该版本与先前的版本一样都是用于识别中文车牌的开源图像算法项目&#xff0c;最新的版本的源码可从github中提取&#xff1a;https://github.com/szad670401/HyperLPRHyperLPR-Android-SDK for JitPackHyperLPR3的官方源…

Prim算法和Kruskal算法到底哪个好?

Prim和Kruskal有啥区别&#xff1f;到底哪个好&#xff1f; 今天做了一道最小生成树的题&#xff0c;发现了一点猫腻&#xff01; 题目在这里 &#xff1a; 《修路问题1》 文章目录Prim和Kruskal有啥区别&#xff1f;到底哪个好&#xff1f;先说结论PrimKruskal修路问题1——…

不好!有敌情,遭到XSS攻击【网络安全篇】

XSS&#xff1a;当一个目标的站点&#xff0c;被我们用户去访问&#xff0c;在渲染HTMl的过程中&#xff0c;出现了没有预期到的脚本指令&#xff0c;然后就会执行攻击者用各种方法注入并执行的恶意脚本&#xff0c;这个时候就会产生XSS。 涉及方&#xff1a; 用户&#xff0…

Linux端安装MySQL并实现远程连接Navicat

文章目录Linux端安装MySQL&#xff08;centos版本&#xff09;Linux端安装MySQL&#xff08;centos版本&#xff09; 1、先将MySQL需要的四个rpm安装包上传上去&#xff0c;这里可以使用Xftp软件或者是通过window端使用ftp文件传输方式上传到Linux端&#xff0c;这里选择Xftp来…

基于JavaWeb学生选课系统开发与设计(附源码资料)

文章目录1. 适用人群2. 你将收获3.项目简介4.技术实现5.运行部分截图5.1.管理员模块5.2.教师模块5.3.学生模块1. 适用人群 本课程主要是针对计算机专业相关正在做毕业设计或者是需要实战项目的Java开发学习者。 2. 你将收获 提供&#xff1a;项目源码、项目文档、数据库脚本…

远程办公18年,把一个开源工具变成了价值 75亿美元的跨国企业

把自己的兴趣做成了一份事业&#xff0c;把一个开源工具发展成为一家价值75亿美元的跨国企业&#xff0c;而且还是那种员工做梦都想进入的公司&#xff0c;真正实现了功成名就&#xff0c;这或许是所有程序员的梦想吧。 先来看看这家公司的福利&#xff1a; 员工拥有没有限制的…

git快速入门(1)

1 git的下载与安装1&#xff09;下载git安装包下载路径&#xff1a;https://git-scm.com/我的操作系统是window&#xff0c;64位的&#xff0c;我下载的Git-2.33.0-64-bit.exe&#xff0c;从官网下载或者从网址下载链接&#xff1a;链接地址&#xff1a;https://pan.baidu.com/…

【MySQL】P8 多表查询(2) - 连接查询 联合查询

连接查询以及联合查询多表查询概述连接查询内连接隐式内连接显式内连接外连接左外连接右外连接自连接联合查询多表查询概述 建表语句见上一篇博文&#xff1a;https://blog.csdn.net/weixin_43098506/article/details/129402302 e.g.e.g.e.g. select * from emp, dept where e…

深入分析@Configuration源码

文章目录一、源码时序图1. 注册ConfigurationClassPostProcessor流程源码时序图2. 注册ConfigurationAnnotationConfig流程源码时序图3. 实例化流程源码时序图二、源码解析1. 注册ConfigurationClassPostProcessor流程源码解析&#xff08;1&#xff09;运行案例程序启动类Conf…

Python安装、断点调试

一、安装Python方法 1.1 在Microsoft Store微软商店中搜索Python安装&#xff08;推荐&#xff09; 或直接在cmd中Python运行 已经安装了就显示版本号&#xff0c; 如果没有安装过&#xff0c;会直接跳到微软商店 1.2 在python官网中找最新版下载安装 二、VSCODE中运行与断点…