Java——集合(一)

在这里插入图片描述

前言:
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.mzph.cn/web/32632.shtml

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

相关文章

Vitis Accelerated Libraries 学习笔记--OpenCV 安装指南

目录 1. 简介 2. 安装过程 2.1 安装准备 2.2 编译并安装 XRT 2.2.1 下载 XRT 源码 2.2.2 安装依赖项 2.2.3 构建 XRT 2.2.4 打包 DEB 2.2.5 安装 XRT 2.3 编译并安装 OpenCV 2.3.1 下载 OpenCV 源码 2.3.2 创建目录 2.3.3 设置环境变量 2.3.4 构建 opencv 3. 总…

ping命令返回结果实例分析

测试在各相关情况下ping命令回复信息。 网络环境搭建如下图所示&#xff1a; 【1】R1、R2、PC1和PC2没有配置&#xff0c;测试ping命令回复 在路由器没有配置端口IP地址和路由&#xff0c;PC没有配置IP地址、子网掩码和网关的情况下&#xff0c;PC2 ping 192.168.1.1。 在PC没…

加速鸿蒙生态共建,蚂蚁mPaaS助力鸿蒙原生应用开发创新

6月21日-23日&#xff0c;2024华为开发者大会&#xff08;HDC 2024&#xff09;如期举行。在22日的【鸿蒙生态伙伴SDK】分论坛中&#xff0c;正式发布了【鸿蒙生态伙伴SDK市场】&#xff0c;其中蚂蚁数科旗下移动开发平台mPaaS&#xff08;以下简称&#xff1a;蚂蚁mPaaS&#…

QtCreator/VS中制作带有界面的动态库

1、首先创建动态库项目 class UNTITLED25_EXPORT Untitled25 {public:Untitled25(); };2、直接右键创建同名窗口类进行覆盖 3、引入global头文件并添加到处宏</

【SSM】

Spring常见面试题总结 Spring 基础 什么是 Spring 框架? Spring 是一款开源的轻量级 Java 开发框架&#xff0c;旨在提高开发人员的开发效率以及系统的可维护性。 我们一般说 Spring 框架指的都是 Spring Framework&#xff0c;它是很多模块的集合&#xff0c;使用这些模块…

转让神州开头的无区域科技公司需要多少钱

您好&#xff0c;我公司现有2家无区域神州名称的公司转让。所谓无区域名称是公司名称中不带有行政区划、及行业特点的公司名称&#xff0c;都是需要在工商总,局核准名称的&#xff0c;对于民营企业来说也比较喜欢这种名称名称很大气&#xff0c;现在重核更严格了&#xff0c;所…

Docker如何安装redis

目录 1. 拉取redis的镜像文件 2. 创建redis的容器卷 3. 准备reids的配置文件 4. 以配置文件启动redis 1. 拉取redis的镜像文件 # 默认安装最新版本 如果需要指定版本 docker pull redis:版本号 docker pull redis 详细版本请看dockerhub的官网&#xff1a; hub.docker…

MySQL中的ibd2sdi—InnoDB表空间SDI提取实用程序

ibd2sdi 是一个用于从 InnoDB 表空间文件中提取序列化字典信息&#xff08;Serialized Dictionary Information, SDI&#xff09;的实用程序。这个实用程序可以用于提取存储在持久化 InnoDB 表空间文件中的 SDI 数据。 可以对以下类型的表空间文件使用 ibd2sdi&#xff1a; 每…

DDS信号的发生器(验证篇)——FPGA学习笔记8

前言&#xff1a;第一部分详细讲解DDS核心框图&#xff0c;还请读者深入阅读第一部分&#xff0c;以便理解DDS核心思想 三刷小梅哥视频总结&#xff01; 小梅哥https://www.corecourse.com/lander 一、DDS简介 DDS&#xff08;Direct Digital Synthesizer&#xff09;即数字…

OneNote for Windows 10 下载

