日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

java 容器類使用 Collection,Map,HashMap,hashTable,TreeMap,List,Vector,ArrayList的區(qū)別

 meihong_521 2012-07-11
 
java 容器類使用 Collection,Map,HashMap,hashTable,TreeMap,List,Vector,ArrayList的區(qū)別、
 
經(jīng)常會看到程序中使用了記錄集,常用的有Collection、HashMap、HashSet、ArrayList,因為分不清楚它們之間的關(guān)系,所以在使用時經(jīng)常會混淆,以至于不知道從何下手。在這兒作了一個小例子,希望有助于幫大家理順思路。
首先看一下它們的關(guān)系:
Collection
--List:-----------------------以特定次序存儲元素。所以取出來的順序可能和放入順序不同。
      ---ArrayList
      ---LinkedList
      ---Vector
--Set :----------------------- 不含有重復的元素
      --- HashSet
      --- TreeSet
Map
      ---HashMap
      ---HashTable
      ---TreeMap
補充:
   List,Set,Map將存入的數(shù)據(jù)一律視為Object類型。
   Collection、List、Set、Map都是接口,不能實例化。繼承自它們的 ArrayList, Vector, HashTable,HashMap是具象class,這些才可被實例化。
   vector不進行邊界檢查。
   接下來看一下具體的實例:
Collection
   定義一個Collection對象,指向其子類一個新創(chuàng)建的實例:
   Collection c = new ArrayList()此即所謂的"父類引用指向子類對象",后面只要使用c即可代表新創(chuàng)建的ArrayList。接下來給它賦值。
       c.add("06S030014");
       c.add("hit");
       c.add("cs");
       c.add("wh");
   然后如何取出來哪,實現(xiàn)了Collection接口的子類都有一個iterator()方法,通過調(diào)用該方法可以返回Iterator類型的一個對象,使用該對象即可取出所要的值。代碼如下:
   Iterator it=c.iterator()
   String s = (String)it.next();
這只是取出其中的一條數(shù)據(jù),要想把所有的都取出來,可以用循環(huán)
      for(Iterator it=c.iterator();it.hasNext();){
             String s = (String)it.next();
      }

實現(xiàn)了Collection接口的子類都可以用類似上述的方法存取數(shù)據(jù)。
HashMap
   HashMap不同于Collection,它的對象沒有iterator()方法,但它有一個values()方法,調(diào)用此方法后返回的是Collection對象,通過返回的對象可調(diào)用iterator()方法,從而實現(xiàn)取數(shù)據(jù)。
   還有一個get()方法也可以獲得數(shù)據(jù),但只能取出單條記錄。看下面的例子
       HashMap hm1 = new HashMap();
       book bk1 = new book("001","java學習","高等教育");
       book bk2 = new book("002","tomcat配置","清華大學出版社");
       book bk3 = new book("003","jsp","機械工業(yè)");
       hm1.put("book1",bk1);
       hm1.put("book2",bk2);
       hm1.put("book3",bk3);
   其中book是書籍類,有三個屬性:bookid,bookname,bookpub。具體代碼見附件。
   調(diào)用put()方法將book的三個對象存入HashMap中,對應(yīng)的名字分別為book1,book2,book3
   取數(shù)據(jù)的兩種方法
      第一種
                Iterator itt = hm1.values().iterator();
                book bkex = (book) itt.next();
                取出的是第一條記錄,在此注意的是后存的先取[至于為什么我也說不清楚]
      第二種
            book tempbook =(book)hm1.get("book3");
            這樣可以直接根據(jù)名字取出對應(yīng)的記錄。

