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 implements Collection {的构造器:

protected AbstractCollection() {
}

4、来到Object:

public class Object {

这里走的是默认Object的无参构造器。

返回:

回到AbstractCollection -回到-- > AbstractList,将modCount给初始化为0了后,回到构造器完成构造器方法的执行

5、回到ArrayList(int initialCapacity)这个有参构造。

执行完this.elementData = new Object[initialCapacity]这一行就结束。

心得:有参构造和无参构造很多地方都是一样的

你可能感兴趣的:(java,List,源码)