Java集合-ArrayList的扩容机制

ArrayList 的扩容机制

ArrayList 的简介

底层是基于数组实现的。java

  • 优势:查找性能优越(支持随机查找,直接使用数组下标进行查找)
  • 缺点:因为底层是基于数组进行实现的,在增删元素中表现很差

这里须要说明一下,由于 ArrayList 元素增删涉及增删元素位置以后的元素移动,极大的影响了性能。
固然这里提出两个观点:算法

  • 第一种状况:假如增删元素在 ArrayList 的末尾,这种状况下和 LinkedList 的性能优越就须要再次讨论。
  • 第二种状况:假如增删元素在 ArrayList 的中间,咱们要知道,LinkedList 的性能损耗只要体如今元素遍历上,而 ArrayList 的性能损耗主要体如今复制移动元素上,因此这种状况下二者的性能优越性还须要再次讨论。

ArrayList 的扩容机制

话题来到咱们讨论的重点,ArrayList 的扩容机制:
前面咱们说道,ArrayList 的底层是数组,那么数组的一个特性就是初始化必需要指定大小,那么随着元素的不断增长,如何进行扩容就成为了一个须要关注的问题。数组

1.预操做:添加元素add()方法

咱们在进行添加 add() 操做以前,会首先判断 size 的大小,判断是否能执行add()操做而不报错。数据结构

public boolean add(E e) {
    ensureCapacityInternal(size + 1);
    elementData[size++] = e;
    return true;
}

先调用 ensureCapacityInternal 方法,传入 size+1 进去,检查是否须要扩充 elementData 数组的大小。post

2.进行扩容:grow()

若是肯定须要扩容的话,使用 grow() 方法,newCapacity = 扩充数组为原来的1.5倍(不能自定义),若是还不够,就使用它指定要扩充的大小minCapacity,而后判断minCapacity是否大于MAX_ARRAY_SIZE(Integer.MAX_VALUE - 8) ,若是大于,就取Integer.MAX_VALUE性能

3.元素的复制

在 ArrayList 成功扩充以后,最后一步要进行的是元素的复制,咱们这里调用的是 ArrayList 下的 arraycopy() 方法。code


部份内容参考自:
1.《数据结构与算法分析:java语言描述》
2.https://juejin.im/post/5d42ab...ci

相关文章
相关标签/搜索