OneNote for Windows 10 安装 1.在浏览器中输入地址&#xff1a;https://apps.microsoft.com/detail/9wzdncrfhvjl?hlzh-cn&glUS2OneNote for Windows 10 - 在 Windows 上免费下载并安装 |Microsoft StoreOneNote 是用于在设备上捕获和组织你的一切内容的数字笔记本。快速…

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

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

轻松重命名Windows用户Users目录下的文件夹名称

设置系统还原点 为避免设置失败&#xff0c;需提前准备好系统还原点以备份恢复系统。 打开系统属性&#xff1a; 在“系统保护”选项卡中&#xff0c;选择你想要保护的系统驱动器&#xff08;通常是C:驱动器&#xff09;。 点击“配置”按钮。 在弹出的窗口中&#xff0c;选…

【Python机器学习】NMF——将NMF应用于模拟信号数据

假设我们对一个信号感兴趣&#xff0c;它是由三个不同信号源合成的&#xff1a; import matplotlib.pyplot as plt import mglearnSmglearn.datasets.make_signals() plt.figure(figsize(6,1)) plt.plot(S,-) plt.xlabel(Time) plt.ylabel(Signal) plt.show()不幸的是&#xff…

大厂面试官问我:布隆过滤器有不能扩容和删除的缺陷,有没有可以替代的数据结构呢?【后端八股文二:布隆过滤器八股文合集】

往期内容&#xff1a; 面试官问我&#xff1a;Redis处理点赞&#xff0c;如果瞬时涌入大量用户点赞&#xff08;千万级&#xff09;&#xff0c;应当如何进行处理&#xff1f;【后端八股文&#xff08;1&#xff09;】-CSDN博客 本文为【布隆过滤器八股文合集】初版&#xff0c…

数据结构:冒泡排序,选择排序,插入排序,希尔排序的实现分析

✨✨小新课堂开课了&#xff0c;欢迎欢迎~✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 小新的主页&#xff1a;编程版小新-CSDN博客 1.冒泡排序 1.1算法思想 冒泡排序的基本思想就是&a…

字节跳动:从梦想之芽到参天大树

字节跳动掌舵人&#xff1a;张一鸣 2012年&#xff1a;梦想的起点&#xff1a;在一个阳光明媚的早晨&#xff0c;北京的一座普通公寓里&#xff0c;一位名叫张一鸣的年轻人坐在电脑前&#xff0c;眼中闪烁着坚定的光芒。他的心中有一个梦想——通过技术改变世界&#xff0c;让…

嵌入式实验---实验六 I2C传输实验

一、实验目的 1、掌握STM32F103I2C传输程序设计流程&#xff1b; 2、熟悉STM32固件库的基本使用。 二、实验原理 1、本案例利用I/O端口通过KEY01按键来控制STM32F103R6向24C02写入“hello”&#xff0c;通过另外一个按键KEY02来控制STM32F103R6从24C02读取“hello”&#x…

又一个前后端分离的整合了OpenAI大模型的高并发、高性能和可扩展的项目完结了,写到简历上,嘎嘎强!

大家好&#xff0c;我是冰河~~ 经过四个多月的坚持&#xff0c;《分布式IM即时通讯系统》终于完结了&#xff0c;也感谢大家这四个多月以来的坚持和陪伴&#xff0c;也相信大家在《分布式IM即时通讯系统》专栏中&#xff0c;学到了不少知识和技术。接下来&#xff0c;我们就一…

[C++][设计模式]介绍

目录 1.设计模式1.何为设计模式&#xff1f;2.深入理解面向对象3.软件设计的目标4.三大模式及其特点5.设计模式分类 2.面向对象设计原则1.为什么要面向对象2.重新认识面向对象3.面向对象设计原则4.C对象模型 3.重构1. 重构获得模式(Refactoring to Patterns)2.重构关键技法 4.代…

【Oracle】实验二 体系结构、存储结构与各类参数

【实验目的】 理解Oracle体系结构了解初始化参数文件以及初始化参数的含义掌握查看三类数据字典视图和动态性能视图的方法 【实验内容】 如何查看初始化参数&#xff1f;有哪几种方法&#xff1f;初始化参数文件有几种&#xff1f;默认的保存位置在哪里&#xff1f;在SQL*Pl…