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

Java集合框架之数组列表(ArrayList)

数组列表(ArrayList)是List接口的一个可变大小的数组实现,它是我们在日常开发中经常使用的数据结构之一。

一、ArrayList概述

ArrayList类位于java.util包中,是一个动态数组的实现。它允许我们在运行时动态地增加或减少元素,并且可以包含重复的元素。ArrayList基于数组实现,因此它拥有数组访问速度快的特点,但是在插入和删除元素时可能会涉及到数组的复制操作,因此在这些操作上的性能会比链表(LinkedList)差一些。

二、ArrayList的特点
  1. 动态大小ArrayList的大小可以动态地变化,可以在运行时增加或减少元素。
  2. 有序性ArrayList中的元素是有序的,即元素的存储顺序与插入顺序一致。
  3. 允许重复ArrayList允许存储重复的元素。
  4. 访问速度快:由于ArrayList是基于数组实现的,因此它在随机访问元素时具有非常高的效率。
三、ArrayList的基本操作
  1. 创建ArrayList
import java.util.ArrayList;

ArrayList<String> list = new ArrayList<>();

 

  1. 添加元素
list.add("A");
list.add("B");
list.add("C");

也可以在指定位置添加元素:

list.add(1, "D"); // 在索引1的位置插入元素"D"
  1. 访问元素
String element = list.get(0); // 获取索引0位置的元素
  1. 修改元素
String element = list.get(0); // 获取索引0位置的元素
  1. 删除元素

按值删除:

list.remove("A"); // 删除第一个值为"A"的元素

按索引删除:

list.remove(0); // 删除索引0位置的元素
  1. 获取元素个数
int size = list.size(); // 获取ArrayList中的元素个数
  1. 遍历ArrayList

使用for-each循环:

for (String s : list) {
    System.out.println(s);
}

使用迭代器(Iterator):

Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}
  1. 转换为数组
String[] array = list.toArray(new String[0]);

 

四、ArrayList的底层实现

ArrayList是基于数组实现的,内部维护了一个Object类型的数组elementData。当创建ArrayList实例时,会初始化一个空的数组。当添加元素时,如果数组已满,则会自动扩容,创建一个更大的数组,并将原有数组中的元素复制到新数组中。扩容的大小通常是容量增加50%,但如果原数组大小非常大,则可能只会增加一定的固定值。

    /**
     * Increases the capacity to ensure that it can hold at least the
     * number of elements specified by the minimum capacity argument.
     *
     * @param minCapacity the desired minimum capacity
     */
    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }
private static int hugeCapacity(int minCapacity) {
        if (minCapacity < 0) // overflow
            throw new OutOfMemoryError();
        return (minCapacity > MAX_ARRAY_SIZE) ?
            Integer.MAX_VALUE :
            MAX_ARRAY_SIZE;
    }
五、ArrayList的线程安全性

ArrayList是非线程安全的,即如果在多线程环境下对同一个ArrayList实例进行并发操作,可能会导致数据不一致的问题。如果需要线程安全的列表,可以使用Vector(尽管Vector是线程安全的,但由于其性能较差,不推荐在高并发场景下使用),或者使用Collections.synchronizedList方法将ArrayList包装成线程安全的列表,或者使用Java 5引入的CopyOnWriteArrayList

六、总结

ArrayList是Java集合框架中的一个重要类,它提供了动态数组的功能,使得我们可以在运行时灵活地增加或减少元素。虽然ArrayList在插入和删除元素时可能涉及到数组的复制操作,但由于其基于数组实现,因此在随机访问元素时具有非常高的效率。在使用ArrayList时,需要注意其线程安全性问题,如果需要在多线程环境下使用,需要采取适当的措施来保证线程安全。

希望这篇博客能帮助你更好地理解Java集合框架中的ArrayList,如果你有任何问题或建议,欢迎留言交流!


http://www.kler.cn/a/388911.html

相关文章:

  • 少儿学习Scratch编程的好处和坏处
  • MicroPythonBLEHID使用说明——蓝牙鼠标
  • 管家婆财贸ERP BB045.销售批量收款
  • 《硬件架构的艺术》笔记(一):亚稳态
  • .NET中通过C#实现Excel与DataTable的数据互转
  • 非关系型数据库NoSQL的类型与优缺点对比
  • SDL事件相关
  • 中安OCR电子行驶证、驾驶证识别,助力便捷出行与智慧交通
  • Objective-C 1.0和2.0有什么区别?
  • git中使用tag(标签)的方法及重要性
  • 股票量化实时行情接口WebSocket接入Python封装
  • netcat工具安装和使用
  • 目前对于后期的打算
  • ubuntu使用DeepSpeech进行语音识别(包含交叉编译)
  • linux笔记(selinux)
  • 欢迎 Stable Diffusion 3.5 Large 加入 Diffusers
  • Android MavenCentral 仓库更新问题
  • 【9692】基于springcloud+vue的智慧养老平台
  • Linux:理解动静态库
  • Linux安装与配置 Gitblit 1.9.3 服务
  • 如何在 Linux 服务器上安装 Git
  • Linux——入门
  • 搭建监控系统Prometheus + Grafana
  • 独立站 API 接口的性能优化策略
  • CALL处 F8的“bug“
  • 7个常用的JavaScript数组操作进阶用法