博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ArrayList源码
阅读量:6623 次
发布时间:2019-06-25

本文共 4158 字,大约阅读时间需要 13 分钟。

1、实现了 RandomAccess 接口,因此支持随机访问。这是理所当然的,因为 ArrayList 是基于数组实现的。

public class ArrayList
extends AbstractList
implements List
, RandomAccess, Cloneable, java.io.Serializable

2、初始化:

ArrayList一共提供了三个初始化的方法:

public ArrayList()public ArrayList(Collection
c)public ArrayList(int initialCapacity);

无参构造:这里想将数组容量初始化为10,但不是这步实现的。

/**     * Shared empty array instance used for empty instances. 空数组     */    private static final Object[] 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 == EMPTY_ELEMENTDATA will be expanded to     * DEFAULT_CAPACITY when the first element is added.     *缓冲区,用来存储数据     */    private transient Object[] elementData;    /**     * Constructs an empty list with an initial capacity of ten. 无参构造 将elementData初始化为空数组。     */    public ArrayList() {        super();        this.elementData = EMPTY_ELEMENTDATA;      }

带参构造:给定容量

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

带参构造:给定元素

public ArrayList(Collection
c) { elementData = c.toArray(); size = elementData.length; // c.toArray might (incorrectly) not return Object[] (see 6260652) if (elementData.getClass() != Object[].class) elementData = Arrays.copyOf(elementData, size, Object[].class); }

3、扩容:

添加元素时使用 ensureCapacityInternal() 方法来保证容量足够,如果不够时,需要使用 grow() 方法进行扩容,新容量的大小为 oldCapacity + (oldCapacity >> 1),也就是旧容量的 1.5 倍。

扩容操作需要调用 Arrays.copyOf() 把原数组整个复制到新数组中,这个操作代价很高,因此最好在创建 ArrayList 对象时就指定大概的容量大小,减少扩容操作的次数。

public boolean add(E e) {        ensureCapacityInternal(size + 1);  // Increments modCount!!        elementData[size++] = e;        return true;    }
private void ensureCapacityInternal(int minCapacity) {        if (elementData == EMPTY_ELEMENTDATA) {            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);        }        ensureExplicitCapacity(minCapacity);    }
private void ensureExplicitCapacity(int minCapacity) {        modCount++; //修改参数+1        // overflow-conscious code        if (minCapacity - elementData.length > 0) //如果容量不够,就扩容            grow(minCapacity);    }
private void grow(int minCapacity) {        // overflow-conscious code        int oldCapacity = elementData.length;      // 扩容1.5倍         int newCapacity = oldCapacity + (oldCapacity >> 1);         if (newCapacity - minCapacity < 0)                 newCapacity = minCapacity;        if (newCapacity - MAX_ARRAY_SIZE > 0)            newCapacity = hugeCapacity(minCapacity);        // minCapacity is usually close to size, so this is a win: 复制数组        elementData = Arrays.copyOf(elementData, newCapacity);    }

4.删除元素:

需要调用 System.arraycopy() 将 index+1 后面的元素都复制到 index 位置上,该操作的时间复杂度为 O(N),可以看出 ArrayList 删除元素的代价是非常高的。

public E remove(int index) {        rangeCheck(index);        modCount++;        E oldValue = elementData(index);        int numMoved = size - index - 1;        if (numMoved > 0)            System.arraycopy(elementData, index+1, elementData, index,                             numMoved);        elementData[--size] = null; // clear to let GC do its work        return oldValue;    }

4. Fail-Fast

modCount 用来记录 ArrayList 结构发生变化的次数。结构发生变化是指添加或者删除至少一个元素的所有操作,或者是调整内部数组的大小,仅仅只是设置元素的值不算结构发生变化。

在进行序列化或者迭代等操作时,需要比较操作前后 modCount 是否改变,如果改变了需要抛出 ConcurrentModificationException。

private void writeObject(java.io.ObjectOutputStream s)        throws java.io.IOException{        // Write out element count, and any hidden stuff        int expectedModCount = modCount;        s.defaultWriteObject();        // Write out size as capacity for behavioural compatibility with clone()        s.writeInt(size);        // Write out all elements in the proper order.        for (int i=0; i

5、序列化

 

转载于:https://www.cnblogs.com/shaer/p/10579202.html

你可能感兴趣的文章
超感猎杀/超感八人组第一季至二季/全集Sense8迅雷下载
查看>>
嘻哈帝国第一季/全集Empire迅雷下载
查看>>
都别说工资低了,我们来一起写简单的dom选择器吧!
查看>>
C#设计模式总结
查看>>
Python知识总结帖
查看>>
[LeetCode] Serialize and Deserialize Binary Tree
查看>>
50.8. 函数
查看>>
21.3. Maintenance 数据库维护
查看>>
Android 内部存储安装apk文件实现
查看>>
C/C++中peek函数的原理及应用
查看>>
23.4. WLAN - 无线局域网配置
查看>>
[LintCode] Backpack VI 背包之六
查看>>
JIRA python篇之展示多人未完成任务列表
查看>>
图m着色问题
查看>>
微信网页开发之概要说明(一)
查看>>
Python2 连接MySQL
查看>>
研究内容与成果
查看>>
[Everyday Mathematics]20150126
查看>>
2016-2017-2点集拓扑-课表+上课视频+作业讲解
查看>>
5.27. Spring boot with Elasticsearch 2.x
查看>>