java 集合框架-ArrayList

Posted 智公博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 集合框架-ArrayList相关的知识,希望对你有一定的参考价值。

在上一篇中我们描述了AbstractList的一些特性,包括迭代器的快速失败机制,这篇我们继续分享List下最常用的ArrayList以及非常类似的Vector,ArrayList具体实现类主要有以下特性:
- 支持动态大小,集合的大小可以自动扩展
- 不是线程同步安全,所有方法都不同步
- 实现支持迭代器快速失败

Vector 容器在开发中比较少是用到,内部实现与特性基本都是与ArrayList一样的,只是他是同步容器,起始就是所有的外部操作方法都是使用了synchronized关键字的

两个容器都是使用一个Object[] 数组作为底层的容器存储,所以支持随机索引访问;对ArrayList和Vector这里只重点关注底层数组的改变:扩容、移除数据;

会导致扩容的方法有:add、addAll、ensureCapacity,ensureCapacity方法是保证集合大小满足指定大小,主要用于要开始插入大量数据前调用,一次性扩容到需要大小,避免重复扩容;

所有add方法都会先调用ensureCapacityInternal方法:

    private void ensureCapacityInternal(int minCapacity) 
        if (elementData == EMPTY_ELEMENTDATA) 
            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
        

        ensureExplicitCapacity(minCapacity);
    

该方法保证扩容大小最小为DEFAULT_CAPACITY,因为在没有指定初始化大小是,底层数组是 EMPTY_ELEMENTDATA=;

    private void ensureExplicitCapacity(int minCapacity) 
        modCount++;  //集合结构变化

        // overflow-conscious code
        if (minCapacity - elementData.length > 0)  //保证扩容大小要大于当前数组大小
            grow(minCapacity);
    
    private void grow(int minCapacity) 
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1); //增加当前大小1/2
        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);
    

这段就是我们常说的ArrayList扩容会默认大小增加为当前大小的1/2,重点的数组扩容方法:Arrays.copyOf

    public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) 
        T[] copy = ((Object)newType == (Object)Object[].class)
            ? (T[]) new Object[newLength]
            : (T[]) Array.newInstance(newType.getComponentType(), newLength);
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    

Arrays.copyOf 方法底层是使用 Native 方法 System.arraycopy,这个本地方法,肯定是要比新建数组,循环赋值要快速很多的,大家可以使用测试代码测试下速度差异;

同样所有的移除方法也是使用System.arraycopy进行了数组的复制;

以上是关于java 集合框架-ArrayList的主要内容,如果未能解决你的问题,请参考以下文章

深入理解java集合框架之---------Arraylist集合 -----构造函数

深入理解java集合框架之---------Arraylist集合 -----添加方法

java集合框架之ArrayList

第一节:Java集合框架之ArrayList

手写ArrayList集合框架

Java源码解析——集合框架——ArrayList