Collection概述
- Set和List继承Collection
- Set有HashSet,TreeSet,LinkedHashSet
- List有ArrayList,LinkedList,Vector
图解
Connection接口
——List有序,可重复(因为该集合体系有索引)
- ArrayList底层使用的是数组结构
性能:查询快,增删慢
缺点:线程不安全
private static int calculateCapacity(Object[] elementData, int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
return Math.max(DEFAULT_CAPACITY, minCapacity);//DEFAULT_CAPACITY默认就是10
}
return minCapacity;
}
初始化
根据以上源码分析,new ArrayList()的时候其实是0,第一次调用add()方法的时候才赋值10
/**
* Increases the capacity to ensure that it can hold at least the
* 增加容量,以确保至少可以容纳
* number of elements specified by the minimum capacity argument.
*
* @param minCapacity the desired minimum capacity
*/
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);//这里就是扩容1.5倍
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
扩容
根据以上源码分析,当需要扩容时,扩大50%(1.5倍),然后把旧的数据放在新的数组上(数据拷贝),所以当我们已经知道有很多元素需要填充时,这个时候直接初始化一个预先设定好的长度。
为什么 ArrayList查询快,增删慢
举例说明:把自己当成老师,教室里坐着很多的学生,每个人有自己的座位号码(角标),当我们需要找某一个学生时,我们只需要通过编号,就能直接知道学生的位置;当我们教室有新的学生进入的话,首先要判断教室是否还有座位,如果不够我们还要加座位,如果够则后面的同学都要往后移动;如果是哪个学生离开,则后面的学生又要往前移。
- LinkedList底层使用的是链表结构
- 性能:查询慢,增删快
- 缺点:线程不安全
为什么 LinkedList查询慢,增删快
举例说明:把自己当成老师,教室里坐着很多的学生,而且是分散着坐,并且一个学生连着一个学生(链表结构),当我们新来一个学生时,学生随便找位置坐下就行;当我们需要找学生时,我们只能一个个的去找;当有学生要走时,直接离开就行,其他学生座位也不变。
- Vector底层是数组结构(几乎被淘汰)
- 性能:查询快,增删慢
- 缺点:线程安全,效率低
- 扩容:初始容量为10,当需要扩容时,扩大100%,然后把旧的数据放在新的数组上。