以上是我得出來的一些經(jīng)驗,希望能對大家有所幫助。也歡迎大家進一步探討!
附件是例子的完整代碼。
一下是關(guān)于線性表,鏈表,哈希表的詳細介紹,資料來源于互聯(lián)網(wǎng)。看了之后會更有助于加深對他們的了解!
線性表,鏈表,哈希表是常用的數(shù)據(jù)結(jié)構(gòu),在進行Java開發(fā)時,JDK已經(jīng)為我們提供了一系列相應(yīng)的類來實現(xiàn)基本的數(shù)據(jù)結(jié)構(gòu)。這些類均在
>java.util包中。本文試圖通過簡單的描述,向讀者闡述各個類的作用以及如何正確使用這些類。    
>   
> Collection  
> ├List  
> │├LinkedList  
> │├ArrayList  
> │└Vector  
> │ └Stack  
> └Set  
> Map  
> ├Hashtable  
> ├HashMap  
> └WeakHashMap  
>   
> Collection接口  
>   Collection是最基本的集合接口,一個Collection代表一組Object,即Collection的元素(Elements)。一些Collection允許相同的元
>素而另一些不行。一些能排序而另一些不行。Java   SDK不提供直接繼承自Collection的類,Java   SDK提供的類都是繼承自Collection的“
>子接口”如List和Set。  
>   所有實現(xiàn)Collection接口的類都必須提供兩個標準的構(gòu)造函數(shù):無參數(shù)的構(gòu)造函數(shù)用于創(chuàng)建一個空的Collection,有一個Collection參
>數(shù)的構(gòu)造函數(shù)用于創(chuàng)建一個新的Collection,這個新的Collection與傳入的Collection有相同的元素。后一個構(gòu)造函數(shù)允許用戶復制一個
>Collection。  
>   如何遍歷Collection中的每一個元素?不論Collection的實際類型如何,它都支持一個iterator()的方法,該方法返回一個迭代子,使
>用該迭代子即可逐一訪問Collection中每一個元素。典型的用法如下:  
>     Iterator   it   =   collection.iterator();   //   獲得一個迭代子  
>     while(it.hasNext())   {  
>       Object   obj   =   it.next();   //   得到下一個元素  
>     }  
>   由Collection接口派生的兩個接口是List和Set。  
>   
> List接口  
>   List是有序的Collection,使用此接口能夠精確的控制每個元素插入的位置。用戶能夠使用索引(元素在List中的位置,類似于數(shù)組下
>標)來訪問List中的元素,這類似于Java的數(shù)組。  
> 和下面要提到的Set不同,List允許有相同的元素。  
>   除了具有Collection接口必備的iterator()方法外,List還提供一個listIterator()方法,返回一個ListIterator接口,和標準的
>Iterator接口相比,ListIterator多了一些add()之類的方法,允許添加,刪除,設(shè)定元素,還能向前或向后遍歷。  
>   實現(xiàn)List接口的常用類有LinkedList,ArrayList,Vector和Stack。  
>   
> LinkedList類  
>   LinkedList實現(xiàn)了List接口,允許null元素。此外LinkedList提供額外的get,remove,insert方法在LinkedList的首部或尾部。這些操
>作使LinkedList可被用作堆棧(stack),隊列(queue)或雙向隊列(deque)。  
>   注意LinkedList沒有同步方法。如果多個線程同時訪問一個List,則必須自己實現(xiàn)訪問同步。一種解決方法是在創(chuàng)建List時構(gòu)造一個同
>步的List:  
>     List   list   =   Collections.synchronizedList(new   LinkedList(...));  
>   
> ArrayList類  
>   ArrayList實現(xiàn)了可變大小的數(shù)組。它允許所有元素,包括null。ArrayList沒有同步。  
> size,isEmpty,get,set方法運行時間為常數(shù)。但是add方法開銷為分攤的常數(shù),添加n個元素需要O(n)的時間。其他的方法運行時間為線性
>。  
>   每個ArrayList實例都有一個容量(Capacity),即用于存儲元素的數(shù)組的大小。這個容量可隨著不斷添加新元素而自動增加,但是增長
>算法并沒有定義。當需要插入大量元素時,在插入前可以調(diào)用ensureCapacity方法來增加ArrayList的容量以提高插入效率。  
>   和LinkedList一樣,ArrayList也是非同步的(unsynchronized)。  
>   
> Vector類  
>   Vector非常類似ArrayList,但是Vector是同步的。由Vector創(chuàng)建的Iterator,雖然和ArrayList創(chuàng)建的Iterator是同一接口,但是,因
>為Vector是同步的,當一個Iterator被創(chuàng)建而且正在被使用,另一個線程改變了Vector的狀態(tài)(例如,添加或刪除了一些元素),這時調(diào)用
>Iterator的方法時將拋出ConcurrentModificationException,因此必須捕獲該異常。  
>   
> Stack   類  
>   Stack繼承自Vector,實現(xiàn)一個后進先出的堆棧。Stack提供5個額外的方法使得Vector得以被當作堆棧使用?;镜膒ush和pop方法,還
>有peek方法得到棧頂?shù)脑?,empty方法測試堆棧是否為空,search方法檢測一個元素在堆棧中的位置。Stack剛創(chuàng)建后是空棧。  
>   
> Set接口  
>   Set是一種不包含重復的元素的Collection,即任意的兩個元素e1和e2都有e1.equals(e2)=false,Set最多有一個null元素。  
>   很明顯,Set的構(gòu)造函數(shù)有一個約束條件,傳入的Collection參數(shù)不能包含重復的元素。  
>   請注意:必須小心操作可變對象(Mutable   Object)。如果一個Set中的可變元素改變了自身狀態(tài)導致Object.equals(Object)=true將
>導致一些問題。  
>   
> Map接口  
>   請注意,Map沒有繼承Collection接口,Map提供key到value的映射。一個Map中不能包含相同的key,每個key只能映射一個value。Map接
>口提供3種集合的視圖,Map的內(nèi)容可以被當作一組key集合,一組value集合,或者一組key-value映射。  
>   
> Hashtable類  
>   Hashtable繼承Map接口,實現(xiàn)一個key-value映射的哈希表。任何非空(non-null)的對象都可作為key或者value。  
>   添加數(shù)據(jù)使用put(key,   value),取出數(shù)據(jù)使用get(key),這兩個基本操作的時間開銷為常數(shù)。  
> Hashtable通過initial   capacity和load   factor兩個參數(shù)調(diào)整性能。通常缺省的load   factor   0.75較好地實現(xiàn)了時間和空間的均衡
>。增大load   factor可以節(jié)省空間但相應(yīng)的查找時間將增大,這會影響像get和put這樣的操作。  
> 使用Hashtable的簡單示例如下,將1,2,3放到Hashtable中,他們的key分別是”one”,”two”,”three”:  
>     Hashtable   numbers   =   new   Hashtable();  
>     numbers.put(“one”,   new   Integer(1));  
>     numbers.put(“two”,   new   Integer(2));  
>     numbers.put(“three”,   new   Integer(3));  
>   要取出一個數(shù),比如2,用相應(yīng)的key:  
>     Integer   n   =   (Integer)numbers.get(“two”);  
>     System.out.println(“two   =   ”   +   n);  
>   由于作為key的對象將通過計算其散列函數(shù)來確定與之對應(yīng)的value的位置,因此任何作為key的對象都必須實現(xiàn)hashCode和equals方法。
>hashCode和equals方法繼承自根類Object,如果你用自定義的類當作key的話,要相當小心,按照散列函數(shù)的定義,如果兩個對象相同,即
>obj1.equals(obj2)=true,則它們的hashCode必須相同,但如果兩個對象不同,則它們的hashCode不一定不同,如果兩個不同對象的hashCode
>相同,這種現(xiàn)象稱為沖突,沖突會導致操作哈希表的時間開銷增大,所以盡量定義好的hashCode()方法,能加快哈希表的操作。  
>   如果相同的對象有不同的hashCode,對哈希表的操作會出現(xiàn)意想不到的結(jié)果(期待的get方法返回null),要避免這種問題,只需要牢記
>一條:要同時復寫equals方法和hashCode方法,而不要只寫其中一個。  
>   Hashtable是同步的。  
>   
> HashMap類  
>   HashMap和Hashtable類似,不同之處在于HashMap是非同步的,并且允許null,即null   value和null   key。,但是將HashMap視為
>Collection時(values()方法可返回Collection),其迭代子操作時間開銷和HashMap的容量成比例。因此,如果迭代操作的性能相當重要的話
>,不要將HashMap的初始化容量設(shè)得過高,或者load   factor過低。  
>   
> WeakHashMap類  
>   WeakHashMap是一種改進的HashMap,它對key實行“弱引用”,如果一個key不再被外部所引用,那么該key可以被GC回收。  
>   
> 總結(jié)  
>   如果涉及到堆棧,隊列等操作,應(yīng)該考慮用List,對于需要快速插入,刪除元素,應(yīng)該使用LinkedList,如果需要快速隨機訪問元素,
>應(yīng)該使用ArrayList。  
>   如果程序在單線程環(huán)境中,或者訪問僅僅在一個線程中進行,考慮非同步的類,其效率較高,如果多個線程可能同時操作一個類,應(yīng)該
>使用同步的類。  
>   要特別注意對哈希表的操作,作為key的對象要正確復寫equals和hashCode方法。  
>   盡量返回接口而非實際的類型,如返回List而非ArrayList,這樣如果以后需要將ArrayList換成LinkedList時,客戶端代碼不用改變。
>這就是針對抽象編程

