ArrayList的底层和扩容

本文主要介绍了ArrayList的基本概念,包括其底层的数据结构、ArrayList与LinkedList的区别,重点解析了ArrayList的扩容机制,详细阐述了扩容过程中涉及的方法及计算逻辑,强调了在大量元素添加前使用ensureCapacity方法的重要性。
摘要由CSDN通过智能技术生成

对ArrayList的理解

此文为参考javaguide所提供的面试题,从中总结,如想了解详情,请点击链接
javaguide

1.简介

ArrayList是List的实现类,它的底层是用Object数组存储,线程不安全

适合用于频繁的查询工作,因为底层是数组,可以快速通过数组下标进行查找。

2.ArrayList与LinkedList的区别(5个方面)

1.他们都是线程不安全的。

2.ArrayList底层是object数组,linkedlist底层是使用双向链表。

3.ArrayList是采用数组存储,所以插入和删除元素的时间复杂度受元素位置影响。add方法将指定的元素添加到列表的末尾,为O(1)。在指定位置 i 插入和删除元素的话(add(int index, E element))时间复杂度就为 O(n-i) 。linkedlist是使用双向链表的,所以插入和删除元素的时间复杂度受不受元素位置影响。在指定位置 i 插入和删除元素的话(add(int index, E element))时间复杂度就为 O(n)需要移动到指定的位置在插入。

4.ArrayList可以快速随机访问,它实现了RandomAccess接口(RandomAccess这个接口是标记接口,实现它代表该结构支持快速随机访问)。linkedList不支持。

5.内存占用情况:A 浪费空间体现在它的底层是数组所以要在末尾预留一定容量的空间。L的每一个元素占用的空间都比A的多,因为是双向链表(存在前继和后继以及数据)

线程安不安全,底层数据结构,插入和删除的时间复杂度,快速随机访问,内存占用

3.ArrayList源码的理解
6个参数
 private static final long serialVersionUID = 8683452581122892189L;
/**
 * 默认初始容量大小
 */
private static final int DEFAULT_CAPACITY = 10;

/**
 * 空数组(用于空实例)。
 */
private static final Object[] EMPTY_ELEMENTDATA = {
   };

 //用于默认大小空实例的共享空数组实例。
  //我们把它从EMPTY_ELEMENTDATA数组中区分出来,以知道在添加第一个元素时容量需要增加多少。
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {
   };

/**
 * 保存ArrayList数据的数组
 */
transient Object[] elementData; // non-private to simplify nested class access

/**
 * ArrayList 所包含的元素个数
 */
private int size;
3个构造方法

一个带初始容器参数的构造函数,一个默认构造函数,一个包含指定集合的元素的集合。

需要注意默认构造函数(this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;)*实际上初始化赋值的是一个空数组。当真正对数组进行添加元素操作时,才真正分配容量。即向数组中添加第一个元素时,数组容量扩为 10

/**
     * 带初始容量参数的构造函数(用户可以在创建ArrayList对象时自己指定集合的初始大小)
     */
    public ArrayList(int initialCapacity) {
   
        if (initialCapacity > 0) {
   
            //如果传入的参数大于0,创建initialCapacity大小的数组
            this.elementData = new Object[initialCapacity];
        } else 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值