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

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 倍,遍历删除需用迭代器,提前指定容量可优化性能。

http://www.jsqmd.com/news/240663/

相关文章:

  • 借助AI技术高效撰写学术论文,这7个专业网站支持格式规范与LaTeX排版适配功能
  • LLDB:现代化的开源调试器(LLVM Debugger)
  • 51单片机——GPIO、按键、中断、定时器与PWM
  • Pulsar 特性在 AI 场景中的使用!
  • OBS教程:如何打开OBS美颜,美妆,美发,美型功能?如何使用美颜插件优惠券兑换券
  • 运用AI提升论文撰写生产力,7个推荐资源涵盖格式标准化和LaTeX排版功能
  • 通过AI技术快速产出合规论文,7个工具网站提供LaTeX适配及格式校对服务
  • 什么是RPKI
  • 什么是RR
  • 什么是热插拔
  • 亲测广东等离子处理机厂家
  • 智能表格识别技术突破传统OCR局限,实现复杂纸质表格的精准数字化转换
  • 【开题答辩全过程】以 基于小程序的精品衣柜系统的设计与实现为例,包含答辩的问题和答案
  • 这几款iPhone“邪修”软件,好用到逆天!
  • [大模型架构] LangGraph AI 工作流编排(15)
  • 【开题答辩全过程】以 基于Java的健身俱乐部管理系统的设计与开发为例,包含答辩的问题和答案
  • 【大数据毕设推荐】基于Spark的大学排名数据可视化系统,Python+Hadoop技术栈详解 毕业设计 选题推荐 毕设选题 数据分析 机器学习
  • 在外如何用手机像翻相册一样查看其他设备里所有文件?
  • 深度解读.NET中ConcurrentDictionary:高效线程安全字典的原理与应用
  • 【开题答辩全过程】以 基于Web技术的知识付费平台为例,包含答辩的问题和答案
  • 智能电商客服:AI工具驱动的服务价值链重构与行业突围
  • C++跨平台开发的核心挑战平台差异性处理操作系统AP
  • Linux网络编程-UDP 广播原理与实战
  • 从机械傀儡到具身智能:机器人控制模型的演变实录
  • Java性能优化实战技术文章大纲性能优化的基本原则
  • 基于STM3251单片机的草坪培育智能控制系统设计(程序源码+实物+原理图+PCB+论文+答辩稿)
  • Linux网络编程-UDP 组播原理与实战
  • 深入解析 VPC:云端网络架构的核心基石
  • 基于STM3251单片机的多功能垃圾桶控制系统(程序源码+实物+原理图+PCB+论文+答辩稿)
  • Linux命令创意组合大赛技术文章大纲组合的灵活性和强大功能