news 2026/5/7 19:13:18

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/5/6 17:05:24

51单片机——GPIO、按键、中断、定时器与PWM

目录 一、GPIO 1.1 核心概念 1.2 工作模式分类 1.2.1 输出模式&#xff1a;控制外设 1.2.2 输入模式&#xff1a;检测外设信号 二、独立按键 2.1 硬件连接原理 2.2 核心工作逻辑 2.3 消抖处理 三、中断系统 3.1 中断核心概念 3.2 中断源分类与关键参数 3.3 中断处…

作者头像 李华
网站建设 2026/5/6 15:12:07

论文初稿难产?10款AI工具助你高效降重与生成,大幅提升写作效率

&#xfffd;&#xfffd; AI工具性能速览表 工具名称 核心功能 处理时间 AI生成率控制 适配检测平台 askpaper 降AIGC率降重同步 20分钟 个位数 知网/格子达/维普 秒篇 AI痕迹深度弱化 20分钟 个位数 知网/格子达/维普 aicheck 全学科初稿生成 20-30分钟 低…

作者头像 李华
网站建设 2026/5/5 21:15:16

【开题答辩全过程】以 基于springbootvue图书馆选座系统设计与实现为例,包含答辩的问题和答案

个人简介 一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等 开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。 感谢大家…

作者头像 李华
网站建设 2026/5/5 21:15:15

子数列求积【牛客tracker 每日一题】

子数列求积 时间限制&#xff1a;1秒 空间限制&#xff1a;256M 网页链接 牛客tracker 牛客tracker & 每日一题&#xff0c;完成每日打卡&#xff0c;即可获得牛币。获得相应数量的牛币&#xff0c;能在【牛币兑换中心】&#xff0c;换取相应奖品&#xff01;助力每日有…

作者头像 李华
网站建设 2026/5/5 21:15:13

Java性能优化实战技术文章大纲性能优化的基本原则

Java性能优化实战技术文章大纲性能优化的基本原则理解性能优化的核心目标&#xff1a;减少资源消耗、提高响应速度、增强系统稳定性 避免过度优化&#xff0c;基于实际业务场景和数据驱动决策 采用可量化的指标评估优化效果&#xff08;如TPS、RT、GC频率等&#xff09;JVM层优…

作者头像 李华
网站建设 2026/4/30 5:24:11

预装智能办公软件,打造企业专属数字工作台

数据成为新生产要素&#xff0c;算法成为新生产力&#xff0c;这场由技术驱动的深层经济逻辑变革&#xff0c;影响着这个时代的每一个人&#xff0c;迫使每一个组织重新审视自己的价值链条与核心竞争力。每个企业需要深化技术与业务流程的结合应用&#xff0c;如何在保障数据主…

作者头像 李华