Collection接口,包含list和set子接口
Collection和Map接口之間的主要區(qū)別在于:Collection中存儲了一組對象,而Map存儲關(guān)鍵字/值對。
在Map對象中,每一個關(guān)鍵字最多有一個關(guān)聯(lián)的值。
Map:不能包括兩個相同的鍵,一個鍵最多能綁定一個值。null可以作為鍵,這樣的鍵只有一個;可以有一個或多個鍵所對應(yīng)的
值為null。當get()方法返回null值時,即可以表示Map中沒有該鍵,也可以表示該鍵所對應(yīng)的值為null。因此,在Map中不能由get()方法來判斷Map中是否存在某個鍵,而應(yīng)該用containsKey()方法來判斷。
繼承Map的類有:HashMap,HashTable
HashMap:Map的實現(xiàn)類,缺省情況下是非同步的,可以通過Map Collections.synchronizedMap(Map m)來達到線程同步
HashTable:Dictionary的子類,確省是線程同步的。不允許關(guān)鍵字或值為null

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


以下引用:
  • 為什么要使用集合類

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

  • 理解集合類

集合類存放于java.util包中。
集合類存放的都是對象的引用,而非對象本身,出于表達上的便利,我們稱集合中的對象就是指集合中對象的引用(reference)。
集合類型主要有3種:set(集)、list(列表)和map(映射)。

