<>ArrayList源码分析

<>前言:

写这篇博客的主要原因是,在我上一次参加千牵科技Java实习生面试时,有被面试官问到ArrayList为什么查找的速度较快,插入和删除的速度较慢?当时我回答得不好,很大的一部分原因是因为我没有阅读过ArrayList源码,虽然最后收到Offer了,但我拒绝了,打算寒假学得再深入些再广泛些,下学期开学后再去投递其他更好的公司。为了更加深入理解ArrayList,也为了在面试中占据更多的优势,我写下这篇博客。

<>基本认识

1.概念:

ArrayList是一个其容量能够动态增长的动态数组。但是他又和数组不一样,下面会分析对比。它继承了AbstractList,实现了List、RandomAccess,
Cloneable, java.io.Serializable.
2.继承关系:

可以清晰地看到,ArrayList的继承关系
那么它继承的这些类、实现的这些接口对于它的特性有什么作用或意义呢?

* ArrayList 继承了AbstractList,实现了List。它是一个数组队列,提供了相关的添加、删除、修改、遍历等功能
* ArrayList 实现了RandmoAccess接口,即提供了随机访问功能。
* ArrayList 实现了Cloneable接口,即重写了函数clone(),能被克隆
* ArrayList 实现了java.io.Serializable接口,这意味着ArrayList支持序列化,能通过序列化去传输
*
和Vector不同,ArrayList中的操作不是线程安全的!所以,建议在单线程中才使用ArrayList,而在多线程中可以选择Vector或者CopyOnWriteArrayList。
<>属性
//序列化ID private static final long serialVersionUID = 8683452581122892189L; /**
* Default initial capacity.默认初始化大小为10 */ private static final int
DEFAULT_CAPACITY= 10; /** * Shared empty array instance used for empty
instances. 为一个空对象提供的空数组 */ private static final Object[] EMPTY_ELEMENTDATA = {};
/** * Shared empty array instance used for default sized empty instances. We *
distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when *
first element is added. * 为一个空对象提供的空数组,内容为{} */ private static final Object[]
DEFAULTCAPACITY_EMPTY_ELEMENTDATA= {}; /** * The array buffer into which the
elements of the ArrayList are stored. * The capacity of the ArrayList is the
length of this array buffer. Any * empty ArrayList with elementData ==
DEFAULTCAPACITY_EMPTY_ELEMENTDATA * will be expanded to DEFAULT_CAPACITY when
the first element is added. * 当前数据对象存放地方,当前对象不参与序列化 */ transient Object[]
elementData; // non-private to simplify nested class access /** * The size of
the ArrayList (the number of elements it contains). * 当前数组长度,即数组中包含元素的个数 *
@serial */ private int size;
<>构造方法
/** * Constructs an empty list with the specified initial capacity. *
构造一个初始容量为initialCapacity的空列表 * @param initialCapacity the initial capacity of
the list * @throws IllegalArgumentException if the specified initial capacity *
is negative */ public ArrayList(int initialCapacity) { if (initialCapacity > 0)
{ //初始化一个大小为initialCapacity的数组 this.elementData = new Object[initialCapacity]; }
else if (initialCapacity == 0) { //初始化一个数组Object[] EMPTY_ELEMENTDATA = {}; this.
elementData= EMPTY_ELEMENTDATA; } else { //抛出异常 throw new
IllegalArgumentException("Illegal Capacity: "+ initialCapacity); } } /** *
Constructs an empty list with an initial capacity of ten. */ public ArrayList()
{ //初始化一个默认的 DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}数组,即空数组 this.elementData =
DEFAULTCAPACITY_EMPTY_ELEMENTDATA; } /** * Constructs a list containing the
elements of the specified * collection, in the order they are returned by the
collection's * iterator. * 将集合数组化,并将其拷贝给ArrayList数组 * @param c the collection
whose elements are to be placed into this list * @throws NullPointerException
if the specified collection is null */ public ArrayList(Collection<? extends E>
c) { elementData = c.toArray(); if ((size = elementData.length) != 0) { //
c.toArray might (incorrectly) not return Object[] (see 6260652) if (elementData.
getClass() != Object[].class) elementData = Arrays.copyOf(elementData, size,
Object[].class); } else { // replace with empty array. this.elementData =
EMPTY_ELEMENTDATA; } }

技术
©2019-2020 Toolsou All rights reserved,
王者荣耀背景故事整合痴心妄想随机森林篇 R语言实现用C++跟你聊聊“原型模式” (复制/拷贝构造函数)再见!经典版Edge!PYTHON入门期末复习汇总2021年1月程序员工资统计,平均14915元详解ubuntu14.04如何设置静态IP胡润:中国600万资产“富裕家庭”数量首次突破500万户苹果与日产对话暂停,Apple Car进展如何?