一、概述
ArrayList是一个可以自动扩容的数组,随机访问的速度很快(时间复杂度为O(1)),但是插入和移除元素的速度较慢
二、源码分析
1. add()方法:
public boolean add(E e) {
// 容量+1
ensureCapacityInternal(size + 1); // Increments modCount!!
// 将新元素添加到数组的最后
elementData[size++] = e;
return true;
}
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);
}
2. remove方法
public E remove(int index) {
// 检查是否出界
rangeCheck(index);
modCount++;
E oldValue = elementData(index);
int numMoved = size - index - 1;
// 缩容,拷贝
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // clear to let GC do its work
return oldValue;
}
add方法和remove方法在添加或删除元素的时候需要扩容或缩容并且将所有的元素依次移入新的数组中,时间复杂度为O(n),所以ArrayList在插入和删除元素时较慢
2. get()方法
public E get(int index) {
// 判断是否出界
rangeCheck(index);
// 返回对应位置的元素
return elementData(index);
}
三、示例
1. addAll()方法:
ArrayList<String> list_1 = new ArrayList<String>();
for (int i = 0; i < 3; i++) {
list_1.add("No." + i);
}
System.out.println("list_1: " + list_1);
ArrayList<String> list_2 = new ArrayList<String>();
for (int i = 3; i < 6; i++) {
list_2.add("No." + i);
}
System.out.println("list_2: " + list_2);
list_1.addAll(list_2);
System.out.println("list_1: " + list_1);
输出:
list_1: [No.0, No.1, No.2]
list_2: [No.3, No.4, No.5]
list_1: [No.0, No.1, No.2, No.3, No.4, No.5]
2. 使用ListIterator遍历
使用ListIterator遍历:ListIterator可以向前或者向后去遍历,并且可以从指定位置开始遍历
ArrayList<String> list_1 = new ArrayList<String>();
for (int i = 0; i < 10; i++) {
list_1.add("No." + i);
}
ListIterator<String> iterator = list_1.listIterator(3);
while (iterator.hasPrevious()){
System.out.println("prev: " + iterator.previousIndex() + ": " + iterator.previous());
}
while (iterator.hasNext()){
System.out.println("next: " + iterator.nextIndex() + ": " + iterator.next());
}