當前位置:成語大全網 - 新華字典 - java集合問題

java集合問題

Java容器類Collection、List、ArrayList、Vector及map、HashTable、HashMap區別

Collection是List和Set兩個接口的基接口

List在Collection之上增加了"有序"

Set在Collection之上增加了"唯壹"

而ArrayList是實現List的類...所以他是有序的.

它裏邊存放的元素在排列上存在壹定的先後順序

而且ArrayList是采用數組存放元素

另壹種List LinkedList采用的則是鏈表。

Collection和Map接口之間的主要區別在於:Collection中存儲了壹組對象,而Map存儲關鍵字/值對。

在Map對象中,每壹個關鍵字最多有壹個關聯的值。

Map:不能包括兩個相同的鍵,壹個鍵最多能綁定壹個值。null可以作為鍵,這樣的鍵只有壹個;可以有壹個或多個鍵所對應的

值為null。當get()方法返回null值時,即可以表示Map中沒有該鍵,也可以表示該鍵所對應的值為null。因此,在Map中不能由get()方法來判斷Map中是否存在某個鍵,而應該用containsKey()方法來判斷。

繼承Map的類有:HashMap,HashTable

HashMap:Map的實現類,缺省情況下是非同步的,可以通過Map Collections.synchronizedMap(Map m)來達到線程同步

HashTable:Dictionary的子類,確省是線程同步的。不允許關鍵字或值為null

當元素的順序很重要時選用TreeMap,當元素不必以特定的順序進行存儲時,使用HashMap。Hashtable的使用不被推薦,因為HashMap提供了所有類似的功能,並且速度更快。當妳需要在多線程環境下使用時,HashMap也可以轉換為同步的。

為什麽要使用集合類

當妳事先不知道要存放數據的個數,或者妳需要壹種比數組下標存取機制更靈活的方法時,妳就需要用到集合類。

理解集合類

集合類存放於java.util包中。

集合類存放的都是對象的引用,而非對象本身,出於表達上的便利,我們稱集合中的對象就是指集合中對象的引用(reference)。

集合類型主要有3種:set(集)、list(列表)和map(映射)。

(1)集

集(set)是最簡單的壹種集合,它的對象不按特定方式排序,只是簡單的把對象加入集合中,就像往口袋裏放東西。

對集中成員的訪問和操作是通過集中對象的引用進行的,所以集中不能有重復對象。

集也有多種變體,可以實現排序等功能,如TreeSet,它把對象添加到集中的操作將變為按照某種比較規則將其插入到有序的對象序列中。它實現的是SortedSet接口,也就是加入了對象比較的方法。通過對集中的對象叠代,我們可以得到壹個升序的對象集合。

(2)列表

列表的主要特征是其對象以線性方式存儲,沒有特定順序,只有壹個開頭和壹個結尾,當然,它與根本沒有順序的集是不同的。

列表在數據結構中分別表現為:數組和向量、鏈表、堆棧、隊列。

關於實現列表的集合類,是我們日常工作中經常用到的,將在後邊的筆記詳細介紹。

(3)映射

映射與集或列表有明顯區別,映射中每個項都是成對的。映射中存儲的每個對象都有壹個相關的關鍵字(Key)對象,關鍵字決定了對象在映射中的存儲位置,檢索對象時必須提供相應的關鍵字,就像在字典中查單詞壹樣。關鍵字應該是唯壹的。

關鍵字本身並不能決定對象的存儲位置,它需要對過壹種散列(hashing)技術來處理,產生壹個被稱作散列碼(hash code)的整數值,散列碼通常用作壹個偏置量,該偏置量是相對於分配給映射的內存區域起始位置的,由此確定關鍵字/對象對的存儲位置。理想情況下,散列處理應該產生給定範圍內均勻分布的值,而且每個關鍵字應得到不同的散列碼。

集合類簡介

java.util中***有13個類可用於管理集合對象,它們支持集、列表或映射等集合,以下是這些類的簡單介紹

集:

HashSet: 使用HashMap的壹個集的實現。雖然集定義成無序,但必須存在某種方法能相當高效地找到壹個對象。使用壹個HashMap對象實現集的存儲和檢索操作是在固定時間內實現的.

TreeSet: 在集中以升序對對象排序的集的實現。這意味著從壹個TreeSet對象獲得第壹個叠代器將按升序提供對象。TreeSet類使用了壹個TreeMap.

列表:

Vector: 實現壹個類似數組壹樣的表,自動增加容量來容納妳所需的元素。使用下標存儲和檢索對象就象在壹個標準的數組中壹樣。妳也可以用壹個叠代器從壹個Vector中檢索對象。Vector是唯壹的同步容器類?當兩個或多個線程同時訪問時也是性能良好的。(同步即同時只能壹個進程訪問,其他等待)

