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

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.dtcms.com/a/332348.html

相关文章:

  • OpenCV Python——VSCode编写第一个OpenCV-Python程序 ,图像读取及翻转cv2.flip(上下、左右、上下左右一起翻转)
  • MySQL知识点(上)
  • adb 发送广播
  • dockerfile自定义镜像,乌班图版
  • 高并发接口性能优化实战:从200ms到20ms的蜕变之路
  • 线索转化率翻3倍?AI重构CRM
  • Uniapp之微信小程序自定义底部导航栏形态
  • 北京JAVA基础面试30天打卡10
  • 数据资产运营——解读 167页 2025 县域数据资产运营蓝皮书【附全文阅读】
  • 5G工业一体机汽车零部件工厂的无纸化管理
  • [激光原理与应用-285]:理论 - 波动光学 - 无线电磁波的频谱分配
  • [激光原理与应用-286]:理论 - 波动光学 - 不同频段电磁波的特点与差异性
  • 局部变量与全局变量的关系及应用
  • 46.Sentinel规则持久化
  • FreeRTOS中断服务程序(ISR)详细讲解
  • 从ChatGPT到智能助手:Agent智能体如何颠覆AI应用
  • 基于uiautomation的自动化流程RPA开源开发演示
  • 机器学习——PCA(主成分分析)降维
  • 开源 Arkts 鸿蒙应用 开发(十五)自定义绘图控件--仪表盘
  • STM32 - Embedded IDE - GCC - 解决LWRB库在GCC编译器会编译失败,在ARMCC编译器时却正常编译
  • 【GUI】ssh实现gui本地可视
  • 公司的服务器怎么个事,服务器是什么东西
  • 系统思考:情绪内耗与思维模式
  • 开源长期记忆 短期记忆 框架调研对比19999字
  • 4.4 vue3生命周期函数
  • 解决在uniapp真机运行上i18n变量获取不到问题
  • Vue2与Vue3生命周期函数全面解析:从入门到精通
  • 【测试用例】
  • Qt 常用控件 - 9
  • 小兔鲜儿-小程序uni-app(二)