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
的构造器:
protected AbstractCollection() {
}
4、来到Object:
public class Object {
这里走的是默认Object的无参构造器。
返回:
回到AbstractCollection
-回到-- > AbstractList
,将modCount给初始化为0了后,回到构造器完成构造器方法的执行
5、回到ArrayList(int initialCapacity)
这个有参构造。
执行完this.elementData = new Object[initialCapacity]
这一行就结束。
心得:有参构造和无参构造很多地方都是一样的