ArrayList底层原码分析

ArrayList底层原码

一、JDK7

1、构造器

//底层创建了长度是10的Object数组
ArrayList arrays = new ArrayList();

//底层创建了长度是100的Object数组
ArrayList arrays = new ArrayList(100);

2、添加

原码分析
//添加数据的方法
public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // 在原来的大小上再+1
        elementData[size++] = e;//将数据存储到数组中
        return true;
    }
    
//在添加时判断是否需要扩容的方法
private void ensureExplicitCapacity(int minCapacity) {
        modCount++;

        // 如果添加元素以后的所需的容量大小大于之前的数组大小,则需要扩容
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }
    
//扩容的方法
private void grow(int minCapacity) {
        // 记录原先的容量大小
        int oldCapacity = elementData.length;
        //新的容量大小是原来容量的1.5倍
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        //如果新的大小还不够
        if (newCapacity - minCapacity < 0)
        	//新的容量大小=添加元素以后的所需的容量大小
            newCapacity = minCapacity;
            //新的容量如果大小超过设定值
        if (newCapacity - MAX_ARRAY_SIZE > 0)
        //新的容量变为Integer.MAX_VALUE,或变为设定最大值MAX_ARRAY_SIZE 
            newCapacity = hugeCapacity(minCapacity);
        // 将旧数组内容拷贝到新数组
        elementData = Arrays.copyOf(elementData, newCapacity);
    }
总结

默认扩容是原来的1.5倍,随后将旧的元素拷贝到新的数组中。

JDK8

一、构造器

//底层创建了空数组
ArrayList arrays = new ArrayList();

//构造方法
 public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }
    
//初始化的值
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};


//底层创建了长度是100的Object数组
ArrayList arrays = new ArrayList(100);

2、添加

  • 与JDK7相比,给数组设置容量大小的步骤移到了添加步骤。
  • 第一次调用add()时,底层才创建了长度为10的数组,并将数据添加到elementDate第一个位置上。
  • 扩容操作与JDK7一致。

总结

  • JDK7中的ArrayList对象的创建类似于单例的饿汉式。
  • JDK8中的ArrayList对象的创建类似于单例的懒汉式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值