【List篇】第二篇 ArrayList 详解(含图示说明)

Java中的ArrayList是一个动态数组,可以自动扩展容量以适应数据的添加和删除。它可以用来存储各种类型的数据,例如String,Integer,Boolean等。ArrayList实现了List接口,可以进行常见的List操作,例如添加、插入、删除和访问元素等。

在这里插入图片描述

源码分析(JDK1.8)

成员变量属性
/**
  * 默认长度为10
  */
 private static final int DEFAULT_CAPACITY = 10;

 /**
  * 用于空实例的共享空数组实例
  * 是为了优化创建ArrayList空实例时产生不必要的空数组,使所有的ArrayList空实例底
  * 层数据结构都指向同一个空数组
  * 例如:当构造参数是指定的长度,且为0 
  *      当构造参数是一个集合,且该参数集合中的元素个数为0
  */
 private static final Object[] EMPTY_ELEMENTDATA = {
   };

 /**
  * 用于默认大小的空实例的共享空数组实例。
  * 将其与EMPTY_ELEMENTDATA区分开来,以了解添加第一个元素时要扩容多少
  * 用于标记当前ArrayList是使用空参构造的,在第一次使用add添加元素时,数组的最大长度直接使用默认的10
  */
 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {
   };

 /**
  * ★ 存储ArrayList元素的数组缓冲区,ArrayList的容量就是这个数组缓冲区的长度
  * 添加第一个元素时,任何elementData==DEFAULTCAPACITY_empty_elementData的空ArrayList
  * 都将扩展为DEFAULT_CAPACITY(默认初始容量10)
  */
 transient Object[] elementData; 

 /**
  * ★ 记录ArrayList 的元素个数
  */
 private int size;

 /**
  * ★ 数组最大的长度
  */
 private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
构造方法

ArrayList 有三个构造函数,空参构造方法,指定初始容量值构造方法和指定集合元素列表的构造方法,如果集合中的元素不为空,新建的ArrayList集合中的元素顺序就是构造参数中的元素顺序

  • 空参构造
    之前在网上看到一个说法" 使用空参构造一个ArrayList时,默认会创建一个容量为10的数组",这个说法其实不准确。在JDK1.8以前是这样的,但是为了节省内存资源,在JDK1.8版本之后,使用空参构造方法,只会创建一个空底层数据结构长度为0的空数组结构,当第一次执行add添加元素时,才会将数组容量扩充到默认10
 public ArrayList() {
   
     this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
 }
  • 指定初始容量值构造
    如果在构建ArrayList之前,就能明确元素的个数,那么就可以在构造ArrayList时,指定容量大小,这样就可以节省因扩容而造成的资源浪费
 public ArrayList(int initialCapacity) {
   
     if (initialCapacity > 0) {
   
         //当指定参数大于0时,真实存储数据的数据长度就是指定值
         this.elementData = new Object[initialCapacity];
     } else if (initialCapacity == 0) {
   
         //当指定参数等于0时,使用空数组
         this.elementData = EMPTY_ELEMENTDATA;
     } else {
   
          //指定的长度参数不能小于0
         throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);
     }
 }
  • 构造参数是一个集合,并按照参数集合中元素个数和顺序返回新的ArrayList
 public ArrayList(Collection<? extends E> c) {
   
     Object[] a = c.toArray();
     if ((size = a.length) 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搬砖界的小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值