ArrayList常见面试题

1. ArrayLsit 和 LinkedList的区别

ArrayListLinkedList
基于数组实现,在内存空间是连续的基于链表实现,在内存空间是分散的
查找和添加效率高插入和删除效率高
是非线程安全的数据结构也是非线程安全的数据结构

2. ArrayList和Array数组的区别

ArrayListArray数组
只能存放引用数据类型既能存放基础数据类型也能存放引用数据类型
动态扩容,无需在创建时指定容量固定容量,在创建时必须指定容量
提供了很多方便的如add,remove,set,get方法没有提供

3. 讲讲ArrayList的扩容机制

​ 当使用无参构造方法创建ArrayList时,ArrayList的初始容量为0,elementData指向一个空数组。当第一次开始调用add()时,才会进行扩容,初始容量为10。随后每次调用add()时都会判断容量是否充足,若不足则会创建一个为原来容量的1.5倍的数组,然后再将旧的数组拷贝到新的数组中去完成扩容。

参考

  • 核心grow方法
/**
   * 要分配的最大数组大小
    */
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

/**
   * ArrayList扩容的核心方法。
   */
private void grow(int minCapacity) {
    
    // minCapacity为最小所需容量,oldCapacity为旧容量,newCapacity为新容量
    int oldCapacity = elementData.length;
    
    //将oldCapacity 右移一位,其效果相当于oldCapacity /2,即将新容量设置为旧容量的1.5倍
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    
    //然后检查新容量是否大于最小需要容量,若还是小于最小需要容量,那么就把最小需要容量当作数组的新容量(初始化容量时)
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    
    // 如果新容量大于 MAX_ARRAY_SIZE,进入(执行) `hugeCapacity()` 方法来比较 minCapacity 和 MAX_ARRAY_SIZE,
    //如果minCapacity大于最大容量,则新容量则为    `Integer.MAX_VALUE`,
    //否则,新容量大小则为   `Integer.MAX_VALUE - 8`
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    // minCapacity is usually close to size, so this is a win:
    elementData = Arrays.copyOf(elementData, newCapacity);
}

2021年6月24日10:08:34 持续更新…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值