Java集合---ArrayList(2)

用途与特点
可用于在需要存储有序的,可动态扩充集合大小的情况使用。可以看做是一个动态的数组。虽然该集合理论上是可以动态无限扩充,但也有最大长度限制。

实现算法

ArrayList的底层实现方式其实就是Object[]数组实现,根据封装会存储实际存储大小Size对象,与存放数据的elementData。

默认初始数组长度是10,最大集合长度是Integer.MAX_VALUE大概21亿多

添加

添加数据扩容

删除

删除逻辑

在删除数据时只会对数组进行移到操作,并不会修改调整数组的长度,所以对于内存方面如创建一个长度是100的数据集合,删除了90个数据,集合数组长度也不会缩小。

public E remove(int index) {
        rangeCheck(index);

        modCount++;
        E oldValue = elementData(index);

        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);//只对数组进行了移动,并未调整数组大小
        elementData[--size] = null; // clear to let GC do its work

        return oldValue;
    }

扩容机制

扩容时机:是在加入数据时,elementData已满时进行扩容

扩充的新数组长度是: 原数组长度 + (原数组长度 / 2)

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

是否线程安全,为什么?

非线程安全,因为在源码中未对数据的添加、删除、读取等做锁操作

根据jdk1.8版本源码解读

转载于:https://my.oschina.net/u/1019754/blog/2966583

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值