List接口
继承了Collection接口
ListIterator迭代器
实现类
因为实现类太多,我们只看java.util和java.util.concurrent两个包下的实现类。
java.util.ArrayList
数组列表,申请的内存必须是连续的。
- 增加:add(E e)
// 正常情况下时间复杂度是O(1),当扩容时为O(n)
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
- 增加:add(int index, E element)
// 极端情况,如尾部增加为O(1),头部增加为O(n),头部增加且扩容时为O(2n),平均复杂度为O(n)
public void add(int index, E element) {
rangeCheckForAdd(index);
ensureCapacityInternal(size + 1); // Increments modCount!!
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
elementData[index] = element;
size++;
}
- 删除:remove(int index)
// 极端情况,如尾部删除为O(1),头部删除为O(n),平均复杂度为O(n)
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;
}
public boolean remove(Object o) {
if (o == null) {
for (int index = 0; index < size; index++)
if (elementData[index] == null) {
fastRemove(index);
return true;
}
} else {
for (int index = 0; index < size; index++)
if (o.equals(elementData[index])) {
fastRemove(index);
return true;
}
}
return false;
}
private void fastRemove(int index) {
modCount++;
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
}
- 修改:set(int index, E element)
// O(1)
public E set(int index, E element) {
rangeCheck(index);
E oldValue = elementData(index);
elementData[index] = element;
return oldValue;
}
- 查询:get(int index)
// O(1)
public E get(int index) {
rangeCheck(index);
return elementData(index);
}
- 查询:indexOf(Object o)
// O(n)
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (