day26上
集合框架图
标绿已经学习底层,深入底层主要是研究实现类底层
继承关系图
手撕ArrayList底层源码
ps:研究添加元素的过程
思路:
1.研究继承关系
2.研究属性
3.理解创建集合的过程 – 构造方法的底层原理
4.研究添加元素的过程
提升:
1.研究删除集合的过程
2.研究遍历集合的过程
场景
//ArrayList<String> list = new ArrayList<>();
ArrayList<String> list = new ArrayList<>(10000);
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
底层
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
//回顾:其中抽象类的构造方法由子类调用
//外部操作数(记录添加和删除的次数)
protected transient int modCount = 0;//最终4
}
额外补充:
//空数据,没有对象,输出长度为空指针异常
private static final Object[] EMPTY_ELEMENTDATA = null;
//空内容的数组,有对象,输出长度为0
private static final Object[] EMPTY_ELEMENTDATA = {};
//默认容量的空内容的数组,有对象,(后面两个对象不同)
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
public class ArrayList<E> extends AbstractList<E> implements List<E>{
//默认初始化容量
private static final int DEFAULT_CAPACITY = 10;
//空内容的数组
private static final Object[] EMPTY_ELEMENTDATA = {
};
//默认容量的空内容的数组
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {
};
//数据容器最大容量
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
//数据容器 - [“aaa”,"bbb","ccc","ddd",null,null,null,null,null,null]
transient Object[] elementData;//new Object[10];
//元素个数
private int size;//最终4
//无参构造,默认容量的空内容的数组
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
//有参构造,初始化容量
//initialCapacity - 10000
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException