Java——集合(一)

news2025/1/19 2:56:44

在这里插入图片描述

前言:
Collection集合,List集合


文章目录

  • 一、Collection 集合
    • 1.1 集合和数组的区别
    • 1.2 集合框架
    • 1.3 Collection 集合常用方法
    • 1.4 Collction 集合的遍历
  • 二、List 集合
    • 2.1 List 概述
    • 2.2 List集合的五种遍历方式
    • 2.3 List集合的实现类

一、Collection 集合

1.1 集合和数组的区别

  1. 大小
    • 数组:大小是固定的。在创建数组时,需要指定数组的大小,一旦创建,数组的大小就不能改变。
    • 集合:大小是可变的。集合类(如 ArrayList、HashSet 等)可以根据需要动态地增加或减少元素。
  2. 类型
    • 数组:可以存储基本数据类型(如 int、char)和对象类型。
    • 集合:只能存储对象类型,不能直接存储基本数据类型。不过,可以使用基本数据类型的包装类(如 Integer、Character)。
  3. 存储结构
    • 数组:连续的内存空间,元素可以通过索引直接访问,访问速度快。
    • 集合:底层实现可能是链表、哈希表、红黑树等,具体取决于集合的实现类。
  4. 功能
    • 数组:没有预定义的方法来操作数组元素,只能通过基本的循环和手动实现操作(如添加、删除、查找等)。
    • 集合:提供了丰富的预定义方法来操作集合元素,如添加(add)、删除(remove)、查找(contains)、迭代(iterator)等。

1.2 集合框架

在这里插入图片描述
Collection 接口: 所有集合框架中的接口都继承自这个接口。它有以下几个子接口:

  • List: 有序集合,允许重复元素。
  • Set: 不允许重复元素。
  • Queue: 先进先出(FIFO)的集合。

Map 接口: 一种键值对映射的集合,不属于 Collection 接口的子接口。


1.3 Collection 集合常用方法

Collection 接口中定义的这些方法是抽象方法,具体的实现由实现了 Collection 接口的具体类来完成。

方法名说明
boolean add(E e)添加元素
boolean remove(Object o)从集合中移除指定的元素
boolean removeIf(Predicate<? super E> filter)根据条件进行移除
void clear()清空集合中的元素
boolean contains(Object o)判断集合中是否存在指定的元素
boolean isEmpty()判断集合是否为空
int size()集合的长度,也就是集合中元素的个数

1.4 Collction 集合的遍历

  1. 使用增强型 for 循环

    增强型 for 循环可以很方便地遍历集合,它适用于所有实现了 Iterable 接口的集合类,包括 Collection 接口的所有实现类。

    import java.util.ArrayList;
    import java.util.Collection;
    
    public class CollectionTraversalExample {
        public static void main(String[] args) {
            Collection<String> collection = new ArrayList<>();
            collection.add("Apple");
            collection.add("Banana");
            collection.add("Orange");
    
            // 使用增强型 for 循环遍历集合
            for (String fruit : collection) {
                System.out.println(fruit);
            }
        }
    }
    
  2. 使用迭代器(Iterator)

    迭代器是遍历集合的一种标准方式,它允许按顺序访问集合中的每个元素,并且可以在遍历过程中进行元素的增删操作。

    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Iterator;
    
    public class CollectionTraversalExample {
        public static void main(String[] args) {
            Collection<String> collection = new ArrayList<>();
            collection.add("Apple");
            collection.add("Banana");
            collection.add("Orange");
    
            // 调用集合的 iterator() 方法来获取该集合的迭代器。迭代器是一个对象,它提供了顺序访问集合元素的方法,并且允许在遍历过程中进行安全的元素删除操作。
            Iterator<String> iterator = collection.iterator();
    
            // 使用 hasNext() 方法判断当前位置是否有元素可以被取出
            while (iterator.hasNext()) {
            	//next()获取当前位置的元素,将迭代器对象移向下一个索引位置
                String fruit = iterator.next();
                System.out.println(fruit);
            }
        }
    }
    
  3. forEach 方法,传入 lambda 表达式

    import java.util.ArrayList;
    import java.util.Collection;
    
    public class CollectionTraversalExample {
        public static void main(String[] args) {
            Collection<String> collection = new ArrayList<>();
            collection.add("Apple");
            collection.add("Banana");
            collection.add("Orange");
            
            // 或者使用 forEach 方法,传入 lambda 表达式,fruit -> System.out.println(fruit) 是匿名内部类对象
            collection.forEach(fruit -> System.out.println(fruit));
        }
    }
    

    在 forEach 方法中,我们传入一个 Lambda 表达式 fruit -> System.out.println(fruit)。这个 Lambda 表达式定义了一个行为,即对每个元素执行 System.out.println(fruit) 操作。

