Java集合框架之数组列表(ArrayList)
数组列表(ArrayList)是List接口的一个可变大小的数组实现,它是我们在日常开发中经常使用的数据结构之一。
一、ArrayList概述
ArrayList
类位于java.util
包中,是一个动态数组的实现。它允许我们在运行时动态地增加或减少元素,并且可以包含重复的元素。ArrayList
基于数组实现,因此它拥有数组访问速度快的特点,但是在插入和删除元素时可能会涉及到数组的复制操作,因此在这些操作上的性能会比链表(LinkedList)差一些。
二、ArrayList的特点
- 动态大小:
ArrayList
的大小可以动态地变化,可以在运行时增加或减少元素。 - 有序性:
ArrayList
中的元素是有序的,即元素的存储顺序与插入顺序一致。 - 允许重复:
ArrayList
允许存储重复的元素。 - 访问速度快:由于
ArrayList
是基于数组实现的,因此它在随机访问元素时具有非常高的效率。
三、ArrayList的基本操作
- 创建ArrayList
import java.util.ArrayList;
ArrayList<String> list = new ArrayList<>();
- 添加元素
list.add("A");
list.add("B");
list.add("C");
也可以在指定位置添加元素:
list.add(1, "D"); // 在索引1的位置插入元素"D"
- 访问元素
String element = list.get(0); // 获取索引0位置的元素
- 修改元素
String element = list.get(0); // 获取索引0位置的元素
- 删除元素
按值删除:
list.remove("A"); // 删除第一个值为"A"的元素
按索引删除:
list.remove(0); // 删除索引0位置的元素
- 获取元素个数
int size = list.size(); // 获取ArrayList中的元素个数
- 遍历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());
}
- 转换为数组
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
,如果你有任何问题或建议,欢迎留言交流!