——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%,然后把旧的数据放在新的数组上。