java中集合的源码经常在面试中被问到,这里我简单复制啦一段源码,范围是ArrayList类的构造方法重载结束
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
private static final long serialVersionUID = 8683452581122892189L;
//设置Arrays的默认容量大小是10,注意是final修饰的,只能赋值一次
private static final int DEFAULT_CAPACITY = 10;
private static final Object[] EMPTY_ELEMENTDATA = {};
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
//定义一个Object类型的数组,transient是一个修饰符,表示该数组不被序列化
transient Object[] elementData; // non-private to simplify nested class access
//定义啦一个大小
private int size;
//构造方法的重载,这个方法重载是为啦定义ArraysList的容量大小,创建ArraysList对象时候要传 入一个int作为集合大小
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
//传入的值大于0的时候就让,elementData数组的大小为initialCapacity
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
//如果你传入一个零就让数组等于默认EMPTY_ELEMENTDATA
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
//***在这里可以总结出来如果你要设置集合的大小,传入的int值必须为大于等于0的值
//,如果为负数就会抛出IllegalArgumentException异常
}
//你也可以不设置集合大小使用默认的容量10
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
//传入一个集合
public ArrayList(Collection<? extends E> c) {
//把这个集合转为数组
elementData = c.toArray();
//这个数组长度赋值给size后 不为0
if ((size = elementData.length) != 0) {
//判断这个数组的类型是否属于Object[]类
if (elementData.getClass() != Object[].class)
//克隆这个数组赋值给elementData
elementData = Arrays.copyOf(elementData, size, Object[].class);
} else {
// 数组长度为零,让当前elementData值为EMPTY_ELEMENTDATA
this.elementData = EMPTY_ELEMENTDATA;
}
}
ArraysList源码分析
最新推荐文章于 2025-11-24 14:38:27 发布
本文详细介绍了Java中ArrayList类的源码,包括默认容量、构造方法重载以及通过集合初始化ArrayList的方式。重点关注了如何设置集合容量以及对传入非法容量值的处理。此外,还解释了elementData数组的transient特性及其作用。

322

被折叠的 条评论
为什么被折叠?