(1)集
集(set)是最簡單的一種集合,它的對象不按特定方式排序,只是簡單的把對象加入集合中,就像往口袋里放東西。
對集中成員的訪問和操作是通過集中對象的引用進行的,所以集中不能有重復對象。
集也有多種變體,可以實現(xiàn)排序等功能,如TreeSet,它把對象添加到集中的操作將變?yōu)榘凑漳撤N比較規(guī)則將其插入到有序的對象序列中。它實現(xiàn)的是SortedSet接口,也就是加入了對象比較的方法。通過對集中的對象迭代,我們可以得到一個升序的對象集合。

(2)列表
列表的主要特征是其對象以線性方式存儲,沒有特定順序,只有一個開頭和一個結(jié)尾,當然,它與根本沒有順序的集是不同的。
列表在數(shù)據(jù)結(jié)構(gòu)中分別表現(xiàn)為:數(shù)組和向量、鏈表、堆棧、隊列。
關(guān)于實現(xiàn)列表的集合類,是我們?nèi)粘9ぷ髦薪?jīng)常用到的,將在后邊的筆記詳細介紹。

(3)映射
映射與集或列表有明顯區(qū)別,映射中每個項都是成對的。映射中存儲的每個對象都有一個相關(guān)的關(guān)鍵字(Key)對象,關(guān)鍵字決定了對象在映射中的存儲位置,檢索對象時必須提供相應(yīng)的關(guān)鍵字,就像在字典中查單詞一樣。關(guān)鍵字應(yīng)該是唯一的。
關(guān)鍵字本身并不能決定對象的存儲位置,它需要對過一種散列(hashing)技術(shù)來處理,產(chǎn)生一個被稱作散列碼(hash code)的整數(shù)值,散列碼通常用作一個偏置量,該偏置量是相對于分配給映射的內(nèi)存區(qū)域起始位置的,由此確定關(guān)鍵字/對象對的存儲位置。理想情況下,散列處理應(yīng)該產(chǎn)生給定范圍內(nèi)均勻分布的值,而且每個關(guān)鍵字應(yīng)得到不同的散列碼。

  • 集合類簡介

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

集:
HashSet:
使用HashMap的一個集的實現(xiàn)。雖然集定義成無序,但必須存在某種方法能相當高效地找到一個對象。使用一個HashMap對象實現(xiàn)集的存儲和檢索操作是在固定時間內(nèi)實現(xiàn)的.
TreeSet: 在集中以升序?qū)ο笈判虻募膶崿F(xiàn)。這意味著從一個TreeSet對象獲得第一個迭代器將按升序提供對象。TreeSet類使用了一個TreeMap.
列表:
Vector: 實現(xiàn)一個類似數(shù)組一樣的表,自動增加容量來容納你所需的元素。使用下標存儲和檢索對象就象在一個標準的數(shù)組中一樣。你也可以用一個迭代器從一個Vector中檢索對象。Vector是唯一的同步容器類??當兩個或多個線程同時訪問時也是性能良好的。
Stsck: 這個類從Vector派生而來,并且增加了方法實現(xiàn)棧??一種后進先出的存儲結(jié)構(gòu)。
LinkedList: 實現(xiàn)一個鏈表。由這個類定義的鏈表也可以像棧或隊列一樣被使用。
ArrayList: 實現(xiàn)一個數(shù)組,它的規(guī)??勺儾⑶夷芟矜湵硪粯颖辉L問。它提供的功能類似Vector類但不同步。
映射:
HashTable:
實現(xiàn)一個映象,所有的鍵必須非空。為了能高效的工作,定義鍵的類必須實現(xiàn)hashcode()方法和equal()方法。這個類是前面java實現(xiàn)的一個繼承,并且通常能在實現(xiàn)映象的其他類中更好的使用。
HashMap: 實現(xiàn)一個映象,允許存儲空對象,而且允許鍵是空(由于鍵必須是唯一的,當然只能有一個)。
WeakHashMap: 實現(xiàn)這樣一個映象:通常如果一個鍵對一個對象而言不再被引用,鍵/對象對將被舍棄。這與HashMap形成對照,映象中的鍵維持鍵/對象對的生命周期,盡管使用映象的程序不再有對鍵的引用,并且因此不能檢索對象。
TreeMap: 實現(xiàn)這樣一個映象,對象是按鍵升序排列的。

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

