1. public ArrayList() {
    2. // 无参构造函数,设置元素数组为空
    3. this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    4. }
    1. public ArrayList(int initialCapacity) {
    2. if (initialCapacity > 0) { // 初始容量大于0
    3. this.elementData = new Object[initialCapacity]; // 初始化元素数组
    4. } else if (initialCapacity == 0) { // 初始容量为0
    5. this.elementData = EMPTY_ELEMENTDATA; // 为空对象数组
    6. } else { // 初始容量小于0,抛出异常
    7. throw new IllegalArgumentException("Illegal Capacity: "+
    8. initialCapacity);
    9. }
    10. }
    1. public ArrayList(Collection<? extends E> c) {
    2. elementData = c.toArray();
    3. if ((size = elementData.length) != 0) {
    4. // c.toArray might (incorrectly) not return Object[] (see 6260652)
    5. if (elementData.getClass() != Object[].class) //实现 Collection接口的类可能会重写toArray();方法,根据 String[].getClass()
    6. Object[].class 是不一样的, 可以知道有可能返回的就不是Object 数组, 就可
    7. 以知道 (elementData.getClass() != Object[].class) 是有可能成立的。
    8. elementData = Arrays.copyOf(elementData, size, Object[].class);
    9. } else {
    10. // replace with empty array.
    11. this.elementData = EMPTY_ELEMENTDATA;
    12. }
    13. }
    14. 第一步,将参数中的集合转化为数组赋给elementData
    15. 第二步,参数集合是否是空。通过比较size与第一步中的数组长度的大小。
    16. 第三步,如果参数集合为空,则设置元素数组为空,即将EMPTY_ELEMENTDATA赋给elementData
    17. 第四步,如果参数集合不为空,接下来判断是否成功将参数集合转化为Object类型的数组,如果转化成Object类型的数组成功,则将数组进行复制,转化为Object类型的数组。