
Java集合主要分为两个体系结构,Collection和Map。这篇博客主要介绍Collection子接口List下的三个经常使用的实现类:ArrayList、Vector和LinkedList。
详细内容参见《Java基础——集合》
先看下关系图:
这是List最常用的实现类,想一想为什么他最常用?
Array,在java中意为“数组”。猜想ArrayList和数组应该关系很密切,其实ArrayList可以看作是一个可以改变大小的数组。
举个简单的例子吧,看下他的使用:
ArrayList<String> list1 = new ArrayList<>();
list1.add("a");
list1.add("b");
list1.add("c");
list1.set(2, "d");
Iterator<String> iter = list1.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
之后,我们就从源码看看他是如何设计的吧。
1)构造函数
提示:
默认ArrayList长度为10;
用于保存数据的elementData本身就是个Object[];
ArrayList提供了三种构造函数,具体逻辑可以看下面的代码。
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
//默认容量为10
private static final int DEFAULT_CAPACITY = 10;
private static final Object[] EMPTY_ELEMENTDATA = {};
//调用无参数构造函数时,给一个空数据
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
//保存元素的数据
transient Object[] elementData;
//1、无参数构造函数,默认空数组
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
//2、给定初始容量的构造函数
public ArrayList(int initialCapacity) {
//大于0时,创建一个Object数据,长度为传入的容量值
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
//等于0时,给一个空数组
this.elementData = EMPTY_ELEMENTDATA;
} else {
//其他抛出容量不合法异常
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
//3、给定集合对象的构造函数
public ArrayList(Collection<? extends E> c) {
//放入数组
elementData = c.toArray();
//数组长度不等于0时,将进行复制
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 {
否则,返回空数组
this.elementData = EMPTY_ELEMENTDATA;
}
}
}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-81650-1.html
即通过革命搞垮那些不合作的中东国家