ArrayList有参构造源码解读
ArrayList有参构造源码解读
debug用例:
@Test
public void testArrayListConstructor(){ArrayList<Integer> arrayList = new ArrayList<>(3);
}
过程一
1、首先还是看这个类ClassLoader:
// Invoked by the VM after loading class with this loader.
private void checkPackageAccess(Class<?> cls, ProtectionDomain pd) {final SecurityManager sm = System.getSecurityManager();if (sm != null) {if (ReflectUtil.isNonPublicProxyClass(cls)) {for (Class<?> intf: cls.getInterfaces()) {checkPackageAccess(intf, pd);}return;}final String name = cls.getName();final int i = name.lastIndexOf('.');if (i != -1) {AccessController.doPrivileged(new PrivilegedAction<Void>() {public Void run() {sm.checkPackageAccess(name.substring(0, i));return null;}}, new AccessControlContext(new ProtectionDomain[] {pd}));}}
}
还是来到这个
先来看看:Invoked by the VM after loading class with this loader.这个是什么意思吧:
直接翻译下:在这个加载器加载类后被jvm调用
这个和无参构造也是一样的,sm也是null(研究过无参构造的源码【ArrayList无参构初始化】可以预测(/剧透)一下,应该是一样的,因为这里和无参构造的过程一样)
2、和无参构造也是来到System的:
public static SecurityManager getSecurityManager() {return security;
}
然后回到ClassLoader类的checkPackageAccess的判断语句,sm的值是null,那么就直接返回。
过程二
这个应该是正片了
1、先来到ArrayList的有参构造器:
public ArrayList(int initialCapacity) {if (initialCapacity > 0) {this.elementData = new Object[initialCapacity];} else if (initialCapacity == 0) {this.elementData = EMPTY_ELEMENTDATA;//empty_elementData} else {throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);}
}
EMPTY_ELEMENTDATA是什么?可以推理一下,因为size=0,那么就是空数组
/*** Shared empty array instance used for empty instances.*/
private static final Object[] EMPTY_ELEMENTDATA = {};
既然initialCapacity就是传进来的容器大小,那么就直接对elementData初始化了。
这里已经是走到了这个ArrayList(int initialCapacity)
有参构造的门口了,但是还没走进去。接下来的2-4步和【ArrayList无参构初始化】过程是一样的。
2、来到AbstractList
的构造器:
protected AbstractList() {
}
3、来到public abstract class AbstractCollection<E> implements Collection<E> {
的构造器:
protected AbstractCollection() {
}
4、来到Object:
public class Object {
这里走的是默认Object的无参构造器。
返回:
回到AbstractCollection
-回到-- > AbstractList
,将modCount给初始化为0了后,回到构造器完成构造器方法的执行
5、回到ArrayList(int initialCapacity)
这个有参构造。
执行完this.elementData = new Object[initialCapacity]
这一行就结束。
心得:有参构造和无参构造很多地方都是一样的