其他构造的源码分析

利用其他 Collection 构建 ArrayList:

public ArrayList(Collection<? extends E> c) {
    elementData = c.toArray();
    if ((size = elementData.length) != 0) {
        // c.toArray might (incorrectly) not return Object[] (see 6260652)
        if (elementData.getClass() != Object[].class)
            elementData = Arrays.copyOf(elementData, size, Object[].class);
    } else {
        // replace with empty array.
        this.elementData = EMPTY_ELEMENTDATA;
    }
}

Collection<? extends E> c的含义:

  • 实现了Collection接口
  • <? extends E>: 你传入的数据,泛型E自己后者E的子类

指定顺序表初始容量:

public ArrayList(int initialCapacity) {
    if (initialCapacity > 0) {
        this.elementData = new Object[initialCapacity];
    } else if (initialCapacity == 0) {
        this.elementData = EMPTY_ELEMENTDATA;
    } else {
        throw new IllegalArgumentException(“Illegal Capacity: “+
                                           initialCapacity);
    }
}

指定容量等于0 根据之前分析的源码可知add时 if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)这个判断不会进入,第一次增加后增容的大小是1,然后一直是1.5倍的大小新增。

    指定容量大于0 创建一个指定容量的数组
    指定容量等于0 指向EMPTY_ELEMENTDATA(是一个大小为0的数组)
    指定容量等于0 add时第一次增加后增容的大小是1,然后一直是1.5倍的大小新增。
    指定容量小于0 抛出异常

创建ArrayList
public static void main(String[] args) {
    // ArrayList创建,推荐写法
    // 构造一个空的列表
    List<Integer> list1 = new ArrayList<>();
    // 构造一个具有10个容量的列表
    List<Integer> list2 = new ArrayList<>(10);
    list2.add(1);
    list2.add(2);
    list2.add(3);
    // list2.add(“hello”); // 编译失败,List<Integer>已经限定了,list2中只能存储整形元素
    // list3构造好之后,与list中的元素一致
    List<Integer> list3 = new ArrayList<>(list2);
    // 避免省略类型,否则:任意类型的元素都可以存放,使用时将是一场灾难
    List list4 = new ArrayList();
    list4.add(“111”);
    list4.add(100);
}

通过idea查看四个list中的数据

 

0

评论0

请先
显示验证码
没有账号?注册  忘记密码?