ArrayList源码跟读

最近在看java基础的集合,尝试性的阅读下源码,绕不过的大山,所以浅记录一下

首先我们都知道 ArrayList是底层是一个动态数组,结合数组特性,那就是查询快,删除慢,因为有下标,而增加或者删除,整个数据结构都会变化,所以效率就比较低

 ArrayList arrayList = new ArrayList();//调构造方法
 //底层 其实就是定义了一个空的数组
 //private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; 
 //transient Object[] elementData; 
 public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }

当我们调用add方法是

arrayList.add("javaArrayList源码");
    
//看底层都干了啥呢
  public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }

//ensureCapacityInternal 这个方法字面翻译就是确保内部容量 其实就是动态扩容

ensureCapacityInternal 这个方法 调用了一个 calculateCapacity 这个方法是给数组容量赋值 默认为10

   private int size;
//第一次添加数据的时候,初始化一个int 类型的size变量 
//int minCapacity 这个值刚开始赋值为1
private void ensureCapacityInternal(int minCapacity) {
        ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
    }


//首先进行了数组容量的大小计算 并且赋值
//private static final int DEFAULT_CAPACITY = 10;
private static int calculateCapacity(Object[] elementData, int minCapacity) {
      //如果是第一次添加数组 
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            //返回 DEFAULT_CAPACITY 也就是10 与minCapacity 1的最大值 
            //这个就是说ArrayList 初始化是一个10的数组
            return Math.max(DEFAULT_CAPACITY, minCapacity);
           
        }
        //不是第一次添加 返回minCapacity 
        return minCapacity;              
    }
  private void ensureExplicitCapacity(int minCapacity) {
        modCount++;//这是父类 AbstractList 定义的一个统计的参数

        // 这个代码表示 当我需要的容量比数组的长度大
       //换言之就是我需要的最小容量 数组已经放不下了 就开始扩容
        if (minCapacity - elementData.length > 0)
            //这个是数组扩容
            grow(minCapacity);
    }

   private void grow(int minCapacity) {

        int oldCapacity = elementData.length;//把数组的长度 赋值oldCapacity 
        int newCapacity = oldCapacity + (oldCapacity >> 1);//数组新的容量是原来的1.5倍
      //这个判断其实就是第一册添加的时候 第一次的时候不是1.5倍扩容 而是把minCapacity 也就是10
        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:
        // Arrays.copyOf(elementData, newCapacity); 这个就是在原来的基础上追加  而不是清空数组
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

大概就是这么一个过程 其实还是蛮简单的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值