集合框架之从JDK1.8源码中看ArrayList

最近事比较多,转眼一看,已经一个多月没更新博客了,万丈高楼平地起,准备花一段时间对Java中基本的数据结构作个归纳整理。

ArrayList

这个数据结构相信对于接触Java的人来说,最熟悉不过了,它本身是一个基于数组实现的集合。

ArrayList默认初始化的容量大小为

private static final int DEFAULT_CAPACITY = 10;

扩容

我们通常使用ArrayList过程中,似乎可以不停的往里面添加各种数据,那它到底是怎么实现的呢?这是笔者根据源码整理的大致的扩容过程:

每次添加新元素的时候,ArrayList内部都会将当前的容量+1,得到目标容量minCapacity大小,然后和当前的数组容量对比,如果目标容量大于当前容量,就会调用grow方法进行扩容操作,每次扩容,大小都会增加1.5倍,然后会调用Arrays.copyOf将旧数组中的元素复制到新数组中,最后移动新数组的下标,将新元素进行赋值。

下面是扩容方法的实现过程:

    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);
    }

特性

ArrayList特性描述
是否允许空允许
是否允许重复数据允许
是否有序有序
是否线程安全非线程安全

因为ArrayList不是线程安全的,因此多线程环境下可以考虑用Collections.synchronizedList()返回一个线程安全的ArrayList类,也可以使用concurrent并发包下的CopyOnWriteArrayList类。

小结

  1. ArrayList有三个构造方法,无参构造方法构造的ArrayList的容量默认为10
  2. Arrays.copyof()内部调用的实际就是System.arraycopy方法,每次扩容1.5倍
  3. ArrayList基于数组实现,通过下标索引直接查找到指定位置的元素,因此查找效率高,但每次插入或删除元素,就要大量地移动元素,插入删除元素的效率低
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值