注意事项

  • 并发修改异常:在使用迭代器遍历集合时,如果在遍历过程中修改了集合的结构(如添加、删除元素),会抛出 ConcurrentModificationException 异常。这种情况下,可以使用迭代器的 remove() 方法来安全地删除元素。
Iterator<String> iterator = collection.iterator();
while (iterator.hasNext()) {
    String fruit = iterator.next();
    if (fruit.equals("Banana")) {
        iterator.remove(); // 安全删除元素
    }
}

二、List 集合

2.1 List 概述

List 集合的特点:

  1. 有序性: List 是有序集合,它维护元素的插入顺序。可以通过索引访问元素,索引从 0 开始,依次递增。

  2. 允许重复元素: 与 Set 不同,List 允许存储重复的元素。

List 特有方法:

方法名描述
void add(int index,E element)在此集合中的指定位置插入指定的元素
E remove(int index)删除指定索引处的元素,返回被删除的元素
E set(int index,E element)修改指定索引处的元素,返回被修改的元素
E get(int index)返回指定索引处的元素
int indexOf(Object o)indexOf 方法返回指定元素第一次出现在列表中的索引,如果列表不包含该元素,则返回 -1
int lastIndexOf(Object o)lastIndexOf 方法返回指定元素最后一次出现在列表中的索引,如果列表不包含该元素,则返回 -1
boolean addAll(int index, Collection<? extends E> c)在指定位置 index 处将另一个集合 c 中的所有元素插入到列表中。如果 c 为空集合,此方法不会改变列表,返回 false
void sort(Comparator<? super E> c)使用指定的比较器 c 对列表进行排序。如果没有提供比较器,则列表中的元素必须实现 Comparable 接口以便进行自然排序

2.2 List集合的五种遍历方式

  • 迭代器
  • 增强for
  • Lambda表达式
  • 普通for循环
  • 列表迭代器

List接口继承自Collection接口,相比于CollectionList 多出两种遍历方式:普通for循环和使用 ListIterator

  1. 使用普通的 for 循环

普通的 for 循环可以通过索引来遍历 List 集合。这种方式适用于需要获取每个元素的索引或需要条件判断的情况。

List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Orange");

for (int i = 0; i < list.size(); i++) {
    String element = list.get(i);
    System.out.println(element);
}
  1. 使用 ListIterator

ListIteratorIterator 的子接口,它扩展了迭代器的功能,支持双向遍历、修改元素和获取索引等操作。适用于需要在遍历过程中修改元素或者双向遍历的场景。

ListIterator<String> listIterator = list.listIterator();
while (listIterator.hasNext()) {
    String element = listIterator.next();
    System.out.println(element);
}

