底层是基于数组实现的。java
这里须要说明一下,由于 ArrayList 元素增删涉及增删元素位置以后的元素移动,极大的影响了性能。
固然这里提出两个观点:算法
- 第一种状况:假如增删元素在 ArrayList 的末尾,这种状况下和 LinkedList 的性能优越就须要再次讨论。
- 第二种状况:假如增删元素在 ArrayList 的中间,咱们要知道,LinkedList 的性能损耗只要体如今元素遍历上,而 ArrayList 的性能损耗主要体如今复制移动元素上,因此这种状况下二者的性能优越性还须要再次讨论。
话题来到咱们讨论的重点,ArrayList 的扩容机制:
前面咱们说道,ArrayList 的底层是数组,那么数组的一个特性就是初始化必需要指定大小,那么随着元素的不断增长,如何进行扩容就成为了一个须要关注的问题。数组
咱们在进行添加 add() 操做以前,会首先判断 size 的大小,判断是否能执行add()操做而不报错。数据结构
public boolean add(E e) { ensureCapacityInternal(size + 1); elementData[size++] = e; return true; }
先调用 ensureCapacityInternal 方法,传入 size+1 进去,检查是否须要扩充 elementData 数组的大小。post
若是肯定须要扩容的话,使用 grow() 方法,newCapacity = 扩充数组为原来的1.5倍(不能自定义),若是还不够,就使用它指定要扩充的大小minCapacity,而后判断minCapacity是否大于MAX_ARRAY_SIZE(Integer.MAX_VALUE - 8) ,若是大于,就取Integer.MAX_VALUE性能
在 ArrayList 成功扩充以后,最后一步要进行的是元素的复制,咱们这里调用的是 ArrayList 下的 arraycopy() 方法。code
部份内容参考自:
1.《数据结构与算法分析:java语言描述》
2.https://juejin.im/post/5d42ab...ci