java的集合框架主要由Set、List、Map、(Queue)接口构成,其中List、Set继承了Collection接口,Map并没有继承Collection接口,而是自成了一套key-value的集合。需要注意的是Collection、Collections是有区别的,Collection是java集合框架里一个重要的抽象接口,该接口下实现了一系列集合类,而Colllections(java.util)则是一个服务于集合框架的一个实现类,或者说是工具类,提供了很多的方法供我们使用,而且不能被实例化,所有方法都已static的方式呈现。
Collection接口
Collection是最基本的集合接口,由它派生了Set、List接口,如果想要实现Collection接口,必须实现两个构造函数,一个是无参构造函数,一个是包含Collection的构造函数。
List接口
List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。
List的实现有两种数组类型、链表类型,对应的实现类分别是(ArrayList、Vector、Stack)、LinkedList。
LinkedList
LinkedList 底层实现是链表类型,所以插入、删除的效率会比数组类型的List要快,但是查询的效率就不及数组类型了。
通过LinkedList我们可以实现单双向队列以及堆栈的数据集合。
而LinkedList本身并没有实现线程同步,所以涉及多线程并发的时候,需要自己控制资源同步的问题,也可以通过
Listlist=Collections.synchronizedList(newLinkedList(...));建立List的同步机制。
ArrayList 底层实现是数组类型,在查询效率上会比链表型要高。
ArrayList没有实现线程同步,所以它也是线程不安全的。ArrayList初始化的时候可以指定或者分配默认长度,如果插入数据超出原有长度是,会按原长度的50%增长数组长度。也可以通过手动控制调整数组长度,增加数组的执行效率,制定数组长度可以通过ensureCapacity实现。
Vector
Vector非常类似ArrayList,但是Vector是同步的。由Vector创建的Iterator,虽然和ArrayList创建的 Iterator是同一接口,但是,因为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕获该异常。
Stack
Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。
Set接口
HashSet : 它不允许出现重复元素;不保证和政集合中元素的顺序,可以自己做个例子可以看出加入的字段顺序跟遍历出的不一样,允许包含值为null的元素,但最多只能有一个null元素(不允许重复嘛!)。
TreeSet : 可以实现排序等功能的集合,它在讲对象元素添加到集合中时会自动按照某种比较规则将其插入到有序的对象序列中,并保证该集合元素组成按照“升序”排列。
a)(在对大量信息进行检索的时候,TreeSet比AraayList更有效率,能保证在log(n)的时间内完成)。
b)TreeSet是实用树形结构来存储信息的,每个节点都会保存一下指针对象,分别指向父节点,左分支,右分支,相比较而言,ArrayList就是一个含有元素的简单数组了,正因为如此,它占的内存也要比ArrayList多一些。
c)想TreeSet插入元素也比ArrayList要快一些,因为当元素插入到ArrayList的任意位置时,平均每次要移动一半的列表,需要O(n)的时间, 而TreeSet深度遍历查询花费的实施只需要O(log(n))(普遍的都是,set查询慢,插入快,list查询快,插入满, .)
LinkedHashSet : 具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。