1.ArrayList和LinkedList
(1)ArrayList是實現了基于動態數組的數據結構,LinkedList基于鏈表的數據結構。?
(2)對于隨機訪問get和set,ArrayList絕對優于LinkedList,因為LinkedList要移動指針。?
(3)對于新增和刪除操作add和remove,LinedList比較占優勢,因為ArrayList要移動數據。?
這一點要看實際情況的。若只對單條數據插入或刪除,ArrayList的速度反而優于LinkedList。但若是批量隨機的插入刪除數據,LinkedList的速度大大優于ArrayList. 因為ArrayList每插入一條數據,要移動插入點及之后的所有數據。
2.HashTable與HashMap
相同點:
(1)都實現了Map、Cloneable、java.io.Serializable接口。
(2)都是存儲"鍵值對(key-value)"的散列表,而且都是采用拉鏈法實現的。
不同點:
(1)歷史原因:HashTable是基于陳舊的Dictionary類的,HashMap是Java 1.2引進的Map接口的一個實現 。
(2)同步性:HashTable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的 。
(3)對null值的處理:HashMap的key、value都可為null,HashTable的key、value都不可為null 。
(4)基類不同:HashMap繼承于AbstractMap,而Hashtable繼承于Dictionary。
????? Dictionary是一個抽象類,它直接繼承于Object類,沒有實現任何接口。Dictionary類是JDK 1.0的引入的。雖然Dictionary也支持“添加key-value鍵值對”、“獲取value”、“獲取大小”等基本操作,但它的API函數比Map少;而且Dictionary一般是通過Enumeration(枚舉類)去遍歷,Map則是通過Iterator(迭代M器)去遍歷。 然而由于Hashtable也實現了Map接口,所以,它即支持Enumeration遍歷,也支持Iterator遍歷。
????? AbstractMap是一個抽象類,它實現了Map接口的絕大部分API函數;為Map的具體實現類提供了極大的便利。它是JDK 1.2新增的類。
???
(5)支持的遍歷種類不同:HashMap只支持Iterator(迭代器)遍歷。而Hashtable支持Iterator(迭代器)和Enumeration(枚舉器)兩種方式遍歷。
3.HashMap、Hashtable、LinkedHashMap和TreeMap比較
???? Hashmap 是一個最常用的Map,它根據鍵的HashCode 值存儲數據,根據鍵可以直接獲取它的值,具有很快的訪問速度。遍歷時,取得數據的順序是完全隨機的。HashMap最多只允許一條記錄的鍵為Null;允許多條記錄的值為Null;HashMap不支持線程的同步,即任一時刻可以有多個線程同時寫HashMap;可能會導致數據的不一致。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力。
???? Hashtable 與 HashMap類似,不同的是:它不允許記錄的鍵或者值為空;它支持線程的同步,即任一時刻只有一個線程能寫Hashtable,因此也導致了Hashtale在寫入時會比較慢。
???? LinkedHashMap保存了記錄的插入順序,在用Iterator遍歷LinkedHashMap時,先得到的記錄肯定是先插入的,也可以在構造時用帶參數,按照應用次數排序。在遍歷的時候會比HashMap慢,不過有種情況例外,當HashMap容量很大,實際數據較少時,遍歷起來可能會比LinkedHashMap慢,因為LinkedHashMap的遍歷速度只和實際數據有關,和容量無關,而HashMap的遍歷速度和他的容量有關。如果需要輸出的順序和輸入的相同,那么用LinkedHashMap可以實現,它還可以按讀取順序來排列,像連接池中可以應用。LinkedHashMap實現與HashMap的不同之處在于,后者維護著一個運行于所有條目的雙重鏈表。此鏈接列表定義了迭代順序,該迭代順序可以是插入順序或者是訪問順序。對于LinkedHashMap而言,它繼承與HashMap、底層使用哈希表與雙向鏈表來保存所有元素。其基本操作與父類HashMap相似,它通過重寫父類相關的方法,來實現自己的鏈接列表特性。
???? TreeMap實現SortMap接口,內部實現是紅黑樹。能夠把它保存的記錄根據鍵排序,默認是按鍵值的升序排序,也可以指定排序的比較器,當用Iterator 遍歷TreeMap時,得到的記錄是排過序的。TreeMap不允許key的值為null。非同步的。?
???? 一般情況下,我們用的最多的是HashMap,HashMap里面存入的鍵值對在取出的時候是隨機的,它根據鍵的HashCode值存儲數據,根據鍵可以直接獲取它的值,具有很快的訪問速度。在Map 中插入、刪除和定位元素,HashMap 是最好的選擇。
???? TreeMap取出來的是排序后的鍵值對。但如果您要按自然順序或自定義順序遍歷鍵,那么TreeMap會更好。
???? LinkedHashMap 是HashMap的一個子類,如果需要輸出的順序和輸入的相同,那么用LinkedHashMap可以實現,它還可以按讀取順序來排列,像連接池中可以應用。?
import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.TreeMap;public class MapTest {public static void main(String[] args) {//HashMapHashMap<String,String> hashMap = new HashMap();hashMap.put("4", "d");hashMap.put("3", "c");hashMap.put("2", "b");hashMap.put("1", "a");Iterator<String> iteratorHashMap = hashMap.keySet().iterator();System.out.println("HashMap-->");while (iteratorHashMap.hasNext()){Object key1 = iteratorHashMap.next();System.out.println(key1 + "--" + hashMap.get(key1));}//LinkedHashMapLinkedHashMap<String,String> linkedHashMap = new LinkedHashMap();linkedHashMap.put("4", "d");linkedHashMap.put("3", "c");linkedHashMap.put("2", "b");linkedHashMap.put("1", "a");Iterator<String> iteratorLinkedHashMap = linkedHashMap.keySet().iterator();System.out.println("LinkedHashMap-->");while (iteratorLinkedHashMap.hasNext()){Object key2 = iteratorLinkedHashMap.next();System.out.println(key2 + "--" + linkedHashMap.get(key2));}//TreeMapTreeMap<String,String> treeMap = new TreeMap();treeMap.put("4", "d");treeMap.put("3", "c");treeMap.put("2", "b");treeMap.put("1", "a");Iterator<String> iteratorTreeMap = treeMap.keySet().iterator();System.out.println("TreeMap-->");while (iteratorTreeMap.hasNext()){Object key3 = iteratorTreeMap.next();System.out.println(key3 + "--" + treeMap.get(key3));}}}
輸出結果:
HashMap--> 3--c 2--b 1--a 4--d LinkedHashMap--> 4--d 3--c 2--b 1--a TreeMap--> 1--a 2--b 3--c 4--d