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-05-23 09:27:58 发布