collection大致结构体系 

 

先来介绍一下collection的功能:

Collection的功能:
    1,添加功能:
        boolean add(Object obj):添加一个元素
        boolean addAll(Collection c):添加一个元素的集合
    2,删除功能:
        void cler():移除所有的元素
        boolean remove(Object):移除一个元素
        boolean removeAll(Collection c):移除一个集合的元素,只要一个元素被移除,就返回True
    3,判断功能:
        boolean contains(Object c):判断集合是否包含元素
        boolean containsAll(Collection c):判断集合中是否包含指定的集合元素,只有包含所有的元素,才叫包含
        boolean isEmpty():判断集合是否为空
    4,获取功能:
        Iterator<E> iterator():迭代器
    5,长度功能:
        int size():元素的的个数
    6,交集功能:
        boolean retainAll(Collection c):移除此collection中未包含在指定collection中的所有元素。
        集合A和集合B做交集,最终结果保存在集合A中,返回值表示A是否发生变化

 

collection继承了Iterator(迭代器),是的collection可以遍历,Iterator是一个接口,包含以下三个方法:

  • hasNext()
  • next()
  • remove()

Iterator并没有具体的实现方法,因为collection中有多种类型,每一种类型的遍历方式都不同,所以每个集合的遍历都在自己的类中实现。

List集合的特点是:有序存储,即存储顺序和取出顺序相同,可以重复

常用的List有:ArrayList、Vector、LinkedList

  • ArrayList:底层数据结构是数组,线程不安全,查询较快、增删慢
  • LinkedList:底层是链表,线程不安全,增删较快,查询慢
  • Vactodiyir:底层是数组,线程安全,查询较快、增删慢

ArrayList:

  • 当不指定容量时,初始容量为10,并且在第一次插入ArrayList时,数组会扩容
  • add方法有两个,一个直接在尾部添加,一个在指定位置添加。add(e),在尾部添加,每次添加需要判断容量是否够
  • 如果需要扩容,会扩容1.5倍。然后调用copyOf()方法转移到新数组
  • add(index, e),首先检查数组是否越界,然后扩容,调用arraycopy()方法插入,arraycopy是用C/C++写的,效率较高
  • get() 检查下标,返回元素
  • set(index, e) 检查角标,替换新值,返回旧值。
  • remove(index) 检查角标,删除元素,计算需要移动的个数,并移动。设置为null,等待GC的回收

总结:

  • ArrayList是动态扩容的数组,在增删的时候需要拷贝复制
  • 初始容量为10,扩容时扩容1.5倍
  • 不是线程安全的,可以存储null值

 

Vector与ArrayList的比较:

  • Vector 是一个比较旧的集合类,底层实现也是数组,相对于ArrayList是线程安全的
  • Vector扩容时是原来的1倍,ArrayList是0.5倍,每次扩容它的内存消耗都要大于ArrayList
  • Vector所有的方法是同步的,性能会损失

 

LinkedList:

  • 底层实现是双向链表,LinkedList实现了Deque接口,因此可以操作LInkedList像操作队列和栈一样
  • add(e) 在链表最后添加元素
  • remove() 删除元素时实际上使用equals看看 元素是否在里面,然后删除元素,双链表的删除
  • get(index) 会首先判断下标位置,如果小于长度的一般,则从头开始遍历,否则就会从尾部遍历
  • set(index, e) 与get方法类似,先判断下标,是从头遍历还是从尾遍历

总结:

  • 一般情况,查询多用ArrayList,增删多用LinkedList, 个别极端情况下比如(ArrayList末尾增加、删除元素是要快于linkedList)