单列集合的框架学习

单列集合的框


—-Collection 所有单列集合的跟接口
———-list Collection的子接口,实现了List接口的类的特点: 有序可重复
—————-ArrayList 底层使用了Object数组来实现 特点:查询快,增删慢
—————-LinkedList 底层使用了链表的数据结构来实现。特点:查询慢,增删快
—————-Vector 底层使用了Object数组来实现。 但是是线程安全的,操作效率低。
———Set Collection的子接口,实现了Set接口的类的特点:无序不可重复。
—————-HashSet 底层使用了哈希表来实现的。特点:存取快。
—————-TreeSet 底层使用了红黑树来实现的。特点:可以对集合中的元素进行排序。

  1. 浅谈ArrayList:线程不安全
    实现原理: ArrayList是一个可变数组大小的列表,允许null在内的所有元素,构造一个初始容量为10的空列表(Jdk1.6以后创建一个ArrayList对象时,不会立即初始化一个容量为10的空列表,当第一次添加的时候才会初始化),也可以提定初始容量initialCapacity,ArrayList最大的特点内部是数组结构,一看到数组,我们会立刻想到角标索引,所以在操作元素时,可以根据索引准确判断元素的位置,查询快。其实ArrayList是包装了一个数组对象,可以调用get() set() 操作元素,查询快,增删慢是因为在添加元素时,会设计数组的拷贝(在源码中看)
    扩容增量: 原容量的0.5倍
    如 ArrayList的容量为10,一次扩容后是容量为15
public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }
 private void ensureCapacityInternal(int minCapacity) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
        }

        ensureExplicitCapacity(minCapacity);
    }
 private void ensureExplicitCapacity(int minCapacity) {
        modCount++;

        // overflow-conscious code
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }

   private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        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);
    }
  1. 浅谈Vector:线程安全
    实现原理:同ArrayList
    底层数据结构是数组结构
        加载因子为1:即当 元素个数 超过 容量长度 时,进行扩容
        扩容增量:原容量的 1倍
          如 Vector的容量为10,一次扩容后是容量为20
  2. 浅谈LinkedList:线程不安全
    调用无参数的构造方法默认创建了一个空列表,LinkedList是链表式结构,增删快,查询慢。
  3. 浅谈HashSet:
    因为set集合是无序的,所以添加元素的时候就讲究原则了。
    HashSet添加元素的原理:往HashSet添加元素的时候,首先HashSet会调用元素的hashCOde方法得到元素的哈希码值,然后会经过一系列运算就可以算出该元素在哈希表中的存储位置/

    情况1:如果算出该元素的位置目前没有任何元素存储,那么该元素可以直接存储 

    情况2: 如果算出该元素的位置目前已经存有其他的元素,那么还会调用元素的equals方法与该位置的元素再比较一次。
    如果equals方法返回的是false,那么该元素允许存储,如果euqlas方法返回的是true,那么该元素视为重复元素。
    该类实现原理:底层实现是一个HashMap(保存数据),实现Set接口。
         默认初始容量为16(为何是16,见下方对HashMap的描述)。
         加载因子为0.75:即当 元素个数 超过 容量长度的0.75倍 时,进行扩容。
         扩容增量:原容量的 1 倍。
          如 HashSet的容量为16,一次扩容后是容量为32

  4. 浅谈TreeSet
    因为无序所以添加元素就有原则。
    添加元素的原理:`1. 往TreeSet添加元素的时候,如果元素本身具备自然顺序的特性,那么会根据元素自然顺序的特性进行排序存储。

    1. 往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,那么元素所属的类必须要实现Comparable接口,把元素的比较规则定义
      在CompareTo方法上。
    2. 往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,而且元素所属的类没有实现COmparable接口,那么必须要在创建
      TreeSet对象的时候传入比较器。
    3. 如果比较的方法(CompareTo 或者Compare )返回的是0的时候,那么该元素就被视为重复元素,不允许添加。

`
初始容量:调用无参数的构造方法,默认初始容量为0.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值