ArrayList
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializabl
Cloneable实现clone方法进行对象复制,这里ArrayList是浅复制,复制值而已
RandomAccess,随机访问,其实里面啥都没有,但是在Iterator遍历的时候,你才知道它有没有,哈哈。参考https://blog.csdn.net/weixin_39148512/article/details/79234817,当实现RandomAccess接口的会使用for循环去遍历,而其他的是使用迭代器去实现
本质就是一个动态数组
变量
size ArrayList实际个数
transient Object[] elementData;储存数组
private static final int DEFAULT_CAPACITY = 10;默认个数是10个
构造方法
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
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);
}
}
它是如何扩展的呢
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);
}
一般发生在什么时候,add的时候进行调用,扩展是1.5倍
add方法
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
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++;
}
rangeCheckForAdd是看看索引会不会越界,ensureCapacityInternal看看是否需要扩容
remove的话将数组某下标设置为空
一般使用for循环去遍历的
https://www.cnblogs.com/xujian2014/p/4625346.html这博主写的更加详细可以参考一哈
总结一下:
ArratList一般使用foreach去遍历,因为for get()方法使用随机遍历
LinkedList使用的是顺序遍历,Iterator next()使用顺序遍历