使用 ListIterator 进行操作

  1. 正向遍历: 使用 hasNext() 和 next() 方法遍历列表。

    	while (iterator.hasNext()) {
    	    String element = iterator.next();
    	    System.out.println(element);
    	}
    
  2. 反向遍历: 使用 hasPrevious() 和 previous() 方法反向遍历列表。

    while (iterator.hasPrevious()) {
        String element = iterator.previous();
        System.out.println(element);
    }
    
  3. 修改元素: 可以使用 set() 方法修改当前遍历到的元素。

    // 修改第一个元素为 "Grapes"
    iterator.next(); // 移动到第一个元素
    iterator.set("Grapes");
    
  4. 添加元素: 可以使用 add() 方法在当前位置之前添加新元素。

    // 在当前位置之前添加 "Mango"
    iterator.add("Mango");
    
  5. 删除元素: 可以使用 remove() 方法删除当前位置的元素(需要先调用 next() 或 previous() 方法)。

    // 删除当前位置的元素
    iterator.next();
    iterator.remove();
    

2.3 List集合的实现类

在 Java 中,List 是一个接口,它有多个常见的实现类,每种实现类都有其独特的特性和适用场景。以下是几种常见的 List 接口的实现类:

  1. ArrayList

    • ArrayListList 接口的可变大小数组实现。
    • 它提供了动态增长的能力,支持快速随机访问元素。
    • 插入和删除元素可能比较慢,因为需要调整内部数组的大小。
    • 适用于需要快速访问元素而对插入和删除操作性能要求不那么苛刻的场景。
    List<String> arrayList = new ArrayList<>();
    

    ArrayList 的扩容机制如下:

    1. 初始容量
      创建ArrayList对象的时候,他在底层先创建了一个长度为0的数组。只有当第一个元素被添加时,ArrayList 才会分配默认的初始容量,这个默认初始容量通常是 10。

    2. 添加元素时的自动扩容
      每次向 ArrayList 添加元素时,它会检查当前元素数量是否已经达到容量上限。如果当前元素数量等于或超过当前容量(即 size() >= capacity),就会触发扩容操作。

    3. 扩容机制

      • 机制一: 扩容操作会创建一个新的数组,通常新容量为原来的 1.5 倍(有时候是倍增,具体取决于 JVM 的实现)。例如,如果当前容量为 10,则扩容后的容量可能为 15。
      • 机制二: 如果一次性添加多个数据,新添加的数据加上原来的数据还是超过了1.5倍的容量,那么新创建数组的长度以实际为准。例如,原有的容量为10,并且已满,现在我们要再添加10个数据,即使根据机制一还是不够,那么新数组的容量就变为20。
      • 然后,将原来数组中的所有元素复制到新的数组中。
      • 最后,原来的数组会被丢弃(即成为垃圾对象等待垃圾回收)。

  1. LinkedList

    • LinkedListList 接口的双向链表实现。
    • 它提供了快速的插入和删除操作,但访问速度相对较慢(需要从头或尾部遍历链表)。
    • 支持队列和双端队列操作,如 offerFirst(), offerLast(), pollFirst(), pollLast() 等。
    • 适用于需要频繁进行插入和删除操作,而对随机访问元素的要求不高的场景。
    List<String> linkedList = new LinkedList<>();
    
  2. Vector

    • Vector 是 Java 集合框架中较早的实现类,现在较少使用。
    • ArrayList 类似,它也是一个动态增长的数组实现。
    • 它是线程安全的,所有方法都使用 synchronized 进行了同步。
    • 适用于需要线程安全且不需要高性能的场景。
    List<String> vector = new Vector<>();
    

在这里插入图片描述

如果你喜欢这篇文章,点赞👍+评论+关注⭐️哦!
欢迎大家提出疑问,以及不同的见解。

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

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

相关文章

ubuntu 18.04 server源码编译安装freeswitch 1.10.11——筑梦之路

前言 这里主要编译支持语音通话、视频通话、短信、webrtc功能的PBX。 安装编译工具包和依赖包 sudo apt-get updatesudo apt-get install -y autoconf git libtool g zlib1g-dev libjpeg-dev libcurl4-openssl-dev libspeex-dev libldns-dev libedit-dev libssl-dev pkg-con…

学校报修管理系统

