一 、ArrayList 与 LinkList 的区别
相同点:
1. 都是List的子类。
2. 允许空值
区别:
ArrayList:
1. 内部是数组结构实现
2. 数据的插入和删除都需要对数组复制和重排序(删除和插入比较慢)
3. 有序可以重复
4. 插入和删除比较慢
5. 查找效率高
LinkList:
1. 双向链表结构,对每一个元素都有指向前后元素的指针
2. 顺序读取效率比较高,随机读取元素效率比较低
3. 删除、插入效率高
4. 查询比较慢
二、ArrayList 添加元素
在查看源代码过程当中可以发现:当我们使用add(index,element) ; 方法时,在某个位置添加一个元素的操作,举例:add(0,5),在第一个位置加入一个5的元素。
public void add(int index, E element) {
// 比对下标和数据长度或者下标小于0,否则抛出数据下标越界
rangeCheckForAdd(index);
//DEFAULT_CAPACITY = 10 默认的容量是 10 ,最小值和默认参数对比(取最大的那个作为最小容量)
ensureCapacityInternal(size + 1); // Increments modCount!!
//移位复制 arraycopy,将 index 的位置空出去,本地方法C/c++写的。
System.arraycopy(elementData, index, elementData, index + 1,size - index);
//添加index元素
elementData[index] = element;
//数组长度自增
size++;
}
//10容量
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
//对比是否需要扩容
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
//计算容量
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