1. Collection
最基本的集合接口
一個(gè)Collection代表一組Object的集合
public interface Collection<E> extends Iterable<E>
java.util.Collection的子接口包括:
java.util.Set
java.util.SortedSet
java.util.NavigableSet
java.util.Queue
java.util.concurrent.BlockingQueue
java.util.concurrent.TransferQueue
java.util.Deque
java.util.concurrent.BlockingDeque
任何實(shí)現(xiàn)Collection接口的類柱嫌,都必須實(shí)現(xiàn)iterator方法來(lái)提供遍歷集合中的元素
Iterator<T> iterator();
例如List中集合的遍歷可以采用如下方式
List<String> stringList = Arrays.asList(array);
Iterator<String> iterator = stringList.iterator();
while(iterator.hasNext()){
System.out.printf(iterator.next());
}
值得注意的是,Collection和Collectors的區(qū)別调卑,Collection是集合的接口,所有的集合類都實(shí)現(xiàn)該接口巾陕;Collectors是一個(gè)類童社,提供了sort方法對(duì)集合進(jìn)行排序溯警。
1.1.List
List代表元素有序,可重復(fù)的集合年柠,集合中每個(gè)元素都有對(duì)應(yīng)的順序索引凿歼,允許加入重復(fù)元素,通過(guò)索引指定元素的位置冗恨,實(shí)現(xiàn)有ArrayList,Vector,Queue答憔。
1.1.1 ArrayList
ArrayList是基于數(shù)組的實(shí)現(xiàn),封裝了一個(gè)動(dòng)態(tài)增長(zhǎng)掀抹,允許再分配的Object[]數(shù)組虐拓。
1.1.2 Vector
public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
使用方法和ArrayList基本相同,子類有Stack傲武。和ArrayList區(qū)別是Vector是線程安全的蓉驹,對(duì)集合元素操作的時(shí)候都加了Synchronized,保證線程的安全揪利;在擴(kuò)容時(shí)态兴,Vector默認(rèn)增長(zhǎng)一倍的容量,而List只增長(zhǎng)50%;
1.1.2.1 Stack
stack(棧)實(shí)現(xiàn)了Vector類疟位,后進(jìn)先出瞻润。
1.1.3 LinkedList
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
實(shí)現(xiàn)List接口,Deque接口甜刻;基于鏈?zhǔn)降拇鎯?chǔ)方式
1.2 Queue
queue用于模擬隊(duì)列這種數(shù)據(jù)結(jié)構(gòu)绍撞,先進(jìn)先出。
1.2.1PriorityQueue
最大堆得院,最小堆傻铣,基于數(shù)據(jù)的完全二叉樹(shù)實(shí)現(xiàn)
1.2.2 Deque
1.2.2.1 LinkedList
實(shí)現(xiàn)了List和Deque(雙端隊(duì)列Deque繼承了Queue接口)兩個(gè)接口。它可以作為L(zhǎng)ist和Queue使用祥绞,也可以作為棧進(jìn)行使用矾柜。
1.3 Set
Set繼承Collection接口阱驾,不能包含重復(fù)元素就谜,Set判斷兩個(gè)對(duì)象不是使用==來(lái)判斷怪蔑,是使用equals方法,新加入的元素會(huì)與已有的元素判斷equals比較返回false則加入丧荐,否則拒絕加入缆瓣;所以使用Set的時(shí)候有兩點(diǎn)需要注意:1.放入的對(duì)象要實(shí)現(xiàn)equals方法;2.對(duì)set的構(gòu)造函數(shù)中虹统,傳入的Collection參數(shù)不能包含重復(fù)的元素弓坞。
1.3.1 HashSet
HashSet實(shí)現(xiàn)了Set接口,由哈希表提供支持车荔,不保證Set的迭代順序渡冻;允許使用null值,同時(shí)不允許元素有重復(fù)忧便,因?yàn)镠ashSet底層是使用HashMap來(lái)實(shí)現(xiàn)的族吻,HashSet中的元素都存放在HashMap的key上面,value是一個(gè)統(tǒng)一的靜態(tài)變量珠增;
HashSet中添加元素調(diào)用add方法超歌,然后會(huì)調(diào)用HashMap的put方法插入元素,HashMap的put方法插入元素時(shí)蒂教,會(huì)首先判斷是否存在key巍举,如果不存在,則插入這個(gè)key-value,存在則修改value值凝垛;在set中懊悯,value值沒(méi)用,因此往HashSet中添加元素梦皮,首先判斷key是否存在炭分,不存在插入元素,存在則不做處理届氢;
HashSet使用Hash算法存儲(chǔ)集合中的元素欠窒,具有很好的查找和存取性能。向HashSet中存入一個(gè)元素時(shí)退子,HashSet調(diào)用對(duì)象的HashCode方法獲取對(duì)象的HashCode值岖妄,根據(jù)HashCode值決定對(duì)象的存儲(chǔ)位置。HashSet判斷元素對(duì)象是否相同的方法是同時(shí)使用HashCode和equals方法來(lái)判斷寂祥,關(guān)于equals方法和HashCode的說(shuō)明:
1.equals相等的對(duì)象荐虐,hashCode一定相等;
2.equals不相等的對(duì)象丸凭,hashCode可能相等福扬,也可能相等腕铸。(哈希生成的時(shí)候產(chǎn)生碰撞)
3.反之,HashCode不相等铛碑,則equals方法一定不相等(如果equals相等則與規(guī)則1矛盾)狠裹;
4.HashCode相等,equals可以相等汽烦,也可以不相等涛菠。
HashSet判斷元素相等方法時(shí),首先判斷兩個(gè)對(duì)象的HashCode是否相等撇吞,如果不相等俗冻,則認(rèn)為兩個(gè)對(duì)象也不相等,如果相等再判斷equals方法是否相等牍颈;如果hashCode相等迄薄,equals方法不相等,則認(rèn)為時(shí)不同的對(duì)象煮岁;為什么這樣做讥蔽,主要是為了提高效率,HashCode的效率比equals效率更高人乓,不必每次重新計(jì)算Hash值.
1.3.1.1 linkedHashSet
linkedHashSet繼承自HashSet勤篮,同時(shí)使用鏈表來(lái)維護(hù)元素的順序,元素以插入的順序進(jìn)行訪問(wèn)色罚;在性能上略低于HashSet,但在迭代訪問(wèn)時(shí)有很好的性能碰缔;
1.3.2 SortedSet
主要用于排序操作,實(shí)現(xiàn)此接口的子類都屬于排序子類戳护。
1.3.2.1 TreeSet
基于SortedSet金抡,底層實(shí)現(xiàn)是通過(guò)二叉樹(shù),插入的元素要實(shí)現(xiàn)Comparable接口腌且。