【轉】java 容器類使用 Collection,Map,HashMap,hashTable,TreeMap,List,Vector,ArrayList的區別

來源:互聯網
上載者:User

標籤:

原文網址:http://www.360doc.com/content/15/0427/22/1709014_466468021.shtml

java 容器類使用 Collection,Map,HashMap,hashTable,TreeMap,List,Vector,ArrayList的區別、 

 

  
經常會看到程式中使用了記錄集,常用的有Collection、HashMap、HashSet、ArrayList,因為分不清楚它們之間的關係,所以在使用時經常會混淆,以至於不知道從何下手。在這兒作了一個小例子,希望有助於幫大家理順思路。
首先看一下它們的關係:
Collection
--List:-----------------------以特定次序儲存元素。所以取出來的順序可能和放入順序不同。
      ---ArrayList
      ---LinkedList
      ---Vector
--Set :----------------------- 不含有重複的元素
      --- HashSet
      --- TreeSet
Map
      ---HashMap
      ---HashTable
      ---TreeMap
補充:
   List,Set,Map將存入的資料一律視為Object類型。
   Collection、List、Set、Map都是介面,不能執行個體化。繼承自它們的 ArrayList, Vector, HashTable,HashMap是具象class,這些才可被執行個體化。
   vector不進行邊界檢查。
   接下來看一下具體的執行個體:
Collection
   定義一個Collection對象,指向其子類一個新建立的執行個體:
   Collection c = new ArrayList()此即所謂的"父類引用指向子類對象",後面只要使用c即可代表新建立的ArrayList。接下來給它賦值。
       c.add("06S030014");
       c.add("hit");
       c.add("cs");
       c.add("wh");
   然後如何取出來哪,實現了Collection介面的子類都有一個iterator()方法,通過調用該方法可以返回Iterator類型的一個對象,使用該對象即可取出所要的值。代碼如下:
   Iterator it=c.iterator()
   String s = (String)it.next();
這隻是取出其中的一條資料,要想把所有的都取出來,可以用迴圈
      for(Iterator it=c.iterator();it.hasNext();){
             String s = (String)it.next();
      }

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

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

Collection介面,包含list和set子介面 
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是唯一的同步容器類??當兩個或多個線程同時訪問時也是效能良好的。 
Stsck: 這個類從Vector派生而來,並且增加了方法實現棧??一種後進先出的儲存結構。 
LinkedList: 實現一個鏈表。由這個類定義的鏈表也可以像棧或隊列一樣被使用。 
ArrayList: 實現一個數組,它的規模可變並且能像鏈表一樣被訪問。它提供的功能類似Vector類但不同步。 
映射: 
HashTable:
 實現一個映象,所有的鍵必須非空。為了能高效的工作,定義鍵的類必須實現hashcode()方法和equal()方法。這個類是前面java實現的一個繼承,並且通常能在實現映象的其他類中更好的使用。 
HashMap: 實現一個映象,允許儲存Null 物件,而且允許鍵是空(由於鍵必須是唯一的,當然只能有一個)。 
WeakHashMap: 實現這樣一個映象:通常如果一個鍵對一個對象而言不再被引用,鍵/對象對將被捨棄。這與HashMap形成對照,映象中的鍵維持鍵/對象對的生命週期,儘管使用映象的程式不再有對鍵的引用,並且因此不能檢索對象。 
TreeMap: 實現這樣一個映象,對象是按鍵升序排列的。

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

 

Java容器類Collection、List、ArrayList、Vector及map、HashTable、HashMap區別 2009-02-21 19:45 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: 實現一個映象,允許儲存Null 物件,而且允許鍵是空(由於鍵必須是唯一的,當然只能有一個)。 WeakHashMap: 實現這樣一個映象:通常如果一個鍵對一個對象而言不再被引用,鍵/對象對將被捨棄。這與HashMap形成對照,映象中的鍵維持鍵/對象對的生命週期,儘管使用映象的程式不再有對鍵的引用,並且因此不能檢索對象。 TreeMap: 實現這樣一個映象,對象是按鍵升序排列的。 是集合類所實現的介面之間的關係: Set和List都是由公用介面Collection擴充而來,所以它們都可以使用一個類型為Collection的變數來引用。這就意味著任何列表或集構成的集合都可以用這種方式引用,只有映射類除外(但也不是完全排除在外,因為可以從映射獲得一個列表。)所以說,把一個列表或集傳遞給方法的標準途徑是使用Collection類型的參數。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)來定製你的自訂類

【轉】java 容器類使用 Collection,Map,HashMap,hashTable,TreeMap,List,Vector,ArrayList的區別

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.