Java容器類Collection、List、ArrayList、Vector及map、HashTable、HashMap區(qū)別 2009-02-21 19:45 Collection是List和Set兩個接口的基接口 List在Collection之上增加了"有序" Set在Collection之上增加了"唯一" 而ArrayList是實現(xiàn)List的類...所以他是有序的. 它里邊存放的元素在排列上存在一定的先后順序 而且ArrayList是采用數(shù)組存放元素 另一種List LinkedList采用的則是鏈表。 Collection和Map接口之間的主要區(qū)別在于:Collection中存儲了一組對象,而Map存儲關(guān)鍵字/值對。 在Map對象中,每一個關(guān)鍵字最多有一個關(guān)聯(lián)的值。 Map:不能包括兩個相同的鍵,一個鍵最多能綁定一個值。null可以作為鍵,這樣的鍵只有一個;可以有一個或多個鍵所對應(yīng)的 值為null。當get()方法返回null值時,即可以表示Map中沒有該鍵,也可以表示該鍵所對應(yīng)的值為null。因此,在Map中不能由get()方法來判斷Map中是否存在某個鍵,而應(yīng)該用containsKey()方法來判斷。 繼承Map的類有:HashMap,HashTable HashMap:Map的實現(xiàn)類,缺省情況下是非同步的,可以通過Map Collections.synchronizedMap(Map m)來達到線程同步 HashTable:Dictionary的子類,確省是線程同步的。不允許關(guān)鍵字或值為null 當元素的順序很重要時選用TreeMap,當元素不必以特定的順序進行存儲時,使用HashMap。Hashtable的使用不被推薦,因為HashMap提供了所有類似的功能,并且速度更快。當你需要在多線程環(huán)境下使用時,HashMap也可以轉(zhuǎn)換為同步的。 為什么要使用集合類當你事先不知道要存放數(shù)據(jù)的個數(shù),或者你需要一種比數(shù)組下標存取機制更靈活的方法時,你就需要用到集合類。 理解集合類集合類存放于java.util包中。 集合類存放的都是對象的引用,而非對象本身,出于表達上的便利,我們稱集合中的對象就是指集合中對象的引用(reference)。 集合類型主要有3種:set(集)、list(列表)和map(映射)。 (1)集 集(set)是最簡單的一種集合,它的對象不按特定方式排序,只是簡單的把對象加入集合中,就像往口袋里放東西。 對集中成員的訪問和操作是通過集中對象的引用進行的,所以集中不能有重復對象。 集也有多種變體,可以實現(xiàn)排序等功能,如TreeSet,它把對象添加到集中的操作將變?yōu)榘凑漳撤N比較規(guī)則將其插入到有序的對象序列中。它實現(xiàn)的是SortedSet接口,也就是加入了對象比較的方法。通過對集中的對象迭代,我們可以得到一個升序的對象集合。 (2)列表 列表的主要特征是其對象以線性方式存儲,沒有特定順序,只有一個開頭和一個結(jié)尾,當然,它與根本沒有順序的集是不同的。 列表在數(shù)據(jù)結(jié)構(gòu)中分別表現(xiàn)為:數(shù)組和向量、鏈表、堆棧、隊列。 關(guān)于實現(xiàn)列表的集合類,是我們?nèi)粘9ぷ髦薪?jīng)常用到的,將在后邊的筆記詳細介紹。 (3)映射 映射與集或列表有明顯區(qū)別,映射中每個項都是成對的。映射中存儲的每個對象都有一個相關(guān)的關(guān)鍵字(Key)對象,關(guān)鍵字決定了對象在映射中的存儲位置,檢索對象時必須提供相應(yīng)的關(guān)鍵字,就像在字典中查單詞一樣。關(guān)鍵字應(yīng)該是唯一的。 關(guān)鍵字本身并不能決定對象的存儲位置,它需要對過一種散列(hashing)技術(shù)來處理,產(chǎn)生一個被稱作散列碼(hash code)的整數(shù)值,散列碼通常用作一個偏置量,該偏置量是相對于分配給映射的內(nèi)存區(qū)域起始位置的,由此確定關(guān)鍵字/對象對的存儲位置。理想情況下,散列處理應(yīng)該產(chǎn)生給定范圍內(nèi)均勻分布的值,而且每個關(guān)鍵字應(yīng)得到不同的散列碼。 集合類簡介 java.util中共有13個類可用于管理集合對象,它們支持集、列表或映射等集合,以下是這些類的簡單介紹 集: HashSet: 使用HashMap的一個集的實現(xiàn)。雖然集定義成無序,但必須存在某種方法能相當高效地找到一個對象。使用一個HashMap對象實現(xiàn)集的存儲和檢索操作是在固定時間內(nèi)實現(xiàn)的. TreeSet: 在集中以升序?qū)ο笈判虻募膶崿F(xiàn)。這意味著從一個TreeSet對象獲得第一個迭代器將按升序提供對象。TreeSet類使用了一個TreeMap. 列表: Vector: 實現(xiàn)一個類似數(shù)組一樣的表,自動增加容量來容納你所需的元素。使用下標存儲和檢索對象就象在一個標準的數(shù)組中一樣。你也可以用一個迭代器從一個Vector中檢索對象。Vector是唯一的同步容器類??當兩個或多個線程同時訪問時也是性能良好的。(同步即同時只能一個進程訪問,其他等待) Stack: 這個類從Vector派生而來,并且增加了方法實現(xiàn)棧??一種后進先出的存儲結(jié)構(gòu)。 LinkedList: 實現(xiàn)一個鏈表。由這個類定義的鏈表也可以像?;蜿犃幸粯颖皇褂?。 ArrayList: 實現(xiàn)一個數(shù)組,它的規(guī)??勺儾⑶夷芟矜湵硪粯颖辉L問。它提供的功能類似Vector類但不同步。 映射: HashTable: 實現(xiàn)一個映象,所有的鍵必須非空。為了能高效的工作,定義鍵的類必須實現(xiàn)hashcode()方法和equal()方法。這個類是前面java實現(xiàn)的一個繼承,并且通常能在實現(xiàn)映象的其他類中更好的使用。 HashMap: 實現(xiàn)一個映象,允許存儲空對象,而且允許鍵是空(由于鍵必須是唯一的,當然只能有一個)。 WeakHashMap: 實現(xiàn)這樣一個映象:通常如果一個鍵對一個對象而言不再被引用,鍵/對象對將被舍棄。這與HashMap形成對照,映象中的鍵維持鍵/對象對的生命周期,盡管使用映象的程序不再有對鍵的引用,并且因此不能檢索對象。 TreeMap: 實現(xiàn)這樣一個映象,對象是按鍵升序排列的。 下圖是集合類所實現(xiàn)的接口之間的關(guān)系: Set和List都是由公共接口Collection擴展而來,所以它們都可以使用一個類型為Collection的變量來引用。這就意味著任何列表或集構(gòu)成的集合都可以用這種方式引用,只有映射類除外(但也不是完全排除在外,因為可以從映射獲得一個列表。)所以說,把一個列表或集傳遞給方法的標準途徑是使用Collection類型的參數(shù)。
List接口   List是有序的Collection,使用此接口能夠精確的控制每個元素插入的位置。用戶能夠使用索引(元素在List中的位置,類似于數(shù)組下標)來訪問List中的元素,這類似于Java的數(shù)組。 和下面要提到的Set不同,List允許有相同的元素。   除了具有Collection接口必備的iterator()方法外,List還提供一個listIterator()方法,返回一個ListIterator接口,和標準的Iterator接口相比,ListIterator多了一些add()之類的方法,允許添加,刪除,設(shè)定元素,還能向前或向后遍歷。   實現(xiàn)List接口的常用類有LinkedList,ArrayList,Vector和Stack。 ArrayList類   ArrayList實現(xiàn)了可變大小的數(shù)組。它允許所有元素,包括null。ArrayList沒有同步。 size,isEmpty,get,set方法運行時間為常數(shù)。但是add方法開銷為分攤的常數(shù),添加n個元素需要O(n)的時間。其他的方法運行時間為線性?! ∶總€ArrayList實例都有一個容量(Capacity),即用于存儲元素的數(shù)組的大小。這個容量可隨著不斷添加新元素而自動增加,但是增長算法并沒有定義。當需要插入大量元素時,在插入前可以調(diào)用ensureCapacity方法來增加ArrayList的容量以提高插入效率。   和LinkedList一樣,ArrayList也是非同步的(unsynchronized)。 Map接口   請注意,Map沒有繼承Collection接口,Map提供key到value的映射。一個Map中不能包含相同的key,每個key只能映射一個value。Map接口提供3種集合的視圖,Map的內(nèi)容可以被當作一組key集合,一組value集合,或者一組key-value映射。 HashMap類   HashMap和Hashtable類似,不同之處在于HashMap是非同步的,并且允許null,即null value和null key。,但是將HashMap視為Collection時(values()方法可返回Collection),其迭代子操作時間開銷和HashMap的容量成比例。因此,如果迭代操作的性能相當重要的話,不要將HashMap的初始化容量設(shè)得過高,或者load factor過低。 ---------------------------------------------------------------------------- 1. List是接口,List特性就是有序,會確保以一定的順序保存元素. ArrayList是它的實現(xiàn)類,是一個用數(shù)組實現(xiàn)的List. Map是接口,Map特性就是根據(jù)一個對象查找對象. HashMap是它的實現(xiàn)類,HashMap用hash表實現(xiàn)的Map,就是利用對象的hashcode(hashcode()是Object的方法)進行快速散列查找.(關(guān)于散列查找,可以參看<<數(shù)據(jù)結(jié)構(gòu)>>) 2. 一般情況下,如果沒有必要,推薦代碼只同List,Map接口打交道. 比如:List list = new ArrayList(); 這樣做的原因是list就相當于是一個泛型的實現(xiàn),如果想改變list的類型,只需要: List list = new LinkedList();//LinkedList也是List的實現(xiàn)類,也是ArrayList的兄弟類這樣,就不需要修改其它代碼,這就是接口編程的優(yōu)雅之處. 另外的例子就是,在類的方法中,如下聲明: private void doMyAction(List list){} 這樣這個方法能處理所有實現(xiàn)了List接口的類,一定程度上實現(xiàn)了泛型函數(shù). 3. 如果開發(fā)的時候覺得ArrayList,HashMap的性能不能滿足你的需要,可以通過實現(xiàn)List,Map(或者Collection)來定制你的自定義類

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多