码迷,mamicode.com
首页 > 其他好文 > 详细

ArrayList源码分析

时间:2019-01-26 21:04:30      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:存储   one   alc   修改   code   克隆   元素对象   clone()   快速   

ArrayList简介

public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
    ...
}

 

ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。

ArrayList 继承了AbstractList,实现了List。它是一个数组队列,提供了相关的添加、删除、修改、遍历等功能。
ArrayList 实现了RandmoAccess接口,即提供了随机访问功能。RandmoAccess是java中用来被List实现,为List提供快速访问功能的。在ArrayList中,我们即可以通过元素的序号快速获取元素对象;这就是快速随机访问。稍后,我们会比较List的“快速随机访问”和“通过Iterator迭代器访问”的效率。

ArrayList 实现了Cloneable接口,即覆盖了函数clone(),能被克隆。

ArrayList 实现java.io.Serializable接口,这意味着ArrayList支持序列化,能通过序列化去传输。

 

和Vector不同,ArrayList中的操作不是线程安全的!所以,建议在单线程中才使用ArrayList,而在多线程中可以选择Vector或者CopyOnWriteArrayList。

ArrayList属性

    
// 默认容量
private static final int DEFAULT_CAPACITY = 10;
// 一个空数组,当用户指定该 ArrayList 容量为 0 时,返回该空数组
private static final Object[] EMPTY_ELEMENTDATA = {};

/** 一个空数组实例
* - 当用户没有指定 ArrayList 的容量时(即调用无参构造函数),返回的是该数组==>刚创建一个 ArrayList 时,其内数据量为 0。
* - 当用户第一次添加元素时,该数组将会扩容,变成默认容量为 10(DEFAULT_CAPACITY) 的一个数组===>通过 ensureCapacityInternal() 实现
* 它与 EMPTY_ELEMENTDATA 的区别就是:该数组是默认返回的,而后者是在用户指定容量为 0 时返回
*/
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
/**
* ArrayList基于数组实现,用该数组保存数据, ArrayList 的容量就是该数组的长度
* - 该值为 DEFAULTCAPACITY_EMPTY_ELEMENTDATA 时,当第一次添加元素进入 ArrayList 中时,数组将扩容值 DEFAULT_CAPACITY(10)
*/
transient Object[] elementData;

/**
* 当前数组长度,也即ArrayList实际存储的数据数量
*/ private int size;

 

ArrayList构造函数

public ArrayList(int initialCapacity) {
        if (initialCapacity > 0) {
            this.elementData = new Object[initialCapacity];
        } else if (initialCapacity == 0) {
            this.elementData = EMPTY_ELEMENTDATA;
        } else {
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        }
    }

    // 空参构造函数
    public ArrayList() {
        // DEFAULTCAPACITY_EMPTY_ELEMENTDATA 为空数组实例
        // 上文中创建了数组 Object[] elementData,在初始化一个ArrayList时,
        // 将该数组引用指向上文中已定义的空数组实例 DEFAULTCAPACITY_EMPTY_ELEMENTDATA
        // 此处,我们就可以看出,ArrayList 是基于数组实现的
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }

    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;
        }
    }

 

ArrayList源码分析

标签:存储   one   alc   修改   code   克隆   元素对象   clone()   快速   

原文地址:https://www.cnblogs.com/peng19920430/p/10324852.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!