文章目录
- ArrayList 基本特点:
- 类的定义
- ArrayList类的变量
- 类的构造方法:
- ArrayList中的常用方法:
- ArrayList的扩容机制:
- ArrayList 的 grow() 扩容方法:
- ArrayList 的 hugeCapacity(minCapacity) 方法:
ArrayList 位于 java.util 包下
ArrayList 基本特点:
1. 底层动态数组,有序,有下标,可以重复
2. 线程不安全
3. 查询性能较快,增删性能稍差
类的定义
public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable
ArrayList实现List接口&#xff0c;继承AbstractList抽象类&#xff0c;另外实现RandomAccess (支持随机访问)、Cloneable(支持拷贝) 两个特殊接口
ArrayList类的变量
private static final int DEFAULT_CAPACITY &#61; 10;
private static final Object[] EMPTY_ELEMENTDATA &#61; {};
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA&#61;{};
----------
transient Object[] elementData;
private int size;
-----------
private static final int MAX_ARRAY_SIZE &#61; Integer.MAX_VALUE - 8;
protected transient int modCount &#61; 0;
类的构造方法&#xff1a;
public ArrayList() {this.elementData &#61; DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
public ArrayList(int initialCapacity) {if (initialCapacity > 0) {this.elementData &#61; new Object[initialCapacity];} else if (initialCapacity &#61;&#61; 0) {this.elementData &#61; EMPTY_ELEMENTDATA;} else {throw new IllegalArgumentException("Illegal Capacity: "&#43;initialCapacity);}
}
public ArrayList(Collection<? extends E> c) {elementData &#61; c.toArray();if ((size &#61; elementData.length) !&#61; 0) {if (elementData.getClass() !&#61; Object[].class)elementData &#61; Arrays.copyOf(elementData, size, Object[].class);} else {this.elementData &#61; EMPTY_ELEMENTDATA;}
}
ArrayList中的常用方法&#xff1a;
这些方法看名字大概就应该知道是干什么的了&#xff0c;不再详细说明。
ArrayList的扩容机制&#xff1a;
先来看一个方法&#xff1a;
private void ensureExplicitCapacity(int minCapacity) {modCount&#43;&#43;;if (minCapacity - elementData.length > 0)grow(minCapacity);
}
这个方法的作用是用来保证ArrayList的容量的。 在ArrayList每次添加操作时&#xff0c;也就是说在每次执行add()、addAll() 方法时&#xff0c;都会调用这个方法&#xff0c;判断数组长度是否需要扩容。如果 添加后需要的长度 > 原来数组的长度&#xff0c;就需要调用grow() 方法进行扩容。
ArrayList 的 grow() 扩容方法&#xff1a;
private void grow(int minCapacity) {int oldCapacity &#61; elementData.length;int newCapacity &#61; oldCapacity &#43; (oldCapacity >> 1);if (newCapacity - minCapacity < 0)newCapacity &#61; minCapacity;if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity &#61; hugeCapacity(minCapacity);elementData &#61; Arrays.copyOf(elementData, newCapacity);}
通过上面的源码及注释可以看到&#xff0c;ArrayList 扩容长度 一般为原数组长度的1.5倍。如果新数组长度 > 数组规定的最大容量时&#xff0c;会调用 hugeCapacity&#xff08;minCapacity&#xff09; 方法。
ArrayList 的 hugeCapacity(minCapacity) 方法&#xff1a;
private static int hugeCapacity(int minCapacity) {if (minCapacity < 0) throw new OutOfMemoryError();return (minCapacity > MAX_ARRAY_SIZE) ?Integer.MAX_VALUE :MAX_ARRAY_SIZE;
}
当 grow&#xff08;&#xff09;方法中 计算出的新数组长度 > 数组最大长度 时&#xff0c;调用该方法&#xff0c;判断 操作后元素所需要的长度 是否 &#xff1e; 数组最大长度&#xff0c;如果大于&#xff0c;就返回Integer 类型的最大值 作为新数组长度&#xff0c;否则 仍然返回 数组最大长度 作为新数组长度。