摘 要 随着社会的发展和技术的进步&#xff0c;学校报修管理系统在学校设备维修工作中扮演着至关重要的角色。该系统的设计和实现对于提高学校设备维修效率、优化资源管理、提升用户体验具有重要意义。本论文基于SpringBoot框架&#xff0c;设计并实现了一套学校报修管理系统。…

DWG转PDF字体研究记录

1.前言 最近需要对PDF中的符合业务规则的文字进行提取&#xff0c;发现有些文字不是文字信息形式存储&#xff0c;而是polyline形式表达&#xff0c;意味着仅仅有形体上的表达&#xff0c;丢失了原本的文字信息。 经过沟通得知&#xff0c;这些PDF是AutoCAD软件导出的&#xf…

2-3KW户储、家储逆变器设计资料

储能电源方案双向逆变器板资料&#xff0c;原理文件&#xff0c;PCB文件&#xff0c;源代码&#xff0c;bom清单。 bom表&#xff1a; PCB&#xff1a; 变压器电感 2-3KW户储、家储逆变器设计通常需要考虑以下几个方面&#xff1a; 输入电压范围&#xff1a;逆变器需要能够适应…

数据库新技术【分布式数据库】

文章目录 第一章 概述1.1 基本概念1.1.1 分布式数据库1.1.2 数据管理的透明性1.1.3 可靠性1.1.4 分布式数据库与集中式数据库的区别 1.2 体系结构1.3 全局目录1.4 关系代数1.4.1 基操1.4.2 关系表达式1.4.3 查询树 第二章 分布式数据库的设计2.1 设计策略2.2 分布设计的目标2.3…

Apriori 处理ALLElectronics事务数据

通过Apriori算法挖掘以下事务集合的频繁项集&#xff1a; 流程图 代码 # 导入必要的库 from itertools import combinations# 定义Apriori算法函数 def apriori(transactions, min_support, min_confidence):# 遍历数据&#xff0c;统计每个项的支持度 item_support {}for tr…

数学建模---包汤圆问题引发的思考

1.前言 &#xff08;1&#xff09;虽然我学习这个数学建模已经很长一段时间了&#xff0c;但是我认为自己始终是一个门外汉&#xff0c;只是学习了一下这个基本的建模软件使用方法&#xff0c;以及一些相关的知识&#xff0c;虽然参加了一次这个电工杯的比赛&#xff0c;但是这…

编译——链接

在ANSI C的任何一种实现中&#xff0c;存在两个不同的环境&#xff1a; 第一种就是编译环境&#xff0c;在这个环境中源代码被转换成可执行的机器指令&#xff08;二进制指令&#xff09; 第二种是执行环境&#xff0c;它用于实现执行代码 翻译环境 其实翻译环境就是指编译和链…

数据结构和算法(2)---- Stack 的原理和实现

Stack 的定义和结构 栈(Stack)是仅限于在表尾进行插入和删除的线性表 我们把允许插入和删除的一端称为栈顶(top)&#xff0c;另一端称为栈底(bottom)&#xff0c;不含任何元素的栈称为空栈&#xff0c;栈也被称为先进后出(Last In First Out)的线性表&#xff0c;简称LIFO结构…

RabbitMQ消息队列 安装及基本介绍

一.MQ介绍 Message Queue &#xff08;MQ&#xff09;是一种跨进程的通信机制&#xff0c;用于在系统之间进行传递消息。MQ作为消息中间件&#xff0c;可以进行异步处理请求&#xff0c;从而减少请求响应时间和解耦 1.1 应用场景 1.1.1 系统之间通过MQ进行消息通信&#xff0…

如何给MySQL设置远程访问?(官方校正版)

在现代数据驱动的世界中&#xff0c;数据库的灵活性和可访问性变得尤为重要。设置MySQL的远程访问不仅仅是为了方便&#xff0c;还为企业和开发者提供了多种优势。无论是在分布式团队协作、跨地域数据管理&#xff0c;还是在系统集成和实时数据访问方面&#xff0c;远程访问都能…

