当前位置: 首页 > news >正文

Java中常用的集合及方法(2)

在Java(JDK8)中,集合(Collection)是数据结构的实现,用于存储和操作对象集合。

集合(Collection)中包含的一般类或接口:


在这其中呢,我们经常使用的其实就是List、Set、Queue这三个接口及其实现类,那我们分别介绍一下这些接口/类的常用方法和使用中需要注意的地方:

1、List(接上级--常用方法示例补充)

1.4 常用的方法

1.4.1 List中的方法

1.4.2 ArrayList

ArrayList中的方法及使用

使用示例:

1、构造方法:

// 创建一个空的 ArrayList  
ArrayList<String> list1 = new ArrayList<>();  // 创建一个包含初始元素的 ArrayList  
ArrayList<Integer> list2 = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));  // 创建一个具有指定初始容量的 ArrayList  
ArrayList<Double> list3 = new ArrayList<>(10);

也有许多使用下列方法进行ArrayList集合对象的创建

ArrayList<Double> list4 = Arrays.asList("Element 3", "Element 4");

注意:

(此时创建的是java.util.Arrays.ArrayList的内部类实例而非java.util.ArrayList,此处需注意甄别

还需注意:此方法创建的集合是一个固定大小的集合,所以不能做增减元素的操作(否则会抛出异常:java.lang.UnsupportedOperationException)

但可在不改变集合长度的基础上对集合内部元素进行修改

List<String> list = Arrays.asList("Element 3", "Element 4");
list.set(0,"test");
System.out.println(list.get(0));// 打印结果: test

2、添加元素


ArrayList<String> list = new ArrayList<>();  // 添加单个元素到列表末尾  
list.add("Element 1");  // 在指定位置插入元素  
list.add(1, "Element 2");  // 添加集合中的所有元素到列表末尾  
list.addAll(Arrays.asList("Element 3", "Element 4"));

3、获取元素

// 获取指定位置的元素  
String element = list.get(1); // 注意:索引从0开始  
System.out.println(element); // 输出:Element 2

4、删除元素

// 删除指定位置的元素  
list.remove(1);  // 删除首次出现的指定元素  
list.remove("Element 3");  // 删除所有出现的指定元素(从Java 8开始)  
list.removeIf(s -> s.equals("Element 4"));  // 清空列表  
list.clear();// removeAll(Collection<?> c) 方法:从列表中移除指定集合中包含的所有元素。ArrayList<String> list = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry"));  
ArrayList<String> toRemove = new ArrayList<>(Arrays.asList("Banana", "Cherry"));  
list.removeAll(toRemove); // 移除所有在toRemove列表中的元素  
System.out.println(list); // 输出: [Apple]  // retainAll(Collection<?> c) 
// 仅保留列表中指定集合中也包含的元素(即移除列表中不在指定集合中的元素)
ArrayList<String> list = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry"));  
ArrayList<String> toRetain = new ArrayList<>(Arrays.asList("Apple", "Cherry"));  
list.retainAll(toRetain); // 仅保留在toRetain列表中的元素  
System.out.println(list); // 输出: [Apple, Cherry]  

5、查看元素

// 检查列表是否包含特定元素  
boolean containsElement = list.contains("Element 1");  
System.out.println(containsElement); // 输出:true(如果列表包含该元素)  // 检查列表是否为空  
boolean isEmpty = list.isEmpty();  
System.out.println(isEmpty); // 输出:false(如果列表不为空)// indexOf(Object o): 返回指定元素在列表中首次出现的索引,如果列表不包含该元素,则返回-1
ArrayList<String> list = new ArrayList<>();  
list.add("Apple");  
list.add("Banana");  
int index = list.indexOf("Banana"); // 获取Banana首次出现的索引  
System.out.println(index); // 输出: 1  

6、获取集合大小

// 获取列表中的元素数量  
int size = list.size();  
System.out.println(size); // 输出列表的大小

7、遍历

// 使用 for-each循环遍历列表  
for (String s : list) {  System.out.println(s);  
}  // 使用迭代器遍历列表  
Iterator<String> iterator = list.iterator();  
while (iterator.hasNext()) {  String s = iterator.next();  System.out.println(s);  
}  // 使用for循环和索引遍历列表  
for (int i = 0; i < list.size(); i++) {  String s = list.get(i);  System.out.println(s);  
}

8、转换集合

// 将 ArrayList 转换为数组  
String[] array = list.toArray(new String[0]);  // 将 ArrayList 转换为固定大小的 List  
List<String> fixedList = Collections.unmodifiableList(list);

9、排序

// 对列表进行排序(自然顺序)  
Collections.sort(list);  // 使用自定义比较器对列表进行排序  
list.sort(Comparator.comparing(String::length)); // 按字符串长度排序  // 二分搜索(列表必须是有序的)  
int index = Collections.binarySearch(list, "Element 1");  
if (index >= 0) {  System.out.println("Element found at index: " + index);  
} else {  System.out.println("Element not found");  
}
使用时需要注意的问题:

在使用ArrayList时,需要注意:

  1. 线程安全:ArrayList不是线程安全的,如果在多线程环境下使用,需要外部同步或使用线程安全的替代方案,如VectorCollections.synchronizedList
  2. 容量大小:ArrayList的初始容量默认为10,当添加的元素超过当前容量时,它会进行自动扩容。为了避免频繁的扩容操作,如果能够预估数据量的大小,可以在创建ArrayList时指定一个初始容量。
  3. 对象类型选择:在使用ArrayList时,应当明确集合中存储的对象类型。虽然ArrayList是泛型的,但是为了避免类型转换错误,应当在声明时指定具体的类型参数。
  4. 动态修改特性:与普通数组不同,ArrayList没有固定大小的限制,可以动态地添加或删除元素。这意味着ArrayList的内部实现会处理数组的扩容和缩容,但这也可能导致性能开销,尤其是在大量添加或删除元素时。
  5. 性能考虑:由于ArrayList是基于数组实现的,因此在随机访问元素时性能较好,但在列表中间插入或删除元素时性能较差,因为这需要移动大量元素。
  6. 合理使用:ArrayList适合于随机访问和在末尾添加元素的场景,如果需要频繁在列表中间插入或删除元素,可能需要考虑其他数据结构,如LinkedList
  7. 内存管理:由于ArrayList会自动管理内存,包括扩容和缩容,所以在不再需要ArrayList时,应及时将其引用设为null,以便垃圾回收器回收内存。
  8. 避免空指针异常:在使用get方法访问ArrayList中的元素时,需要确保索引值在有效范围内,否则会抛出IndexOutOfBoundsException异常。
  9. 代码可读性:为了提高代码的可读性和可维护性,应遵循Java编码规范,合理命名变量,并在必要时添加注释说明ArrayList的使用意图和逻辑。
ArrayList的扩容机制:

ArrayList的扩容过程是一个动态调整内部数组大小以适应元素增长的过程。

具体来说,当向ArrayList中添加元素而其当前容量不足以容纳新元素时,ArrayList会进行扩容操作。具体步骤如下:

  1. 检查是否需要扩容:在每次添加元素之前,ArrayList会首先检查当前元素的数量是否已经达到了数组的容量上限。如果已经达到了上限,就需要进行扩容操作。

  2. 计算新的容量:一旦确定需要扩容,ArrayList会计算新的容量。默认情况下,新的容量通常是原容量的1.5倍(即增长50%)。这个增长因子实际上是一个可以调整的参数,可以通过ensureCapacity(int minCapacity)方法进行设置。新的容量计算完成后,会确保新容量足够大,可以容纳当前所有元素以及新添加的元素。

  3. 创建新数组:根据计算得到的新容量,ArrayList会创建一个新的、更大的数组。

  4. 复制元素:接下来,ArrayList会将原数组中的所有元素复制到新数组中。这个复制过程会保持元素的顺序不变。

  5. 更新引用:复制完成后,ArrayList会将内部的引用从原数组更新为新数组。这样,ArrayList就完成了扩容操作,可以继续添加新的元素了。

需要注意的是,扩容操作涉及到元素的复制,因此在扩容时会有一定的性能损耗。因此,在创建ArrayList时,如果能够预估大致的元素数量,最好指定一个合适的初始容量,以减少扩容的次数和性能损耗。另外,频繁地添加和删除元素也可能导致频繁的扩容和缩容操作,进一步增加性能开销,因此在实际开发中应尽量避免频繁地增删元素。

相关文章:

Java中常用的集合及方法(2)

在Java&#xff08;JDK8&#xff09;中&#xff0c;集合&#xff08;Collection&#xff09;是数据结构的实现&#xff0c;用于存储和操作对象集合。 集合&#xff08;Collection&#xff09;中包含的一般类或接口&#xff1a; 在这其中呢&#xff0c;我们经常使用的其实就是L…...

如何轻松打造属于自己的水印相机小程序?

水印相机小程序源码 描述&#xff1a;微信小程序。本文将为您详细介绍小程序水印相机源码的搭建过程&#xff0c;教您如何轻松打造属于自己的水印相机小程序。无论您是初学者还是有一定基础的开发者&#xff0c;都能轻松掌握这个教程。 一&#xff1a;水印相机搭建教程 1 隐…...

Qt+FFmpeg+opengl从零制作视频播放器-12.界面美化

Qt是一个跨平台的C++图形用户界面应用程序开发框架,提供了丰富的功能和工具来创建美观的界面。以下是一些方法,可以帮助美化Qt界面: 使用样式表(QSS):Qt支持通过QSS(Qt样式表)来自定义界面的外观。QSS是一种类似于CSS的语言,可以用来设置控件的颜色、字体、边框等样式…...

【测试】1. 概念 + 基础篇

概念篇 测试相较于开发岗位而言&#xff0c;如果同学们的编程能力稍微弱一些&#xff0c;可以尝试测试方向&#xff08;更简单&#xff09; 1. 什么是软件测试 最常见的理解是&#xff1a;软件测试就是找BUG&#xff0c;发现缺陷。 早期&#xff0c;人们更多的将测试看成是对…...

【数据结构取经之路】快速排序的非递归实现

概述 递归实现快速排序在一些场景下有栈溢出的风险&#xff0c;下面就谈谈如何用非递归的方法实现快速排序。 非递归实现的思想 递归实现与非递归实现快速排序的本质是一致的&#xff0c;效率并不会因为用了非递归实现而有所提升。递归实现快速排序的本质就在于通过递归&…...

面试官: Spring Boot中spring-boot-starter-parent 有什么用

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:spring-boot-starter-parent 有什么用 spring-boot-starter-parent 是 Spring Boot 提供的一个父项目,通过继承该父项目,可以简化 Spring Boot …...

手搭手RocketMQ发送消息

消息中间件的对比 消息中间件 ActiveMQ RabbitMQ RocketMQ kafka 开发语言 java erlang java scala 单击吞吐量 万级 万级 10万级 10万级 时效性 ms us ms ms 可用性 高(主从架构) 高(主从架构) 非常高(主从架构) 非常高(主从架构) 消息中间件: acti…...

Mysql数据库的优点

功能强大 MySQL中提供了多种数据库存储引擎,各引擎各有所长,适用于不同的应用场合,用户可以选择最合适的引擎以得到最高性能,可以处理每天访问量超过数亿的高强度的搜索 Web 站点。MySQL5 支持事务、视图、存储过程、触发器等。 支持跨平台 MySQL支持至少20种以上的开发…...

蓝桥杯练习系统(算法训练)ALGO-980 斐波那契串

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;10.0s Java时间限制&#xff1a;30.0s Python时间限制&#xff1a;50.0s 问题描述 斐波那契串由下列规则生成&#xff1a;   F[0] "0";   F[1] "1";   F[n] F[n-1] F[n-2]…...

AHU 数据库 实验五

【实验名称】 实验5 数据库的数据更新与视图管理 【实验目的】 1. 熟悉数据更新操作的概念与操作类型&#xff1b; 2. 熟练掌握INSERT、UPDATE、DELETE语句的基本语法&#xff1b; 3. 熟练运用INSERT、UPDATE、DELETE语句实现数据的插入、修改与删除…...

信号和槽1

信号和槽 Qt信号的三个要素。 信号源&#xff1a;由哪个控件发出的信号。 信号的类型&#xff1a;用户进行不同的操作&#xff0c;就可能触发不同的信号。 信号的处理方式&#xff1a;槽(slot) 差不多等于函数 Qt中可以使用connect这样的函数&#xff0c;把一个信号和一个…...

一个简单的微信小程序表单提交样式模板

没什么东西&#xff0c;只是方便自己直接复制使用 .wxml <view class"box"><form bindsubmit"formSubmit"><view class"form-item"><text class"head">姓名&#xff1a;</text><input class"…...

SpringController返回值和异常自动包装

今天遇到一个需求&#xff0c;在不改动原系统代码的情况下。将Controller的返回值和异常包装到一个统一的返回对象中去。 例如原系统的接口 public String myIp(ApiIgnore HttpServletRequest request);返回的只是一个IP字符串"0:0:0:0:0:0:0:1"&#xff0c;目前接口…...

生存预后不显著?最佳阈值来帮你!| 附完整代码 + 注释

大家在进行生存预后分析时发现结果不显著&#xff0c;是不是当头一棒&#xff01;两眼一黑&#xff01;难不成这就代表我们的研究没意义吗&#xff1f;NONONO&#xff01;别慌&#xff01;说不定还有救&#xff01;快来看看最佳阈值能不能捞你一把&#xff01; 对生存分析感兴趣…...

kangle一键安装脚本

Kangle一键脚本&#xff0c;是一款可以一键安装KangleEasypanelMySQLPHP集合的Linux脚本。 脚本本身集成&#xff1a;PHP5.38.2、MYSQL5.68.0&#xff0c;支持极速安装和编译安装2种模式&#xff0c;支持CDN专属安装模式。同时也对Easypanel面板进行了大量优化。 脚本特点 ◎…...

C#写入和调用方法

一、编写方法 在C#中&#xff0c;方法是在类或结构体内部定义的代码块&#xff0c;用于执行特定的操作。方法通常包括以下几个要素&#xff1a; 访问修饰符&#xff1a;指定方法的访问级别&#xff0c;如 public、private、protected 等。返回类型&#xff1a;指定方法返回的…...

Qt的定时器QTimer

定时器Qtimer&#xff1a;用于重复执行或延迟执行函数的类。它可以在一定的时间间隔内发出信号。 使用它&#xff0c;只需要创建一个QTimer类对象&#xff0c;然后调用start()函数开启定时器即可。 定时器的信号 当定时器超时后&#xff0c;就会发出一个timeout的信号函数。 …...

Python 导入Excel三维坐标数据 生成三维曲面地形图(面) 4-4、线条平滑曲面(修改颜色)去除无效点

环境和包: 环境 python:python-3.12.0-amd64包: matplotlib 3.8.2 pandas 2.1.4 openpyxl 3.1.2 scipy 1.12.0 代码: import pandas as pd import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from scipy.interpolate import griddata fro…...

某小厂java后端初面,记录一下

好吧&#xff0c;&#xff0c;&#xff0c;&#xff0c;&#xff0c;本人很菜&#xff0c;再接再励吧&#xff0c;继续刷。简单记录一下面试题&#xff0c;未亡羊补牢呗。 1.lift join ;inner join ;right join 的区别 2. union 和union all的区别 3.like查询会走索引吗&#x…...

Unity制作马赛克效果

大家好&#xff0c;我是阿赵。   之前在玩怒之铁拳4里面&#xff0c;看到了马赛克场景转换的效果&#xff0c;觉得很有趣&#xff0c;于是也来做一下。 一、2D版本的马赛克转场效果 先看看视频效果&#xff1a; 马赛克转场 这里我是直接写shader实现的&#xff0c;我这里是把…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...