集合類筆記

java.util.*定義了一系列的接口和類,告訴我們用什麼類NEW出一個對象,可以進行超越數組的操作。
(注:JAVA1.5對JAVA1.4的最大改進就是增加了對範型的支持)

Set接口是數學中集合的概念:其元素無序,且不可重複。(正好與List對應)

!!注意數組和集合的區別:數組中只能存簡單數據類型。Collection接口和Map接口只能存對象。

只有List可用get和size。而Set則不可用(因其無序)。

集合中每一個元素都有對象,如有字符串要經過強制類型轉換。

Collections是工具類,所有方法均爲有用方法,且方法爲static。


Collections.Sort()分爲兩部分,一部分爲排序規則;一部分爲排序算法。
規則用來判斷對象;算法是考慮如何排序。
對於自定義對象,Sort不知道規則,所以無法比較。這種情況下一定要定義排序規則。方式有兩種:
java.lang下面有一個接口:Comparable(可比較的)
可以讓自定義對象實現一個接口,這個接口只有一個方法compareTo(Object o)
其規則是當前對象與o對象進行比較,其返回一個int值,系統根據此值來進行排序。
如 當前對象>o對象,則返回值>0;(可將返回值定義爲1)
如 當前對象=o對象,則返回值=0;
如 當前對象<o對象,則返回值〈0。(可將返回值定義爲-1)
看TestArraylist的java代碼。
我們通過返回值1和-1位置的調換來實現升序和降序排列的轉換。

java.util下有一個Comparator(比較器)
它擁有compare(),用來比較兩個方法。
要生成比較器,則用Sort中Sort(List,List(Compate))
第二種方法更靈活,且在運行的時候不用編譯。

注意:要想實現compareTo()就必須在主方法中寫上implement Comparable.


集合的最大缺點是無法進行類型判定(這個缺點在JAVA1.5中已經解決),這樣就可能出現因爲類型不同而出現類型錯誤。
解決的方法是添加類型的判斷。

而在LinkedList的底層是一種雙向循環鏈表。在此鏈表上每一個數據節點都由三部分組成:前指針(指向前面的節點的位置),數據,後指針(指向後面的節點的位置)。最後一個節點的後指針指向第一個節點的前指針,形成一個循環。

LinkedList經常用在增刪操作較多而查詢操作很少的情況下:隊列和堆棧。
隊列:先進先出的數據結構。
堆棧:後進先出的數據結構。
注意:使用堆棧的時候一定不能提供方法讓不是最後一個元素的元素獲得出棧的機會。
LinkedList提供以下方法:(ArrayList無此類方法)
addFirst();
removeFirst();
addLast();
removeLast();


Push用addFirst();pop用removeFirst(),實現後進先出。
用isEmpty()--其父類的方法,來判斷棧是否爲空。

在隊列中,put爲入隊列操作,get爲出隊列操作。
Put用addFirst(),get用removeLast()實現隊列。

List接口的實現類(Vector)(與ArrayList相似,區別是Vector是重量級的組件,使用使消耗的資源比較多。)
結論:在考慮併發的情況下用Vector(保證線程的安全)。
在不考慮併發的情況下用ArrayList(不能保證線程的安全)。

面試經驗(知識點):
java.util.stack(stack即爲堆棧)的父類爲Vector。可是stack的父類是最不應該爲Vector的。因爲Vector的底層是數組,且Vector有get方法(意味着它可能訪問到並不屬於最後一個位置元素的其他元素,很不安全)。
對於堆棧和隊列只能用push類和get類。
Stack類以後不要輕易使用。
!!!實現堆棧一定要用LinkedList。


(在JAVA1.5中,collection有queue來實現隊列。)

Junior2Senior

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章