荣耀社招 测试工程师 技术一面

面经哥只做互联网社招面试经历分享&#xff0c;关注我&#xff0c;每日推送精选面经&#xff0c;面试前&#xff0c;先找面经哥 1、自我介绍 2、具体介绍做过的项目&#xff0c;支撑的事什么业务 3、防火墙测试时、平时有写脚本或者使用第三方工具吗 4、对互联网的安全测试规…

网络知识 思维导图

计算机网络基础知识点多且杂&#xff0c;想要系统地学习&#xff0c;思维导图肯定是必不可少的。今天整理了38张思维导图&#xff0c;帮助你轻松理清思路&#xff0c;快速掌握关键内容。建议你收藏起来慢慢看&#xff0c;在看过之后最好能重新动手画一画&#xff0c;让计算机网…

图的学习.

目录 一、图的基本概念 1.1图的种类 1.2顶点的度、入度和出度 1.3边的权和网 1.4路径、路径长度和回路 二、图的存储结构 2.1邻接矩阵法 2.2邻接表法 2.3十字链表 2.4邻接多重表 三、图的遍历 3.1广度优先搜索 3.2深度优先搜索 四、图的应用 4.1最小生成树 4.1.…

音视频开发29 FFmpeg 音频编码- 流程以及重要API,该章节使用AAC编码说明

此章节的一些参数&#xff0c;需要先掌握aac的一些基本知识&#xff1a;​​​​​​aac音视频开发13 FFmpeg 音频 --- 常用音频格式AAC&#xff0c;AAC编码器&#xff0c; AAC ADTS格式 。_ffmpeg aac data数据格式-CSDN博客 目的&#xff1a; 从本地⽂件读取PCM数据进⾏AAC格…

mysql启动时遇到:本地计算机上的MySQL服务启动后停止

1.问题重述&#xff1a; 今早启动数据库时发现无法启动&#xff0c;报错&#xff1a;本地计算机 上的 MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止。 2.解决方案&#xff1a; 1.数据备份&#xff1a; 2.在bin目录下&#xff0c;命令行中输入 mysqld …

1.3 Sqoop 数据同步工具详细教程

Apache Sqoop 是一个开源工具&#xff0c;用于在 Apache Hadoop 和关系型数据库&#xff08;如 MySQL、Oracle、PostgreSQL 等&#xff09;之间高效传输数据。Sqoop 可以将结构化数据从关系型数据库导入到 Hadoop 的 HDFS、Hive 和 HBase 中&#xff0c;也可以将数据从 Hadoop …

[SAP ABAP] 追加内表数据

向内表中逐条追加数据记录 语法格式 APPEND <wa> TO <itab>. <wa>&#xff1a;代表工作区 <itab>&#xff1a;代表内表 示例1 结果显示&#xff1a; 将一个内表中的所有数据记录添加到另一个内表中 语法格式 APPEND LINES OF <itab1> TO <…

基于YOLOV5的车辆行人检测系统的设计与实现(PyQT页面+YOLOv5模型)

简介 随着智能交通系统的发展,实时检测车辆和行人变得越来越重要,以提高道路安全和交通管理效率。我们开发了一种基于YOLOv5目标检测模型的车辆与行人检测系统。本报告将详细介绍该系统的实际应用与实现,包括系统架构、功能实现、使用说明、检测示例、数据集获取与介绍、YO…

BUG cn.bing.com 重定向的次数过多,无法搜索内容

BUG cn.bing.com 重定向的次数过多&#xff0c;无法搜索内容 环境 windows 11 edge浏览器详情 使用Microsoft Edge 必应搜索显示"cn.bing.com"重定向次数过多&#xff0c;无法进行正常的检索功能 解决办法 检查是否开启某些科_学_上_网&#xff08;翻_墙&#xf…