容器是什麼?跟接口是什麼關系?集合又是什麼?求大神幫忙??????
Java集合容器主要有以下幾類:
1,內置容器:數組
2,list容器:Vetor,Stack,ArrayList,LinkedList,
CopyOnWriteArrayList(1.5),AttributeList(1.5),RoleList(1.5),RoleUnresolvedList(1.5),
ConcurrentLinkedQueue(1.5),ArrayBlockingQueue(1.5),LinkedBlockingQueue(1.5),
PriorityQueue(1.5),PriorityBlockingQueue(1.5),SynchronousQueue(1.5)
3,set容器:HashSet(1.2),LinkedHashSet(1.4),TreeSet(1.2),
CopyOnWriteArraySet(1.5),EnumSet(1.5),JobStateReasons。
4,map容器:Hashtable,HashMap(1.2),TreeMap(1.2),LinkedHashMap(1.4),WeakHashMap(1.2),
IdentityHashMap(1.4),ConcurrentMap(1.5),concurrentHashMap(1.5)。
注意:Vector,Stack,Hashtable是Java1.2前的容器。
雖然在Java2之前,Java是沒有完整的集合框架的。它只有一些簡單的可以自擴展的容器類。
但是在Java2後他們還是被融入到了集合框架的,不過只是歷史遺留而已。它們和1.2前應該還是有些變化的,雖然本質沒什麼變化。
Set接口繼承於Collection,但不允許重復,使用自己內部的一個排列機制。
List接口繼承Collection,允許重復,以元素安插的次序來放置元素,不會重新排列。
Map接口是一組成對的鍵-值對象,即所持有的是key-value pairs。Map中不能有重復的key。擁有自己的內部排列機制。
一、Java1.2之前的容器類庫
其實在Java2之前,Java是沒有完整的集合框架的。它只有一些簡單的可以自擴展的容器類,比如Vector,Stack,Hashtable等。
Java1容器類庫設計的一個重大失誤是竟然沒有對容器進行排序的工具。比如你想讓Vector容器中的對象按字典順序進行排序,你就要自己實現。
1.1、Vector
java.util.Vector中包含的元素可以通過一個整型的索引值取得,它的大小可以在添加或移除元素時自動增加或縮小。Vector的操作很簡單,通過addElement()加入一個對象,用elementAt()取出它,還可以查詢當前所保存的對象的個數size();
另外還有一個Enumeration類提供了連續操作Vector中元素的方法,這可以通過Vector中的elements()方法來獲取一個Enumeration類的對象,
可以用一個While循環來遍歷其中的元素。用hasMoreElements()檢查其中是否還有更多的元素。
用nextElement()獲得下一個元素。Enumeration的用意在於使你能完全不用理會你要遍歷的容器的基礎結構,只關注你的遍歷方法,
這也就使得遍歷方法的重用成為可能。由於這種思想的強大功能,所以在Java2中被保留下來,不過具體實現,方法名和內部算法都改變了,
這就是Java2中的Iterator以及ListIterator類。然而Enumeration的功能卻十分有限,比如只能朝一個方向進行,只能讀取而不能更改等。
更多內容請參考《Vector》
1.2、Stack
java.util.Stack最常用的操作便是壓入和彈出,最後壓入的元素最先被彈出。它遵循後進先出(LIFO)原則。
在Java中Stack的的用法也很簡單,有push()壓入一個元素,用pop()彈出一個元素。
更多內容請參考《Stack容器》
1.3、Hashtable
Hashtable與Java2中的Map類似,可以看成一種關聯或映射數組,可以將兩個毫無關系的對象相關聯。
它的基本目標是實現兩個對象之間進行關聯。
更多內容請參考《Hashtable》
二、Java2中的容器類庫
自Java1.2之後Java版本統稱為Java2,Java2中的容器類庫才可以說是一種真正意義上的集合框架的實現。
基本完全重新設計,但是又對Java1中的一些容器類庫在新的設計上進行了保留,這主要是為了向下兼容的目的,
當用 Java2開發程序時,應盡量避免使用它們,Java2的集合框架已經完全可以滿足你的需求。
在Java1中容器類庫是同步化的,而 Java2中的容器類庫都是非同步化,這可能是對執行效率進行考慮的結果。
Java2中的集合框架提供了一套設計優良的接口和類,使程序員操作成批的數據或對象元素極為方便。
這些接口和類有很多對抽象數據類型操作的API,而這是我們常用的且在數據結構中熟知的。例如Maps,Sets,Lists,Arrays等。
並且Java用面向對象的設計對這些數據結構和算法進行了封裝,這就極大的減化了程序員編程時的負擔。
程序員也可以以這個集合框架為基礎,定義更高級別的數據抽象,比如棧、隊列和線程安全的集合等,從而滿足自己的需要。
Java2的集合框架,抽其核心,主要有三類:List(包括List,Queue,BlockingQueue)、Set和Map。List和Set繼承了Collection,而Map則獨成一體。
初看上去可能會對Map獨成一體感到不解,它為什麼不也繼承Collection呢?但是這種設計是合理的。
一個Map提供了通過Key對Map中存儲的Value進行訪問,也就是說它操作的都是成對的對象元素,比如put()和get()方法,
而這是一個Set或List 所不就具備的。當然在需要時,你可以由keySet()方法或values()方法從一個Map中得到鍵的Set集或值的Collection集。
集合框架中還有兩個很實用的公用類:Collections和Arrays。Collections提供了對一個Collection容器進行諸如排序、復制、查找和填充等一些非常有用的方法, Arrays則是對一個數組進行類似的操作。
2.1、Collection
Collection接口提供了一組操作成批對象的方法。(它只是個接口)
它提供了基本操作如添加、刪除。它也支持查詢操作如是否為空isEmpty()方法等。
為了支持對Collection進行獨立操作,Java的集合框架給出了一個Iterator,它使得你可以泛型操作一個Collection,
而不需知道這個 Collection的具體實現類型是什麼。它的功能與Java1中的Enumeration類似,只是更易掌握和使用,功能也更強大。
在建立集合框架時,Sun的開發團隊考慮到需要提供一些靈活的接口,用來操作成批的元素,又為了設計的簡便,
就把那些對集合進行可選操作的方法與基本方法放到了一起。因為一個接口的實現者必須提供對接口中定義的所有方法的實現,
這就需要一種途徑讓調用者知道它正在調用 的可選方法當前不支持。最後開發團隊選擇使用一種信號,
也即拋出一種不支持操作例外(UnsupportedOperationException),如果你在使用一個Collection中遇到一個上述的例外,
那就意味著你的操作失敗,比如你對一個只讀Collection添加一個元素時,你就會得到一個不支持操作例外。
在你實現一個集合接口時,你可以很容易的在你不想讓用戶使用的方法中拋出UnsupportOperationException來告訴使用者這個方法當前沒有實現,
UnsupportOperationException是RuntimeException的一個擴展。
另外Java2的容器類庫還有一種Fail fast的機制。比如你正在用一個Iterator遍歷一個容器中的對象,
這時另外一個線程或進程對那個容器進行了修改,那麼再用next()方法時可能會有災難性的後果,
而這是你不願看到的,這時就會引發一個ConcurrentModificationException例外。
這就是 fail-fast。