ArrayList 回顾

作者: 厌恶狡诈心机 | 来源:发表于2017-08-01 12:28 被阅读3次

ArrayList特性

  • 可以随机访问,按照索引位置进行访问效率很高,用算法描述中的术语,效率是O(1),简单说就是可以一步到位。
  • 除非数组已排序,否则按照内容查找元素效率比较低,具体是O(N),N为数组内容长度,也就是说,性能与数组长度成正比。
  • 添加元素的效率还可以,重新分配和拷贝数组的开销被平摊了,具体来说,添加N个元素的效率为O(N)。
    插入和删除元素的效率比较低,因为需要移动元素,具体为O(N)。

实现接口

  • Collection/List/RandomAccess/Cloneable/Serializable

内部主要组成部分

private transient Object[] elementData;//数组
private int size;//元素长度

数组长度扩展:1.5倍增长

private void grow(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    if (newCapacity - minCapacity < 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);
}

数组长度

        最小长度10
        最大长度Integer.MAX_ARRAY_SIZE

因为实现Iterable支持foreach遍历语法

有两个迭代方法

  public Iterator<E> iterator();//向后
  public ListIterator<E> listIterator();//向前
  public ListIterator<E> listIterator(int index);//指定位置向前

常见错误用法

迭代过程中修改数组结构(remove、add、set)会抛出异常ConcurrentModificationException
删除可用迭代器中的删除,并且删除前调用next方法it.next();

相关文章

网友评论

    本文标题:ArrayList 回顾

    本文链接:https://www.haomeiwen.com/subject/rlqjlxtx.html