ArrayList底层结构与源码分析

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倍。底层的实现机制相似。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值