Java ArrayList的介绍及用法

十分想念顺店杂可。。。

ArrayList 是 Java 集合框架中最常用的类之一,实现了 List 接口,底层基于动态数组实现,支持动态扩容,相比普通数组更灵活。以下是其详细介绍及用法:

一、核心特性

  1. 动态大小:无需预先指定容量,可自动扩容(初始容量为 10,满后扩容为原容量的 1.5 倍)。
  2. 允许重复元素:可存储多个相同值的元素。
  3. 有序集合:元素按插入顺序排列,支持通过索引访问。
  4. 非线程安全:多线程环境下并发修改可能导致异常(需手动同步或使用 CopyOnWriteArrayList)。
  5. 存储引用类型:只能存储对象(基本类型需用包装类,如 Integer 而非 int)。

二、基本用法(代码示例)

1. 引入包与创建对象

ArrayList 位于 java.util 包,需先导入,创建时需指定泛型(元素类型):

import java.util.ArrayList;
import java.util.List;public class ArrayListDemo {public static void main(String[] args) {// 创建存储String类型的ArrayList(推荐声明为List接口)List<String> list = new ArrayList<>();// 可指定初始容量(减少扩容次数,优化性能)List<Integer> numList = new ArrayList<>(20); // 初始容量20}
}
2. 常用方法
(1)添加元素:add()
List<String> list = new ArrayList<>();
list.add("Java"); // 末尾添加元素 → [Java]
list.add(0, "Python"); // 指定索引插入 → [Python, Java](索引需≤当前size)
list.addAll(List.of("C", "C++")); // 批量添加 → [Python, Java, C, C++]
(2)访问元素:get()

通过索引获取元素(索引从 0 开始,需注意 IndexOutOfBoundsException):

String first = list.get(0); // 获取第1个元素 → "Python"
int size = list.size(); // 获取元素个数 → 4
(3)修改元素:set()

替换指定索引的元素,返回被替换的旧值:

String old = list.set(1, "JavaScript"); // 替换索引1的元素 → 旧值"Java"
// 此时list为 [Python, JavaScript, C, C++]
(4)删除元素:remove()
String removed = list.remove(2); // 移除索引2的元素 → 返回"C",list变为 [Python, JavaScript, C++]
boolean isRemoved = list.remove("C++"); // 移除指定值的元素 → 返回true,list变为 [Python, JavaScript]
(5)判断与查找
boolean isEmpty = list.isEmpty(); // 判断是否为空 → false
boolean contains = list.contains("Python"); // 是否包含指定元素 → true
int index = list.indexOf("JavaScript"); // 首次出现的索引 → 1
int lastIndex = list.lastIndexOf("Python"); // 最后出现的索引 → 0(元素唯一时与indexOf相同)
(6)清空与截取
list.clear(); // 清空所有元素 → list变为空
List<String> subList = list.subList(0, 2); // 截取子列表(从索引0到2,不含2)→ [Python, JavaScript]
3. 遍历方式
(1)普通 for 循环(通过索引)
for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));
}
(2)增强 for 循环(foreach)
for (String element : list) {System.out.println(element);
}
(3)迭代器(Iterator

支持在遍历中安全删除元素:

import java.util.Iterator;Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {String element = iterator.next();if (element.equals("Python")) {iterator.remove(); // 安全删除当前元素}
}
(4)Java 8+ 流(Stream)
list.stream().forEach(System.out::println); // 简化遍历

三、注意事项

  1. 扩容机制:当元素数量超过当前容量时,ArrayList 会自动扩容为原容量的 1.5 倍(通过 Arrays.copyOf() 复制数组)。若预知元素数量,创建时指定初始容量可减少扩容次数(提升性能)。

  2. 与数组的转换

    // ArrayList → 数组
    String[] arr = list.toArray(new String[0]); // 推荐传递类型数组,避免强制转换// 数组 → ArrayList(注意:返回的是固定大小的List,不能添加/删除元素)
    List<String> fixedList = Arrays.asList(arr); 
    // 若需可变List,需再包装一次:
    List<String> mutableList = new ArrayList<>(Arrays.asList(arr));
    

  3. 与 LinkedList 的对比

    • ArrayList 基于数组,随机访问快get(index) 时间复杂度 O (1)),增删中间元素慢(需移动元素,O (n))。
    • LinkedList 基于链表,增删中间元素快(O(1)),随机访问慢(O(n))。
    • 频繁查改选 ArrayList,频繁增删中间元素选 LinkedList
  4. 线程安全:多线程环境下,可使用 Collections.synchronizedList() 包装:

    List<String> safeList = Collections.synchronizedList(new ArrayList<>());
    

四、总结

ArrayList 是日常开发中最常用的 List 实现,以动态数组为核心,兼顾灵活性与访问效率,适合大多数场景。掌握其 add()get()remove() 等方法及遍历方式,结合扩容机制和线程安全特性,可更高效地使用。

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

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

相关文章

Docker 命令大全及使用场景总结

一、容器生命周期管理1. 创建并运行容器docker run [选项] 镜像名 [命令]常用选项&#xff1a;-d&#xff1a;后台运行&#xff08;detached&#xff09;-it&#xff1a;交互式终端&#xff08;如 -it ubuntu bash&#xff09;--name&#xff1a;指定容器名称-p 主机端口:容器端…

简单的 HTTPS 学习

简单的 HTTPS 学习 1. 需求 现在使用的服务是HTTP调用形式&#xff0c;服务可能会有调用外围https形式的服务&#xff0c;简单了解了一下&#xff0c;然后写了一个简单的例子进行记录。 HTTP&#xff08;超文本传输协议&#xff09; 是一种用于传输超文本的应用层协议&#…

[系统架构设计师]系统质量属性与架构评估(八)

[系统架构设计师]系统质量属性与架构评估&#xff08;八&#xff09; 一.软件系统质量属性 1.基本概念 软件系统质量属性&#xff1a;可测量或可测试的属性 开发期质量属性&#xff0c;运行期质量属性面向架构评估的质量属性&#xff1a;1.可用性&#xff1a; 提升策略 错误检测…

【R语言】R 语言中 gsub 与正则表达式详解(含 POSIX 与 Perl 风格实例)

R 语言中 gsub 与正则表达式详解&#xff08;含 POSIX 与 Perl 风格实例&#xff09; 在 R 语言中&#xff0c;字符串处理是非常常见的需求&#xff0c;R 语言中的 gsub() 函数则具有字符串替换的功能。本文将通过两个实例&#xff0c;帮助你深入理解 R 的 gsub()、POSIX 字符…

EN55035多媒体设备电磁兼容性抗干扰要求标准

EN55035 是一项由欧洲标准化委员会制定的电磁兼容性&#xff08;EMC&#xff09;标准&#xff0c;全称为《多媒体设备的电磁兼容性要求》。该标准主要针对多媒体设备的电磁辐射和抗干扰能力进行规范&#xff0c;确保这类设备在电磁环境中能够正常工作&#xff0c;同时不对其他设…

计算分组内时间列的最大差值

计算分组内时间列的最大差值 在 Pandas 中&#xff0c;要计算每个分组内 time 列的最大值与当前行值的差值&#xff0c;需结合 groupby() 和 transform() 方法。核心步骤如下&#xff1a;分组计算最大值 使用 transform(max) 获取每个分组中 time 列的最大值&#xff0c;结果会…

CUDA 编程笔记:CUDA延迟隐藏

一、核心概念&#xff1a;延迟隐藏&#xff08;Latency Hiding&#xff09;是 GPU 通过多线程机制掩盖指令延迟的关键技术。当某些线程束&#xff08;warp&#xff09;因指令延迟&#xff08;如内存访问或算术计算&#xff09;而等待时&#xff0c;其他就绪线程束会立即被调度执…

MySQL工具包中的其他程序

虽然有很多不同的程序&#xff0c;但有些选项是公共的&#xff0c;比兔用户名和密码&#xff0c;使用方法和MySQL相同&#xff0c;在这里统一列出&#xff0c;后面我们介绍不同的工具时&#xff0c;只讨论个性的选项以及作用以下是常用的MySQL程序&#xff1a;程序名作用mysqld…

C#WPF实战出真汁09--【消费开单】--选择菜品

1、功能介绍当选择一个空桌时&#xff0c;必须先开台才能开单&#xff0c;可以先开台&#xff0c;再开单&#xff0c;也可以开台的同时开单当选择一个用餐中的餐桌时&#xff0c;必须显示该桌前面已经点好的菜品&#xff0c;同时可以继续点餐或结账所以无论哪个功能都涉及选择菜…

大厂语音合成成本深度对比:微软 / 阿里 / 腾讯 / 火山 API 计费拆解与技术选型指南

在 AI 配音、智能客服、教育音频等场景爆发的当下&#xff0c;语音合成 API 已成为企业技术栈中的核心组件。然而&#xff0c;不同云厂商的计费规则差异显著&#xff0c;短文本 / 长文本计费分离、预付费 / 后付费价格梯度悬殊、音色授权费暗藏成本陷阱等问题&#xff0c;常导致…

Flutter开发 网络请求

HttpClient&#xff08;dart自有&#xff09; 1.get 点击请求按钮获取数据&#xff0c;解析数据获取单词展示到屏幕上。class MyState extends State {String info "暂无数据";List<Widget> texts [];overridevoid initState() {super.initState();}override…

vscode中用python调用matlab的函数(环境安装)

本实践适用于WIN11-x64和ubuntu22.04-x64系统&#xff0c;其余系统和架构未验证。 效果展示 1.环境要求 MATLAB Engine API for Python 的系统要求&#xff1a;参阅此官方文档MATLAB 与 Python 的版本兼容性&#xff1a;参阅此官方文档 2.安装步骤 安装Vscode&#xff08;不…

【数据分享】大清河(大庆河)流域上游土地利用

而今天要说明数据就是大清河&#xff08;大庆河&#xff09;流域上游土地利用。数据介绍大清河&#xff0c;又称大庆河&#xff0c;作为海河流域的重要支流&#xff0c;其流域上游地区不仅是区域水资源调控的关键节点&#xff0c;更是生态保护与经济发展的重要载体。以下从地理…

图论——Djikstra最短路

原理解释 首先解释一下它大概的应用场景以及原理&#xff1a;现在有这么一张图&#xff0c;图上各点之间都有一定的边权或者说是距离。给定你一个起点&#xff08;例如点1&#xff09;&#xff0c;让你求这个点到图上所有点的最短距离是多少&#xff1f; 这个问题比较平常&…

kafka初步介绍

Kafka角色介绍TopicTopic主题的意思&#xff0c;消费者必须指定主题用于的消息发送&#xff0c;生产者也必须指定主题用于消息的接收。topic只是逻辑上的划分。partitionpartition是分区的意思&#xff0c;他的主要作用是将发送到一个topic的数据做一个划分。如果有4个partitio…

windows10的vs2019编译openssl静态库备忘

1、下载安装openssl源码2、官网下载安装activeperl或Strawberry Perl。官网下载慢&#xff0c;网盘找找。使用中activeperl有些异常提示、缺模块&#xff0c;最后使用了Strawberry Perl。3、安装nasm。powershell使用choco install nasm -y 即可。powershell使用cd命令打开当前…

学习笔记与效率提升指南:编程、记忆与面试备考

在学习与工作中&#xff0c;高效的记录习惯、针对性的记忆方法和实用的技能储备&#xff0c;是提升效率的关键。本文结合编程学习、面试备考和英语单词积累&#xff0c;整理一套可落地的学习思路&#xff0c;尤其适合编程初学者。 一、学习核心原则&#xff1a;高效优先&#x…

顺丰面试题

1. 你擅长处理哪类问题推荐回答&#xff1a; "我比较擅长处理以下几类前端问题&#xff1a;性能优化&#xff1a;包括加载优化&#xff08;代码分割、懒加载&#xff09;、运行时优化&#xff08;减少重排重绘&#xff09;等复杂组件开发&#xff1a;如表单联动、可视化图…

Warmup_steps 设置经验

文章目录什么是 Warmup&#xff1f;实现示例科学设置 Warmup 的黄金法则直观例子什么是 Warmup&#xff1f; Warmup 是一种学习率调度策略&#xff0c;在训练初期逐步增加学习率&#xff08;LR&#xff09;&#xff0c;而不是直接使用目标学习率。它解决了两个关键问题&#x…

vue一个超简单的菜单栏伸缩示例

代码<template><div class"container"><!-- 左侧区域 --><div class"left-side" :style"{ width: leftWidth px }">左侧内容</div><!-- 右侧区域 --><div class"right-side" :style"{ l…