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进行了数组的复制;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值