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

Java集合 - ArrayList

ArrayList 是 Java 集合框架中最常用的动态数组实现类,位于 java.util 包中。它基于数组实现,支持动态扩容和随机访问。

1. 特点

  1. 动态数组ArrayList 的底层是一个数组,可以根据需要动态扩展容量。

  2. 有序:元素按照插入顺序存储,支持按索引访问。

  3. 允许重复元素:可以存储重复的元素。

  4. 允许 null 值:可以存储 null 值。

  5. 非线程安全ArrayList 不是线程安全的,多线程环境下需要额外同步。

  6. 随机访问高效:基于数组实现,随机访问的时间复杂度为 O(1)。

2. 常用方法

2.1 添加元素

  • add(E e):在列表末尾添加元素。

  • add(int index, E element):在指定位置插入元素。

2.2 删除元素

  • remove(int index):删除指定位置的元素。

  • remove(Object o):删除第一个匹配的元素。

2.3 获取元素

  • get(int index):获取指定位置的元素。

2.4 修改元素

  • set(int index, E element):修改指定位置的元素。

2.5 查找元素

  • contains(Object o):判断是否包含指定元素。

  • indexOf(Object o):返回指定元素第一次出现的索引。

  • lastIndexOf(Object o):返回指定元素最后一次出现的索引。

2.6 其他常用方法

  • size():返回列表中的元素数量。

  • isEmpty():判断列表是否为空。

  • clear():清空列表中的所有元素。

  • toArray():将列表转换为数组。

底层实现

3.1 核心字段

ArrayList的核心字段为elementData和size

transient Object[] elementData; // 存储元素的数组
private int size; // 当前元素的数量
  • elementData:是一个 Object 类型的数组,用于存储集合中的元素。

  • size:表示当前 ArrayList 中实际存储的元素数量。

3.2 动态扩容

  • 当数组容量不足时,ArrayList 会自动扩容。

  • 扩容机制:

    1. 新容量通常是旧容量的 1.5 倍(oldCapacity + (oldCapacity >> 1))。

    2. 如果新容量仍然不足,则直接使用所需的最小容量。

    3. 扩容时需要创建新数组并复制元素,时间复杂度为 O(n)。

3.3 初始容量

  • 默认初始容量为 10。

  • 可以通过构造方法指定初始容量:

ArrayList<String> list = new ArrayList<>(100); // 初始容量为 100

线程安全

ArrayList 是 非线程安全 的。在多线程环境下,可能会出现以下问题:

  • 数据不一致:多个线程同时修改 ArrayList 时,可能会导致数据丢失或错误。

  • 并发修改异常:在使用迭代器遍历时,如果另一个线程修改了 ArrayList,可能会抛出 ConcurrentModificationException

  1. 使用Collections.synchronizedList

    List<String> synchronizedList = Collections.synchronizedList(new ArrayList<>());
  2. 使用CopyOnWriteArrayList

    List<String> copyOnWriteArrayList = new CopyOnWriteArrayList<>()

性能分析

  • 随机访问(通过下标):基于数组实现,随机访问的时间复杂度为 O(1)。

  • 查找元素(未知下标): 时间复杂度O(n),通过二分查找的时间复杂度O(logn)。

  • 插入和删除

    • 在末尾插入或删除元素的时间复杂度为 O(1)。

    • 在中间或开头插入或删除元素的时间复杂度为 O(n),因为需要移动元素。

  • 扩容:扩容的时间复杂度为 O(n)。

总结

  • ArrayList 是基于动态数组实现的集合,支持随机访问和动态扩容。

  • 默认初始容量为 10,扩容时容量增加为原来的 1.5 倍。

  • 非线程安全,适合单线程环境使用。

  • 在多线程环境下,可以使用 Collections.synchronizedList 或 CopyOnWriteArrayList 来保证线程安全。

  • 适用于需要频繁访问元素但较少插入和删除的场景。

http://www.dtcms.com/a/72550.html

相关文章:

  • 向量检索在AI中的应用与技术解析
  • 数据库的高阶知识
  • 中考英语之07句子成分
  • 【leetcode hot 100 114】二叉树展开为链表
  • HTB靶机 - Dog记录
  • 【自学笔记】Solidity基础知识点总览-持续更新
  • 前端---CSS(前端三剑客)
  • Native层逆向:ARM汇编与JNI调用分析
  • 模型即产品:一场被低估的AI Agent革命正在发生
  • JavaScript 中 call 和 apply 的用法与区别
  • Qt-QChart实现折线图
  • 深入浅出矩阵的秩
  • 并发编程-
  • 数据传输对象 DTO
  • 【Kubernetes】Service 的类型有哪些?ClusterIP、NodePort 和 LoadBalancer 的区别?
  • Nginx 目录浏览功能显示的日期格式设置为数字
  • 表达式和语句的区别
  • 86.HarmonyOS NEXT 组件通信与状态共享:构建高效的组件协作机制
  • 206. 反转链表
  • 施磊老师c++(七)
  • 【人工智能基础2】Tramsformer架构、自然语言处理基础、计算机视觉总结
  • DeepSeek进阶应用(二):结合Kimi制作PPT(双AI协作教程)
  • ASP.NET Webform和ASP.NET MVC 后台开发 大概80%常用技术
  • 过滤空格(信息学奥赛一本通-2047)
  • 我的世界1.20.1forge模组进阶开发教程生物篇(1)——生成
  • 上位机数据可视化:使用QtCharts绘制波形图
  • STM32 - 在机器人领域,LL库相比HAL优势明显
  • 电磁兼容性|电子设备(EMC)测试与系统化整改
  • HarmonyOS NEXT个人开发经验总结
  • 爬虫获取 item_get_video 接口数据:小红书笔记视频详情的深度解析