Stack: 這個類從Vector派生而來,並且增加了方法實現棧?壹種後進先出的存儲結構。

LinkedList: 實現壹個鏈表。由這個類定義的鏈表也可以像棧或隊列壹樣被使用。

ArrayList: 實現壹個數組,它的規模可變並且能像鏈表壹樣被訪問。它提供的功能類似Vector類但不同步。

映射:

HashTable: 實現壹個映象,所有的鍵必須非空。為了能高效的工作,定義鍵的類必須實現hashcode()方法和equal()方法。這個類是前面java實現的壹個繼承,並且通常能在實現映象的其他類中更好的使用。

HashMap: 實現壹個映象,允許存儲空對象,而且允許鍵是空(由於鍵必須是唯壹的,當然只能有壹個)。

WeakHashMap: 實現這樣壹個映象:通常如果壹個鍵對壹個對象而言不再被引用,鍵/對象對將被舍棄。這與HashMap形成對照,映象中的鍵維持鍵/對象對的生命周期,盡管使用映象的程序不再有對鍵的引用,並且因此不能檢索對象。

TreeMap: 實現這樣壹個映象,對象是按鍵升序排列的。

下圖是集合類所實現的接口之間的關系:

Set和List都是由公***接口Collection擴展而來,所以它們都可以使用壹個類型為Collection的變量來引用。這就意味著任何列表或集構成的集合都可以用這種方式引用,只有映射類除外(但也不是完全排除在外,因為可以從映射獲得壹個列表。)所以說,把壹個列表或集傳遞給方法的標準途徑是使用Collection類型的參數。

<hr>

List接口

List是有序的Collection,使用此接口能夠精確的控制每個元素插入的位置。用戶能夠使用索引(元素在List中的位置,類似於數組下標)來訪問List中的元素,這類似於Java的數組。

和下面要提到的Set不同,List允許有相同的元素。

除了具有Collection接口必備的iterator()方法外,List還提供壹個listIterator()方法,返回壹個ListIterator接口,和標準的Iterator接口相比,ListIterator多了壹些add()之類的方法,允許添加,刪除,設定元素,還能向前或向後遍歷。

實現List接口的常用類有LinkedList,ArrayList,Vector和Stack。

ArrayList類

ArrayList實現了可變大小的數組。它允許所有元素,包括null。ArrayList沒有同步。

size,isEmpty,get,set方法運行時間為常數。但是add方法開銷為分攤的常數,添加n個元素需要O(n)的時間。其他的方法運行時間為線性。

每個ArrayList實例都有壹個容量(Capacity),即用於存儲元素的數組的大小。這個容量可隨著不斷添加新元素而自動增加,但是增長算法並沒有定義。當需要插入大量元素時,在插入前可以調用ensureCapacity方法來增加ArrayList的容量以提高插入效率。

和LinkedList壹樣,ArrayList也是非同步的(unsynchronized)。

Map接口

請註意,Map沒有繼承Collection接口,Map提供key到value的映射。壹個Map中不能包含相同的key,每個key只能映射壹個value。Map接口提供3種集合的視圖,Map的內容可以被當作壹組key集合,壹組value集合,或者壹組key-value映射。

HashMap類

HashMap和Hashtable類似,不同之處在於HashMap是非同步的,並且允許null,即null value和null key。,但是將HashMap視為Collection時(values()方法可返回Collection),其叠代子操作時間開銷和HashMap的容量成比例。因此,如果叠代操作的性能相當重要的話,不要將HashMap的初始化容量設得過高,或者load factor過低。

----------------------------------------------------------------------------

1.

List是接口,List特性就是有序,會確保以壹定的順序保存元素.

ArrayList是它的實現類,是壹個用數組實現的List.

Map是接口,Map特性就是根據壹個對象查找對象.

HashMap是它的實現類,HashMap用hash表實現的Map,就是利用對象的hashcode(hashcode()是Object的方法)進行快速散列查找.(關於散列查找,可以參看<<數據結構>>)

2.

壹般情況下,如果沒有必要,推薦代碼只同List,Map接口打交道.

比如:List list = new ArrayList();

這樣做的原因是list就相當於是壹個泛型的實現,如果想改變list的類型,只需要:

List list = new LinkedList();//LinkedList也是List的實現類,也是ArrayList的兄弟類

這樣,就不需要修改其它代碼,這就是接口編程的優雅之處.

另外的例子就是,在類的方法中,如下聲明:

private void doMyAction(List list){}

這樣這個方法能處理所有實現了List接口的類,壹定程度上實現了泛型函數.

3.

如果開發的時候覺得ArrayList,HashMap的性能不能滿足妳的需要,可以通過實現List,Map(或者Collection)來定制妳的自定義類

本文來自CSDN博客,轉載請標明出處:/xczheng/archive/2009/02/25/3936474.aspx