【Java】ArrayList 底层是如何实现的?

  • ArrayList 底层基于数组实现,查询效率是非常高,增删效率非常低——错误
  • ArrayList 底层基于数组实现,根据index下标查询效率非常高——正确(误区——不是查询效率比较高)
  • 增——底层基于数组实现 扩容——效率低

ArrayList底层是基于数组实现的

根据index下标查询效率非常高,时间复杂度为O(1)

如果根据元素值查询 效率非常低 时间复杂度O(n) 


ArrayList 新增 如果底层数组容量不够的情况下

就会触发动态扩容机制 效率非常低的


ArrayList 删除操作,将删除后面的元素向前移动一位

效率也是非常低。

package com.collection.Demo07;

import java.util.ArrayList;

public class Test01 {
    public static void main(String[] args) {
        /**
         * ArrayList 底层基于数组实现的
         * ArrayList 根据index 下标查询效率非常高,而不是查询效率非常高
         */
        ArrayList<String> arrayList = new ArrayList<>();
//        arrayList.get(0);//get(index)
//        arrayList.set(0,"mayikt");//set(index,"值")
//        Object[] objects = new Object[10];
//        objects[0]="mayikt01";
//        objects[1]="mayikt02";
//        objects[2]="mayikt03";
    }
    /**
     * 时间复杂度
     * O(1): 基于数组的下标 index 查询 只需要查询一次,例如:Array[0]
     * O(n): 从头查询到尾部,例如:根据元素查询 将整个数组遍历 从头遍历到尾部
     */
    /**
     * ArrayList.get(index) 根据index下标查询的
     * 时间复杂度 O(1)
     * 如果 需要根据元素值查询 需要开发者 自定义
     * .set()也是一样,是根据index下标查询并更改的
     * 时间复杂度 O(1)
     * 如果是根据元素的值 修改 效率是非常的低的——时间复杂度 O(n)
     */
    /**
     * 为什么arrayList集合增加删除效率非常低
     * 数组——原生数组没有扩容的机制
     * ArrayList 最开始底层默认初始化数组的容量——10
     *
     * 动态扩容如何实现的?——扩容机制 效率非常低
     * 当10个空间满了,想存入第11个元素时,就会动态的创建一个原来数组的1.5倍(15)的新数组
     * 然后将旧数组中的10个元素copy到新的数组中,之后才可以添加第11个元素
     *
     * 删除效率也是非常低的?
     * 加入现在就10个元素,删除第2个元素
     * 当删除之后,后面的下标为3-9的元素整体向前移一位,
     * 然后将下标为9的位置置为null
     */
}

底层源码实现

ArrayList<String> arrayList = new ArrayList<>();

  • 数组 初始化是没有容量的
  • 懒加载的形式,正真需要使用的时候才会加载,例如(arrayList.add())
package com.collection.Demo07;

public class MayiktArrayList<E> {
    /**
     * 分析源码的技巧
     * 1. 先看构造函数,通过无参构造函数可以得出
     * public ArrayList() {
     *    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
     * }
     * transient Object[] elementData;
     * 默认底层初始化了一个空数组
     *
     * 2. 看方法实现
     * 2.1 分析add()底层实现
     * 2.1.1 判断是否需要扩容
     * 2.1.2 直接通过index赋值
     */
    private Object[] elementData;//集合需要存放元素
    private int size; //默认0

    public MayiktArrayList() {
        //无参构造函数 默认初始化容量大小 10
        elementData = new Object[10];
    }

    public void add(E e) {
        //第1次存放元素——index=0
        //第2次存放元素——index=1
        //所以这里定义了变量 size
        elementData[size++] = e;
    }
}

下一篇文章:Vector 与 ArrayList 集合区别

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值