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