# 其他构造的源码分析

> 来源：梦飞idc云平台 | 原文：https://www.mfisp.com/22436.html | 发布：2023-07-26 | 更新：2023-07-26 | 分类：建站教程

利用其他 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中的数据

---
本页由 梦飞idc云平台（https://www.mfisp.com）提供。站点导航见 https://www.mfisp.com/llms.txt
