2.集合中的元素不能重復。如果使用add(Object obj)方法添加現有對象,則之前的對象將被覆蓋。
為什麽要使用集合類?
當妳事先不知道要存儲的數據數量,或者需要比數組下標訪問機制更靈活的方法時,就需要使用collection類。集合類存儲在java.util包中。
集合類存儲對象的引用,而不是對象本身。為了表達方便,我們稱集合中的對象為集合中對象的引用。
集合有三種主要類型:集合、列表和映射。
(1)集
集合是最簡單的集合。它的對象沒有按照特定的方式排序,只是簡單地添加到集合中,就像把東西放進口袋壹樣。
對集合中成員的訪問和操作是通過對集合中對象的引用來完成的,因此集合中不能有重復的對象。
集合也有很多變種,可以實現排序等功能,比如TreeSet,將對象添加到集合中的操作會變成按照某種比較規則將其插入到壹個有序的對象序列中。它實現了SortedSet接口,也就是增加了對象比較的方法。通過叠代集合中的對象,我們可以得到壹個升序的對象集合。
(2)列表
列表的主要特征是它的對象以線性方式存儲,沒有特定的順序,只有開始和結束。當然,它不同於壹個完全沒有秩序的集合。
列表在數據結構中表示為數組和向量、鏈表、棧和隊列。
實現list的collection類是我們日常工作中經常用到的,下面的筆記會詳細介紹。
(3)制圖
映射明顯不同於集合或列表,映射中的每壹項都是成對的。存儲在映射中的每個對象都有壹個相關的鍵對象,鍵決定了對象在映射中的存儲位置。在檢索對象時,必須提供相應的鍵,就像在字典中查找單詞壹樣。關鍵字應該是唯壹的。
關鍵字本身不能確定對象的存儲位置,需要通過哈希技術處理生成壹個整數值,稱為哈希碼。
哈希碼通常用作相對於分配給映射的內存區域的起始位置的偏移量,從而確定鍵/對象對的存儲位置。理想情況下,哈希過程應該在給定的範圍內產生均勻分布的值,每個關鍵字應該獲得不同的哈希代碼。java.util中有* * * 13類可用於管理集合對象。它們支持集合,如集合、列表或地圖。下面是對這些類的簡單介紹。
設置:
HashSet:使用HashMap實現壹個集合。雖然壹個集合被定義為無序的,但是壹定有某種方法可以非常有效地找到壹個對象。使用壹個HashMap對象實現集合的存儲和檢索是在固定時間內實現的。
TreeSet:對集合中的對象進行升序排序的集合的實現。這意味著從TreeSet對象獲得的第壹個叠代器將以升序提供對象。TreeSet類使用壹個樹形圖。
列表:
Vector:實現壹個類似於數組的表,自動增加容量來容納妳需要的元素。使用下標存儲和檢索對象就像在標準數組中壹樣。也可以使用叠代器從向量中檢索對象。Vector是唯壹的同步容器類。當兩個或多個線程同時訪問時,性能也很好。
Stack:這個類是Vector派生的,增加了壹個方法實現stack?後進先出存儲結構。
LinkedList:實現壹個鏈表。這個類定義的鏈表也可以像堆棧或隊列壹樣使用。
ArrayList:實現壹個數組,其規模是可變的,可以像鏈表壹樣訪問。它提供的功能類似於Vector類,但不是同步的。
映射:
Hashtable:要實現壹個圖像,所有的鍵必須是非空的。為了高效地工作,定義鍵的類必須實現hashcode()方法和equal()方法。這個類是以前的java實現的繼承,通常可以更好地用於實現圖像的其他類。
HashMap:實現壹個image,允許存儲空對象,允許鍵為空(由於鍵必須是惟壹的,當然只能有壹個)。
WeakHashMap:實現這樣壹個映像:通常,如果壹個鍵不再被壹個對象引用,那麽這個鍵/對象對將被丟棄。這與HashMap形成對比,在HashMap中,映像中的鍵維護鍵/對象對的生命周期,盡管使用映像的程序不再有對鍵的引用,因此不能檢索對象。
TreeMap:為了實現這樣的圖像,對象通過鍵以升序排列。
Set和List都是從公共接口集合擴展而來的,因此它們都可以被集合類型的變量引用。這意味著任何列表集或集合都可以用這種方式引用,除了映射類(但不完全排除,因為列表可以從映射中獲得。)所以,放壹個
將列表或集合傳遞給方法的標準方式是使用集合類型的參數。
Vector和ArrayList哪個更好,為什麽?
回答這個問題,不能壹概而論,有時候用向量比較好;有時候是ArrayList,有時候兩者都不是最好的選擇。妳不能指望得到壹個簡單肯定的答案,因為這取決於妳用它們做什麽。這裏有四個因素需要考慮:
(1)API
(2)同步處理
(3)數據增長
(4)使用方式
下面四個方面逐壹討論