ArrayList面试题

1.ArrayList底层原理

答:ArrayList底层数据结构是一个动态数组。

2.ArrayList添加数据的过程?

答:ArrayList的初始长度是0,第一次添加数据是将数组容量初始化为10,该过程未进行扩容。当添加的数组容量超过10,ArrayList进行扩容,扩容的容量是原来的1.5倍。

private void add(E e, Object[] elementData, int s) {//e:要添加的元素 elementData:动态数组的名字 s:集合长度/现在元素应存入的位置
    if (s == elementData.length)
        elementData = grow();//调用grow()方法
    elementData[s] = e;
    size = s + 1;
}    

private Object[] grow() { return grow(size + 1); }//调用无参构造,在无参构造中继续调用有参构造
private Object[] grow(int minCapacity) {//minCapacity=size+1
    int oldCapacity = elementData.length;//将数组长度传给老容量
    if (oldCapacity > 0 || elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        int newCapacity = ArraysSupport.newLength(oldCapacity,
                minCapacity - oldCapacity, //至少新增的容量
                oldCapacity >> 1     //默认新增容量大小      );
        return elementData = Arrays.copyOf(elementData, newCapacity);//将第一个参数中的所有数据,全部拷贝到新数组中,按照第二个参数创建新数组
    } else {
        return elementData = new Object[Math.max(DEFAULT_CAPACITY, minCapacity)];
    }
}
public static int newLength(int oldLength, int minGrowth, int prefGrowth) {
    int prefLength = oldLength + Math.max(minGrowth, prefGrowth); //新数组的真正长度
    if (0 < prefLength && prefLength <= SOFT_MAX_ARRAY_LENGTH) {
        return prefLength;
    } else {   
        return hugeLength(oldLength, minGrowth);
    }
}

minGrowth:如果一次添加一个元素,minGrowth=1,此时扩容一个单位。

prefGrowth:如果一次添加多个元素,假如添加50个,prefGrowth=50,此时数组需要扩容50个单位。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值