面试——ArrayList

本文深入探讨了ArrayList的底层实现,包括其无参和有参构造、扩容机制以及与LinkedList的区别。ArrayList作为数组列表,虽然线程不安全,但由于查询速度快,常用于普通查询场景。在增删元素时,ArrayList性能相对较慢,特别是删除操作,需要拷贝数组。另外,文章指出ArrayList不适合作为队列,而ArrayBlockingQueue则展示了数组在实现队列时的优势。在遍历性能上,ArrayList优于LinkedList。
摘要由CSDN通过智能技术生成

面试——ArrayList

1. 底层研究

1. ArrayList

底层是数组

1. 无参构造

构造一个初始容量为10的空列表
在这里插入图片描述
当给空数组链表添加第一个数据的时候,数组链表才会初始化长度
在这里插入图片描述
在这里插入图片描述

2. 有初始化容量的构造

在这里插入图片描述

3. 扩容

在这里插入图片描述

2. LinkedList

底层是链表

2. 有用过ArrayList吗?它是做什么用的?

  1. ArrayList就是数组列表,底层是数组
  2. ArrayList在装载基本数据类型时,实际装载的是对应的包装类
  3. 与ArrayList类似的还有LinkedList,他们俩相比:
  • ArrayList:查找和访问元素的速度快,新增、删除的速度慢。线程不安全,使用频率高。查询时间复杂度O(1)
  • LinkedList:查找和访问元素的速度慢,新增、删除的速度快。查询时间复杂度O(n)
    在这里插入图片描述

3. ArrayList线程不安全,为什么还要去用?

Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。

实际开发中有以下几种场景:

  • 频繁增删:使用LinkedList,但是涉及到频繁增删的场景不多
  • 追求线程安全:使用Vector
  • 普通的用来查询:使用ArrayList,使用的场景最多

根据数据结构的特性,三者难以全包含,只能在相互之间做取舍

4. ArrayList底层是数组,那是怎么实现不断扩容的?

  1. 使用ArrayList空参的构造器创建集合时,数组并没有创建。当集合中添加第一个元素时,数组被创建,初始化容量为10
  2. 当数组长度+1>数组容量时,这时需要对数组进行扩容,扩容公式:新长度=原长度+原长度>>1,也就是扩容到了原来的1.5倍
 /**
     * Increases the capacity to ensure that it can hold at least the
     * number of elements specified by the minimum capacity argument.
     *
     * @param minCapacity the desired minimum capacity
     */
    private void grow(int minCapacity) {
   
        // overflow-conscious code
        int oldCapacity = elementData.length;
        
  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值