ArrayList源码解读
ArrayList继承了abstractList类,实现了List接口,可以看出ArrayList的本质是数组
成员变量:
1:private static final long serialVersionUID = 8683452581122892189L;// serialVersionUID 用来表明类的不同版本间的兼容性。如果你修改了此类, 要修改此值
2:private static final int DEFAULT_CAPACITY = 10;//默认创建数组的大小,DEFAULT默认的,CAPACITY容量
3:private static final Object[] EMPTY_ELEMENTDATA = {};//EE,EMPTY空,ELEMENTDATA元素数据
4:private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};//DEE,DEFAULTCAPACITY默认容量
5:transient Object[] elementData;//一个临时的数组
6:private int size;//数组大小
//EE和DEE的差别:
在有参构造器中:this.elementData = EMPTY_ELEMENTDATA;
在无参构造器中:this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
为什么这样划分:在Java7中只有一个类常量EE表示空数组。Java8中添加了DEE代替EE;
Java7中如果容量是0的话,会创建一个空数组,赋值给elementData,
如果一个应用中有很多ArrayList空实例,就会有很多的空数组,
EE是为了优化创建空实例时产生的不必要的空数组,使所有ArrayList空实例都指向同一个空数组
DEE是为了确保无参构成函数创建的实例在添加第一个元素时,最小的容量是默认大小10。
构造器:
略
成员方法(部分):
增:add方法:
public boolean add(E e) {
ensureCapacityInternal(size + 1); // 确保是否要扩容
elementData[size++] = e;
return true;
}
ensureCapacityInternal方法:
private void ensureCapacityInternal(int minCapacity) {//将添加元素后的大小siez+1传入,第一次传入实际值为1
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
calculateCapacity方法:
private static int calculateCapacity(Object[] elementData, int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {//如果elementData为空数组,即第一次添加
return Math.max(DEFAULT_CAPACITY, minCapacity);//返回默认大小和添加元素后大小的最大值
}//首次add时,calculateCapacity返回默认大小10,第二,第三次传入时,直接返回siez+1
return minCapacity;//如果是第二次传入,size+1为2,minCapacity也为2,
}
ensureExplicitCapacity方法:
private void ensureExplicitCapacity(int minCapacity) {
modCount++;//记录集合被修改的次数,防止多线程操作出现的异常
// overflow-conscious code
if (minCapacity - elementData.length > 0)//第一次扩容时为10-0>0,进入grow方法,
grow(minCapacity);
}
grow方法:
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);//1.5倍扩容
if (newCapacity - minCapacity < 0)//在首次add时,elementData长度为0.0-10<0,所以执行if语句,使newCaoacity为10;
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)//当数组扩容极大时,调用特殊方法hugeCapacity
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);//调用工具类Arrays的copyOf方法,在首次扩容时,将数组elementData尾部添加十个null。
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器