最近在看java基础的集合,尝试性的阅读下源码,绕不过的大山,所以浅记录一下
首先我们都知道 ArrayList是底层是一个动态数组,结合数组特性,那就是查询快,删除慢,因为有下标,而增加或者删除,整个数据结构都会变化,所以效率就比较低
ArrayList arrayList = new ArrayList();//调构造方法
//底层 其实就是定义了一个空的数组
//private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
//transient Object[] elementData;
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
当我们调用add方法是
arrayList.add("javaArrayList源码");
//看底层都干了啥呢
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
//ensureCapacityInternal 这个方法字面翻译就是确保内部容量 其实就是动态扩容
ensureCapacityInternal 这个方法 调用了一个 calculateCapacity 这个方法是给数组容量赋值 默认为10
private int size;
//第一次添加数据的时候,初始化一个int 类型的size变量
//int minCapacity 这个值刚开始赋值为1
private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
//首先进行了数组容量的大小计算 并且赋值
//private static final int DEFAULT_CAPACITY = 10;
private static int calculateCapacity(Object[] elementData, int minCapacity) {
//如果是第一次添加数组
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
//返回 DEFAULT_CAPACITY 也就是10 与minCapacity 1的最大值
//这个就是说ArrayList 初始化是一个10的数组
return Math.max(DEFAULT_CAPACITY, minCapacity);
}
//不是第一次添加 返回minCapacity
return minCapacity;
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++;//这是父类 AbstractList 定义的一个统计的参数
// 这个代码表示 当我需要的容量比数组的长度大
//换言之就是我需要的最小容量 数组已经放不下了 就开始扩容
if (minCapacity - elementData.length > 0)
//这个是数组扩容
grow(minCapacity);
}
private void grow(int minCapacity) {
int oldCapacity = elementData.length;//把数组的长度 赋值oldCapacity
int newCapacity = oldCapacity + (oldCapacity >> 1);//数组新的容量是原来的1.5倍
//这个判断其实就是第一册添加的时候 第一次的时候不是1.5倍扩容 而是把minCapacity 也就是10
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:
// Arrays.copyOf(elementData, newCapacity); 这个就是在原来的基础上追加 而不是清空数组
elementData = Arrays.copyOf(elementData, newCapacity);
}
大概就是这么一个过程 其实还是蛮简单的