具体的方法实现只会过一下,不足处欢迎小伙伴批评指出。
大家都知道ArrayList是个动态数组具体用到会实现扩容,下面我会围绕这个来简单讲一下
1.继承、接口
AbstractList // 对list的行为一些具体的实现,不过arraylist 基本重写了
List //标准list的约定方法
RandomAccess //这个纯粹就是底层算法的一种判断能力,别听网上瞎说,其实表示的是从下标1拿数据和下标99拿数据一样快
Cloneable //复制能力 这个了解深浅拷贝的同学就会知道
Serializable //序列化喽
2.基本变量
private static final int DEFAULT_CAPACITY = 10; //初始化大小
transient Object[] elementData;//存储元素的数组
private int size;//元素的大小, 这里指的实际存储大小
3.方法
//添加元素
public boolean add(E e) {
ensureCapacityInternal(size + 1); //这个比较有趣 其实是动态添加数组的 一系列操作,最核心的,添加的元素不满足数组长度就动态扩容
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);
}
别的方法没啥可讲 看看就明白
4.子类
Itr //内部私有类 实现Iterator 接口 这个就是大家常用的迭代器的具体实现,讲到迭代器就扯一下设计模式中的迭代器模式,总体来说就是操作迭代,和存储的集合分离,以方便修改替换,这里用子类来实现的,也就是我们设计中常说的,对象组合而不是继承。
ListItr //内部私有类 集合Itr 实现Iterator 相当于楼上的扩展
SubList //内部私有类 继承AbstractList 实现RandomAccess 其实好鸡肋,他相当于一个视图,就是通过subList方法返回的的对象操作的方法等同于操作原对象
//这个就是里面的具体方法
public void add(int index, E e) {
rangeCheckForAdd(index);
checkForComodification();
parent.add(parentOffset + index, e); //这里的parent就是调用时传过来的
this.modCount = parent.modCount;
this.size++;
}
ArrayListSpliterator // 内部私有类 实现Spliterator 这个就吊了哦, 这是并行计算的
具体的可以看这个 就不剽窃了
https://blog.youkuaiyun.com/lh513828570/article/details/56673804