ArrayList底层结构与源码分析

ArrayList是一个基于数组的列表,允许元素为null,非线程安全,效率高。初始容量为0,首次添加元素时扩容为10,后续按1.5倍扩容。Vector与ArrayList类似,但线程安全,扩容为原容量的两倍。两者底层均维护Object数组。

ArrayList特点:

  1. ArrayList底层维护的是一个数组。
  2. ArrayList允许一个或多个元素为null。
  3. ArrayList基本等同于Vector,但ArrayList是线程不安全的(执行效率高),所有在多线程的情况下,不建议使用ArrayList。

ArrayList底层:

1.使用无参构造ArrayList对象.

1.初始化对象

//使用无参构造器创建 ArrayList 对象
ArrayList list = new ArrayList(); //dubug进入

其中elementData就是实质上存放数据的地方,是一个Object数组,也就应证了ArrayList底层维护的是一个数组这个说法。

经过dubug,new ArrayList()这一步只是给elementData赋值了一个空数组,没有做任何的其他操作。

2.第一次添加数据

首先进行的是一个数据的装箱操作。

 随后执行add()方法。

 可以看到,在add方法的第一行,有一个ensureCapacityInternal()的方法,每次执行add()方法总是会执行 ensureCapacityInternal()方法,其含义是是否执行扩容。

 该方法确定minCapacity,第一次扩容为10。专门处理第一次添加元素。

 ensureExplictitCapacity()方法为确定要扩容的方法,modCount是记录集合被修改的次数。if语句的含义是如果数组长度不够最小需要的长度,就执行扩容。grow为真正扩容的方法。

可以看到,第一次扩容为10,之后为长度的1.5倍(oldCapacity >> 1),扩容的机制是数组拷贝(Arrays.copyOf())。

2.使用有参构造ArrayList对象。

 

 直接初始化elementData为指定大小的数组。

其他操作和无参构造一样。

Vector

他是线程安全的,但是执行效率不如ArrayList。Vector的底层与ArrayList大同小异,首先,它们默认初始化长度都为10,但是Vector的扩容是以两倍来扩容,ArrayList是1.5倍。底层的实现机制相似。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值