ArrayList(JDK1

本文深入剖析了ArrayList的源码,包括其构造方法、内部类、核心方法如add()、remove()、get()、set()等。ArrayList基于数组实现,具有动态扩容、查询快等特点。在大数据插入时,建议预先使用ensureCapacity()方法避免频繁扩容。删除操作会移动元素并更新索引,get()和set()方法则提供快速访问和修改元素的能力。
摘要由CSDN通过智能技术生成

:既然是源码,为什么要这样设计类,有这样的继承关系。这就要说到设计模式的问题了。所以我们要了解常用的设计模式,才能更深刻的去理解这个类。

文章目录

    • 简介
  • 继承关系图

  • 成员变量

  • 构造方法

  • 内部类

  • 核心方法

    • add()方法(有四个)
  • 对数组的容量进行调整

  • 大数据插入问题

  • remove()方法

  • get()方法

  • set()方法

  • indexOf()方法

  • contains()方法

  • toArray()方法

  • System.arraycopy()和 Arrays.copyOf()方法

    • System.arraycopy()方法
  • Arrays.copyOf()方法

  • 两者联系与区别

简介


ArrayList 是 Java 集合框架中 List 接口的一个实现类。底层是数组,相当于动态数组。与 Java 中的数组相比,它的容量能动态增长。

ArrayListVector的翻版,区别在于ArrayList是线程不安全的,而Vector则是线程安全的。但是Vector是一个较老的集合,具有很多缺点,不建议使用,这里我们就不对其进行分析了。

ArrayList 可以说是我们使用最多的 List 集合,它有以下特点:

  • 它是基于数组实现的List类

  • 可以动态地调整容量

  • 有序的(元素输出顺序与输入顺序一致)

  • 元素可以为 null

  • 不同步,非线程安全,效率高

  • 查询快,增删慢

  • 占用空间更小,对比 LinkedList,不用占用额外空间维护链表结构

ArrayList 为什么有这些优点呢?我们通过源码来分析分析。在阅读源码前先来看看ArrayList继承关系。

继承关系图


ArrayList继承关系图

可以看到,ArrayListAbstractList的子类,同时实现了List接口。除此之外,它还实现了三个标识型接口,这几个接口都没有任何方法,仅作为标识表示实现类具备某项功能。RandomAccess表示实现类支持快速随机访问,Cloneable表示实现类支持克隆,具体表现为重写了clone方法,java.io.Serializable则表示支持序列化,如果需要对此过程自定义,可以重写writeObjectreadObject方法。

成员变量


// 序列号

private static final long serialVersionUID = 8683452581122892189L;

// 数组初始容量为 10

private static final int DEFAULT_CAPACITY = 10;

// 空对象数组

private static final Object[] EMPTY_ELEMENTDATA = {};

// 缺省空对象数组

private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

// 底层数据结构,数组

transient Object[] elementData;

// 数组元素个数,默认为0

private int size;

// 最大数组容量

private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

构造方法


//默认构造方法,初始为空数组。

//只有插入一条数据后才会扩展为10,而实际上默认是空的

public ArrayList() {

this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;

}

//根据指定容量创建对象数组

public ArrayList(int initialCapacity) {

if (initialCapacity > 0) {

//创建initialCapacity大小的数组

this.elementData = new Object[initialCapacity];

} else if (initialCapacity == 0) {

//创建空数组

this.elementData = EMPTY_ELEMENTDATA;

} else {

throw new IllegalArgumentException("Illegal Capacity: "+

initialCapacity);

}

}

/**

  • 构造一个包含指定集合的元素的列表,按照它们由集合的迭代器返回的顺序。

*/

public ArrayList(Collection<? extends E> c) {

//转换最主要的是toArray(),这在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值