Java集合Collection中List,Set讲解

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底层使用的是链表结构
  1.  性能:查询慢,增删快
  2.  缺点:线程不安全

为什么 LinkedList查询慢,增删快

举例说明:把自己当成老师,教室里坐着很多的学生,而且是分散着坐,并且一个学生连着一个学生(链表结构),当我们新来一个学生时,学生随便找位置坐下就行;当我们需要找学生时,我们只能一个个的去找;当有学生要走时,直接离开就行,其他学生座位也不变。

  •  Vector底层是数组结构(几乎被淘汰)
  1.  性能:查询快,增删慢
  2.  缺点:线程安全,效率低
  3.  扩容:初始容量为10,当需要扩容时,扩大100%,然后把旧的数据放在新的数组上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值