栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

超详细的逐句讲解Java高级接口之ArrayList底层源码讲解(一)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

超详细的逐句讲解Java高级接口之ArrayList底层源码讲解(一)

一、ArrayList

众所周知数组是一个有效的数据存储集合,但是对于数组的构建需要实现对数组元素的个数进行相应的估计,因此需要一个能够动态创建储存数据的动态数组,ArrayList就是一个可以动态创建数组的一个方法容器。

二、ArrayList的逐句讲解
public class ArrayList extends AbstractList 
	implements List, RandomAccess, Cloneable, java.io.Serializable{
}

首先我们通过第一申明语句得到Array List是继承于AbstractList这个抽象列表的。它连接了 RandomAccess、Cloneable和 java.io.Serializable的接口类型。

private static final long serialVersionUID = 8683452581122892189L;

这是定义串行版本的UID的语句,这是接口的唯一标志符。

private static final int DEFAULT_CAPACITY = 10;

这是定义Java默认的ArrayList的长度。当用户创建ArrayList时,未声明ArrayList长度,则系统的默认长度为10。

 private static final Object[] EMPTY_ELEMENTDATA = {};

用于空实例的共享空数组实例,简单来说就是实例化空的ArrayList数组。

private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

用于默认大小的空实例的共享空数组实例。我们将其与 EMPTY_ELEMENTDATA 区分开来,以了解添加第一个元素时要膨胀多少。

 transient Object[] elementData;

ArrayList 的元素存储在其中的数组缓冲区。 ArrayList 的容量就是这个数组缓冲区的长度。添加第一个元素时,任何带有 elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA 的空 ArrayList 都将扩展为 DEFAULT_CAPACITY。

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

构造一个具有指定初始容量的空列表,这个初始化容量为10.

 public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }

构造一个初始容量为 10 的空列表。其中DEFAULTCAPACITY_EMPTY_ELEMENTDATA的默认值为10。

public ArrayList(Collection c) {
        elementData = c.toArray();
        if ((size = elementData.length) != 0) {
            if (elementData.getClass() != Object[].class)elementData = Arrays.copyOf(elementData, size, Object[].class);
        } else {
            this.elementData = EMPTY_ELEMENTDATA;
        }
    }

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

public void trimToSize() {
        modCount++;
        if (size < elementData.length) {
            elementData = (size == 0)
              ? EMPTY_ELEMENTDATA
              : Arrays.copyOf(elementData, size);
        }
    }

将此ArrayList 实例的容量修剪为列表的当前大小。应用程序可以使用此操作来最小化ArrayList实例的存储空间。

public void ensureCapacity(int minCapacity) {
        int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)? 0: DEFAULT_CAPACITY;
        if (minCapacity > minExpand) {
            ensureExplicitCapacity(minCapacity);
        }
    }

增加此ArrayList实例的容量,以确保它至少可以容纳由最小容量参数指定的元素数量。

private static int calculateCapacity(Object[] elementData, int minCapacity) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            return Math.max(DEFAULT_CAPACITY, minCapacity);
        }
        return minCapacity;
        }

计算ArrayLIst占用空间的容量。

private void ensureCapacityInternal(int minCapacity) {
        ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
    }

确保ArrayList拥有足够的剩余空间

 private void ensureExplicitCapacity(int minCapacity) {
        modCount++;
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }

确保ArrayLis拥有足够的显式容量

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

要分配的数组的最大大小。一些在虚拟机中ArrayList保留一些关键字。尝试分配更大的数组可能会导致 OutOfMemoryError:请求的数组大小超出Java虚拟机限制

private void grow(int minCapacity) {
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

增加容量以确保它至少可以容纳由最小容量参数指定的元素数量。

private static int hugeCapacity(int minCapacity) {
        if (minCapacity < 0) // overflow
            throw new OutOfMemoryError();
        return (minCapacity > MAX_ARRAY_SIZE) ?
            Integer.MAX_VALUE :
            MAX_ARRAY_SIZE;
    }

判断ArrayList是否超过最大限制,超过了就抛出OutOfMemoryError异常,否则就创建数组。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/458424.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号