java中List接口与实现类介绍
作者:Jiao_Zhou 时间:2022-11-17 02:54:40
List接口介绍—ArrayList
有序、可重复
线程不安全,因为没有synchronized修饰
ArrayList源码结论
ArrayList中维护了一个Object类型的数组elementData。
transient Object[] elementData; // transient 表示该属性不会被序列化
当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData容量为0,第一次添加,则扩容elementData为10,如果需要再次扩容,则扩容elementData为1.5倍
如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容,则直接扩容elementData为1.5倍。
ArrayList源码分析
List list = new ArrayList();
for(int i = 0; i < 10; i++) {
list.add(1);
}
容器初始化为一个空数组
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
执行add方法
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
先确定是否要扩容
再执行扩容操作
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); //(10,1)
}
ensureExplicitCapacity(minCapacity);
}
先确定elementData是否是空数组,如果是空数组就赋给minCapacity最小容量10(DEFAULT_CAPACITY为10)
private void ensureExplicitCapacity(int minCapacity) {
modCount++; //记录当前集合被修改的次数
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
如果最小容量大于elementData实际大小的话,就执行扩容
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1); //扩容为1.5倍
if (newCapacity - minCapacity < 0) //newCapacity=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);
}
来源:https://blog.csdn.net/qq_41977637/article/details/122082474
标签:JAVA,List接口
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Android横竖屏切换及其对应布局加载问题详解
2023-12-17 20:45:13
Java日常练习题,每天进步一点点(40)
2022-12-20 14:39:53
![](https://img.aspxhome.com/file/2023/7/95977_0s.png)
Java中的SuppressWarnings注解使用
2023-08-18 17:31:19
![](https://img.aspxhome.com/file/2023/9/78269_0s.png)
Java BIO,NIO,AIO总结
2022-02-07 01:48:28
![](https://img.aspxhome.com/file/2023/1/61551_0s.png)
C# 读写自定义的Config文件的实现方法
2022-09-08 23:22:35
![](https://img.aspxhome.com/file/2023/5/91365_0s.png)
java GUI编程之监听操作实例分析
2022-09-28 05:55:53
Java函数式编程(八):字符串及方法引用
2022-05-02 22:28:23
springcloud-gateway整合jwt+jcasbin实现权限控制的详细过程
2023-11-20 12:57:09
![](https://img.aspxhome.com/file/2023/8/59078_0s.png)
Java毕业设计实战之校园一卡通系统的实现
2022-11-26 06:32:56
![](https://img.aspxhome.com/file/2023/1/72521_0s.jpg)
Android13 加强Intent filters 的安全性
2022-06-17 03:15:55
SpringBoot ApplicationListener事件监听接口使用问题探究
2023-03-04 22:44:13
SpringSecurity整合jwt权限认证的全流程讲解
2022-02-20 09:58:36
![](https://img.aspxhome.com/file/2023/0/113200_0s.png)
Java Map简介_动力节点Java学院整理
2023-06-03 20:27:03
举例讲解Java的Spring框架中AOP程序设计方式的使用
2022-11-21 21:22:15
Android日期时间格式国际化的实现代码
2023-08-28 04:44:42
JAVA如何按字节截取字符串
2023-11-25 13:31:41
spring boot ${}占位符不起作用的解决方案
2022-06-28 20:49:29
![](https://img.aspxhome.com/file/2023/0/70580_0s.png)
你都理解创建线程池的参数吗?
2022-06-10 06:36:05
![](https://img.aspxhome.com/file/2023/2/61662_0s.jpg)
Java 蒙特卡洛算法求圆周率近似值实例详解
2023-10-19 23:32:10
C#获取计算机硬件与操作系统的相关信息
2022-12-12 07:11:36
![](https://img.aspxhome.com/file/2023/2/92982_0s.png)