news 2026/4/16 17:53:22

java学习--ArrayList

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
java学习--ArrayList

一、什么是 ArrayList

ArrayListjava.util包下的类,实现了List接口,本质是动态扩容的数组(相比普通数组,它的长度可以自动调整)。

  • 底层基于数组实现,支持快速随机访问(通过索引取值,时间复杂度 O (1))。
  • 增删元素(尤其是中间位置)效率较低(需要移动元素,时间复杂度 O (n))。
  • 允许存储null值,且元素可重复,有序(按添加顺序保存)。

二、核心用法(完整示例代码)

以下是ArrayList最常用的操作,代码可直接复制运行:

import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class ArrayListDemo { public static void main(String[] args) { // 1. 创建 ArrayList 对象(指定泛型,推荐,避免类型转换问题) List<String> list = new ArrayList<>(); // 2. 添加元素 list.add("Java"); // 末尾添加 list.add("Python"); list.add(1, "C++"); // 指定索引(1)添加,原索引1及之后的元素后移 System.out.println("添加后:" + list); // 输出:[Java, C++, Python] // 3. 获取元素 String first = list.get(0); // 通过索引获取,索引从0开始 System.out.println("第一个元素:" + first); // 输出:Java // 4. 修改元素 list.set(2, "Go"); // 替换索引2的元素 System.out.println("修改后:" + list); // 输出:[Java, C++, Go] // 5. 删除元素 list.remove(1); // 按索引删除 list.remove("Go"); // 按元素值删除 System.out.println("删除后:" + list); // 输出:[Java] // 6. 遍历元素(三种常用方式) // 方式1:for循环(按索引) System.out.println("for循环遍历:"); for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } // 方式2:增强for循环 System.out.println("增强for循环遍历:"); for (String s : list) { System.out.println(s); } // 方式3:迭代器 System.out.println("迭代器遍历:"); Iterator<String> it = list.iterator(); while (it.hasNext()) { System.out.println(it.next()); } // 7. 其他常用方法 int size = list.size(); // 获取元素个数 boolean isEmpty = list.isEmpty(); // 判断是否为空 boolean contains = list.contains("Java"); // 判断是否包含某个元素 list.clear(); // 清空所有元素 } }

三、关键特性解析

  1. 扩容机制

    • 初始容量默认是 10(JDK8 及以上),当元素个数超过当前容量时,会自动扩容为原来的1.5 倍(计算方式:newCapacity = oldCapacity + (oldCapacity >> 1))。
    • 如果提前知道元素数量,可通过new ArrayList<>(指定容量)初始化,减少扩容次数,提升性能。
  2. 线程安全

    • ArrayList非线程安全的,如果多线程同时读写ArrayList,可能会导致数据错乱。
    • 线程安全场景可使用:Vector(古老的线程安全版,效率低)、Collections.synchronizedList(new ArrayList<>())CopyOnWriteArrayList(高并发读场景推荐)。
  3. 与普通数组的区别

    特性ArrayList普通数组
    长度动态扩容固定长度
    方法支持丰富(add/remove 等)仅通过索引操作
    存储类型只能存对象(基本类型自动装箱)可存基本类型 / 对象

四、常见面试 / 使用注意点

  • 遍历删除元素:不能在增强 for 循环中直接删除元素(会抛ConcurrentModificationException),需用迭代器的it.remove()方法。示例:
    List<String> list = new ArrayList<>(); list.add("a"); list.add("b"); Iterator<String> it = list.iterator(); while (it.hasNext()) { String s = it.next(); if (s.equals("a")) { it.remove(); // 正确删除方式 } }
  • 空指针风险list.get(index)时,若索引越界(如 index >= list.size ()),会抛IndexOutOfBoundsException,使用前需校验索引合法性。

总结

  1. ArrayList是基于动态数组的 List 实现,支持快速随机访问,增删中间元素效率低,有序、可重复、允许 null。
  2. 核心操作包括添加(add)、获取(get)、修改(set)、删除(remove)、遍历,推荐指定泛型避免类型转换问题。
  3. 非线程安全,扩容默认 1.5 倍,遍历删除需用迭代器,提前指定容量可优化性能。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 19:40:26

电商行业的数据分析工具推荐

电商行业的数据分析工具推荐 关键词:电商行业、数据分析工具、数据挖掘、可视化、数据洞察 摘要:本文聚焦于电商行业,深入探讨了适用于该领域的各类数据分析工具。从工具的背景介绍出发,阐述其目的、适用读者和文档结构,详细解释相关术语。接着介绍核心概念与联系,通过文…

作者头像 李华
网站建设 2026/4/3 6:02:51

Pulsar 特性在 AI 场景中的使用!

引言 没有意外&#xff0c;随着模型规模的持续增长和应用场景的日益复杂&#xff0c;AI Infra 也自然地从"单体架构" -> "分布式架构"进行演进&#xff0c;例如&#xff1a; 在大模型训练和推理阶段&#xff0c;随着模型规模的增长&#xff0c;需要通…

作者头像 李华
网站建设 2026/4/7 23:15:56

GRANT SELECT, DELETE ON 职工 TO USER1 WITH GRANT OPTION权限授予命令详解

一、语句结构分解 GRANT SELECT, DELETE ON 职工 TO USER1 WITH GRANT OPTION;各部分含义&#xff1a;部分含义GRANT授权命令关键字SELECT, DELETE授予的权限类型ON 职工权限作用的对象&#xff08;职工表&#xff09;TO USER1权限授予的用户WITH GRANT OPTION特殊权限选项 二、…

作者头像 李华
网站建设 2026/4/16 14:50:08

Linux网络编程-UDP 组播原理与实战

一、UDP 组播核心概念UDP 通信有三种典型模式&#xff0c;组播是单播和广播的中间形态&#xff0c;能精准向指定一组主机通信&#xff0c;大幅节省网络带宽&#xff1a;通信模式特点适用场景单播一对一&#xff08;两台主机端对端通信&#xff09;精准的点对点数据传输&#xf…

作者头像 李华
网站建设 2026/4/16 12:14:29

在外如何用手机像翻相册一样查看其他设备里所有文件?

在外急需调取家里NAS、电脑的资料&#xff1f;别再折腾U盘和复杂的远程设置了。今天就教你用节点小宝&#xff0c;像翻看自己手机相册一样&#xff0c;随时随地、直观地访问你所有设备里的文件。一把钥匙 打开所有设备的“文件抽屉”节点小宝的“远程文件”功能就是一把钥匙。它…

作者头像 李华
网站建设 2026/4/16 11:00:49

平价药店销售与管理系统

平价药店销售与管理系统一、系统概述随着信息技术的飞速发展&#xff0c;传统的药店管理方式已经不能满足现代化经营的需求。平价药店销售与管理系统旨在通过计算机技术为药店提供全面的信息化管理&#xff0c;涵盖药品信息管理、库存管理、销售管理、会员管理、收银结算等多项…

作者头像 李华