1.首先我们先讲下Collection接口
Collection接口:
Collection是最基本的集合接口,它是由一个独立元素所组成的序列,这些元素服务一条或多条规则。一个Collection代表一组Object,即Collection的元素(Elements)。
有些Collection允许有相同的元素,另一些则不允许,有些可以进行排序,另一些则也不允许,Java SDK不提供直接继承Collection的接口,而是继承Collection的一些子接口,“如List,Set”接口。
Collection的一些方法:
2.然后再说下List接口,Set接口和Map接口,当然顺便提一下Queue队列
List接口:
List是有序的Collection,按照插入的顺序保存元素,使接口能够精确的控制每个元素插入的位置,用户能够根据索引来访问List中的元素。
实现List接口的常用类有:LinkedList,ArrayList,Vector和Stack。
Set接口:
核心点,Set是不包含重复元素的Collection(例:e1和e2都有e1.equals(e2)=false),允许有Null元素,但最多只能有一个Null元素。
Set容器类主要有HashSet和TreeSet等。
Map接口:
Map和List,Set接口有所不同,没有继承Collection。它是一组成对的“键值对”对象,允许通过键来查找值。
Map提供key到value的映射,一个Map中不能包含有相同的key,一个key只能映射一个value(一对一的关系)。
实现Map接口的常用类有:HashTable,HashMap,WeekHashMap。
主要方法: 1.boolean equals(Object o)比较对象 2.boolean remove(Object o)删除一个对象 3.put(Object key,Object value)添加key和value 4.Hashtable类
Queue接口:
Queue(又称"队列")它是一种特殊的线性表,按照排队规则来确定对象产生的顺序。
简单来说就是按照"先进先出"规则,表的前端部分用作删除操作,后端部分用作插入操作,前端删除部分称做:“对头”;后端插入部分称做:“队尾”。如果队列为空的话,又被称做:“空队列”。
值得一提的是LinkedList也实现了Queue接口,所以也可以把LinkedList当做Queue来用。
3.一起探索下实现List接口的常用类:LinkedList,ArrayList,Vector和Stack
LinkedList类:
LinkedList实现了List接口,允许Null元素,并且是线程不安全的(非线程安全),且无法随机访问,原因就是它的底层是通过链表实现的,若要从链表中删除或插入某一个对象,只需要改变前后对象的引用,所以在速度方面的话相对ArrayList要快一些。
此外LinkedList还提供了一些额外的方法:get(),remove(),insert()用作LinkedList的首部和尾部,这些方法主要可以用作堆栈(stack),队列(queue),双向队列(deque)。
注意:LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List:List list = Collections.synchronizedList(new LinkedList(…));
ArrayList类:
ArrayList实现的是可变大小的数组,它允许所有元素,包括Null元素,并且也是线程不安全的(非线程安全),但是允许随机访问,原因就是它是数列结构(数组),此结构本身就适合随机访问。
[]数组,Vector,ArrayList的结构在随机访问,遍历和获得大小方面都是O(1)的性能。
注意:和LinkedList一样,ArrayList也是非同步的(unsynchronized)。一般情况下使用这两个就可以了。因为非同步,所以效率比较高,如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。
Vector类:
和ArrayList非常的类似,不同处就是,它是线程安全的,由Vector创建的Iterator(迭代器),本身和ArrayList创建的Iterator(迭代器)是同一个接口,但因为Vector是线程安全的,所以当一个Iterator(迭代器)被创建而且在被使用时,另一个线程会改变Vector的状态(例如:“添加”或“删除”一些元素),这时候调用Iterator(迭代器)的方法时会抛出异常:" ConcurrentModificationException",因此这个异常必须被捕获。
Stack类:
继承了Vector,实现“后进先出”的堆栈,Stack提供了5个方法让Vector当做堆栈被使用,基本的push()和pop()方法,还有peek方法取得栈顶的元素,empty方法判断堆栈是否为空,search方法检测一个元素在堆栈中的位置。
注:Stack刚创建后是“空栈”