您的位置:首页 > 编程语言 > Java开发

ArrayList源码分析 JDK8

2018-03-18 20:34 543 查看

ArrayList基本概念

ArrayList是一个数组实现的列表,容量自动增长,线程不安全。



RandomAccess接口,用于标记当前类是可以随机访问的,当一个类标记了RandomAccess接口,那么表明该类使用for循环遍历效率更高,如果没用RandomAccess标记,则使用迭代器遍历效率更高。
Cloneable接口,即覆盖了函数clone(),能被克隆。

Serializable接口,支持序列化,能通过序列化去传输。

ArrayList属性

public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{   //序列化id
private static final long serialVersionUID = 8683452581122892189L;

//初始化默认容量
private static final int DEFAULT_CAPACITY = 10;

//空对象
private static final Object[] EMPTY_ELEMENTDATA = {};

//默认构造函数初始化空对象
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

//数据对象存放地方
transient Object[] elementData; // non-private to simplify nested class access

//列表长度
private int size;
//列表最大长度 2147483639
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
}

ArrayList构造函数

无参构造函数 /**
* 初始化elementData为空数组,elementData长度为0,size为0,第一次add时候,扩展elementData为默认长度10
*/
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}int构造函数public ArrayList(int initialCapacity) {
//大于0初始化数组为int参数
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) { //参数为0,初始化空数组
this.elementData = EMPTY_ELEMENTDATA;
} else { //小于0 异常
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}Collection对象的构造函数 public ArrayList(Collection<? extends E> c) {
//collection对象转换成数组,将数组的地址的赋给elementData
//这里执行的简单赋值时浅拷贝
elementData = c.toArray();
//elementData长度赋值给size,并且size如果不等于0
if ((size = elementData.length) != 0) {
//执行Arrays.copy方法,把collection对象的内容copy到elementData中。
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
} else {
// size为0,将空数组赋值给elementData
this.elementData = EMPTY_ELEMENTDATA;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: