ArrayList 为啥添加元素时会比较慢?

一 、ArrayList 与 LinkList 的区别

相同点:

1. 都是List的子类。
2. 允许空值

区别:

ArrayList:
	1. 内部是数组结构实现
	2. 数据的插入和删除都需要对数组复制和重排序(删除和插入比较慢)
	3. 有序可以重复
	4. 插入和删除比较慢
	5. 查找效率高
LinkList:
	1. 双向链表结构,对每一个元素都有指向前后元素的指针
	2. 顺序读取效率比较高,随机读取元素效率比较低
	3. 删除、插入效率高
	4. 查询比较慢

二、ArrayList 添加元素

在查看源代码过程当中可以发现:当我们使用add(index,element) ; 方法时,在某个位置添加一个元素的操作,举例:add(0,5),在第一个位置加入一个5的元素。

    public void add(int index, E element) {
   
        // 比对下标和数据长度或者下标小于0,否则抛出数据下标越界
        rangeCheckForAdd(index);
		//DEFAULT_CAPACITY = 10 默认的容量是 10 ,最小值和默认参数对比(取最大的那个作为最小容量)
        ensureCapacityInternal(size + 1);  // Increments modCount!!
    
        //移位复制 arraycopy,将 index 的位置空出去,本地方法C/c++写的。
	
        System.arraycopy(elementData, index, elementData, index + 1,size - index);
        //添加index元素
        elementData[index] = element;
        //数组长度自增
        size++;
    } 
    //10容量
    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);
        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
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值