解析 Java ArrayList源码
时间: 2024-01-13 12:05:04 浏览: 142
Java ArrayList 是一个基于数组实现的动态数组,它实现了 List 接口,可以根据需要自动扩容和缩容,支持快速地随机访问。下面是 Java ArrayList 的源码解析:
1. ArrayList 的底层实现是一个 Object 类型的数组 elementData,用于存储元素。它的默认初始容量为 10。
2. 当 ArrayList 需要添加元素时,会先检查当前元素个数是否超过数组容量,如果超过了,则会扩容数组。扩容时,会先计算新数组的容量,然后创建一个新数组,将旧数组中的元素复制到新数组中。
3. ArrayList 支持随机访问,可以通过下标直接访问指定位置的元素。在实现随机访问时,ArrayList 采用了数组的方式,将元素存储在连续的内存空间中。
4. ArrayList 实现了 List 接口,提供了添加、删除、修改等操作的方法。在添加和删除元素时,为了保证数组的连续性,需要将数组中指定位置之后的元素向前或向后移动。
5. ArrayList 还实现了 Iterable 接口,可以通过 for-each 循环遍历 ArrayList 中的元素。
6. 在多线程环境下,ArrayList 不是线程安全的,如果需要在多线程环境下使用 ArrayList,需要进行同步处理,或者使用线程安全的 Vector 或 CopyOnWriteArrayList。
综上所述,Java ArrayList 通过动态扩容和缩容、数组实现随机访问等特性,实现了一个高效的动态数组。
相关问题
arraylist 源码解析
ArrayList是Java集合框架中的一个类,它实现了List接口,可以用来存储一组对象,这些对象可以是任意类型。
下面是ArrayList的源码解析:
1. 成员变量
```java
/**
* Default initial capacity.
*/
private static final int DEFAULT_CAPACITY = 10;
/**
* Shared empty array instance used for empty instances.
*/
private static final Object[] EMPTY_ELEMENTDATA = {};
/**
* Shared empty array instance used for default sized empty instances. We
* distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when
* first element is added.
*/
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
/**
* The array buffer into which the elements of the ArrayList are stored.
* The capacity of the ArrayList is the length of this array buffer. Any
* empty ArrayList with elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA
* will be expanded to DEFAULT_CAPACITY when the first element is added.
*/
transient Object[] elementData; // non-private to simplify nested class access
/**
* The size of the ArrayList (the number of elements it contains).
*
* @serial
*/
private int size;
```
ArrayList有三个成员变量,分别是DEFAULT_CAPACITY、EMPTY_ELEMENTDATA和DEFAULTCAPACITY_EMPTY_ELEMENTDATA。DEFAULT_CAPACITY表示默认的容量大小,EMPTY_ELEMENTDATA是一个空数组,DEFAULTCAPACITY_EMPTY_ELEMENTDATA也是一个空数组,但它会在第一次添加元素时扩容为DEFAULT_CAPACITY大小。elementData是一个Object类型的数组,用于存储ArrayList中的元素,size表示ArrayList中元素的数量。
2. 构造方法
```java
/**
* Constructs an empty list with an initial capacity of ten.
*/
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
/**
* Constructs a list containing the elements of the specified
* collection, in the order they are returned by the collection's
* iterator.
*
* @param c the collection whose elements are to be placed into this list
* @throws NullPointerException if the specified collection is null
*/
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
if ((size = elementData.length) != 0) {
// defend against c.toArray (incorrectly) not returning Object[]
// (see e.g. https://bugs.openjdk.java.net/browse/JDK-6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
} else {
// replace with empty array.
this.elementData = EMPTY_ELEMENTDATA;
}
}
/**
* Constructs an empty list with the specified initial capacity.
*
* @param initialCapacity the initial capacity of the list
* @throws IllegalArgumentException if the specified initial capacity
* is negative
*/
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
```
ArrayList提供了三个构造方法。第一个构造方法是无参的构造方法,它将elementData赋值为DEFAULTCAPACITY_EMPTY_ELEMENTDATA。第二个构造方法接收一个Collection类型的参数c,它将参数c中的元素转为数组并将其赋值给elementData。第三个构造方法接收一个int类型的参数initialCapacity,它根据参数initialCapacity的值创建一个Object类型的数组并将其赋值给elementData。
3. 常用方法
常用方法包括add()、get()、set()、remove()、size()等。
add()方法用于在ArrayList中添加一个元素,如果elementData的容量不足,就需要进行扩容。扩容的方式是将elementData数组的大小增加50%。
get()方法用于获取ArrayList中指定位置的元素。
set()方法用于将ArrayList中指定位置的元素替换为指定的元素。
remove()方法用于删除ArrayList中指定位置的元素。
size()方法用于获取ArrayList中元素的数量。
4. 总结
ArrayList是Java集合框架中的一个类,它实现了List接口,可以用来存储一组对象。ArrayList的源码解析包括成员变量、构造方法和常用方法。掌握ArrayList的源码可以帮助我们更好地理解它的实现原理,从而更加灵活地应用它。
阅读全文