1. 程式人生 > >【Java集合之Map】HashMap、HashTable、TreeMap、LinkedHashMap區別

【Java集合之Map】HashMap、HashTable、TreeMap、LinkedHashMap區別

前言

Java為資料結構中的對映定義了一個介面java.util.Map,它有四個實現類,分別是HashMap、HashTable、LinkedHashMap和TreeMap。本節例項主要介紹這4中例項的用法和區別

幾種Map類結構

public class Hashtable extends Dictionary implements Map, Cloneable, Serializable

public class HashMap extends AbstractMap implements Map, Cloneable, Serializable

public class LinkedHashMap
extends HashMap implements Map public class TreeMap extends AbstractMap implements SortedMap, NavigableMap, Cloneable, Serializable public interface SortedMap extends Map

接下來詳細測試一下

測試

/**
 * @描述:Map測試
 * @作者:CYH
 * @版本:V1.0
 * @建立時間::2016-12-20
 */
public class MapTest {

    public static void main
(String[] args) { Map<Integer, String> hashMap = new HashMap<Integer, String>(); System.out.println("插入HashMap-key順序:"); for(int i=0; i<10; i++){ Random random = new Random(); int rs = random.nextInt(1000); hashMap.put(rs, "v*"
+rs); System.out.println(rs); } System.out.println("HashMap集合輸出:"+hashMap); Map<Integer, String> treeMap = new TreeMap<Integer, String>(); System.out.println("插入TreeMap-key順序:"); for(int i=0; i<10; i++){ Random random = new Random(); int rs = random.nextInt(1000); treeMap.put(rs, "v*"+rs); System.out.println(rs); } System.out.println("TreeMap集合輸出:"+treeMap); Map<Integer, String> linkedHashMap = new LinkedHashMap<Integer, String>(); System.out.println("插入LinkedHashMap-key順序:"); for(int i=0; i<10; i++){ Random random = new Random(); int rs = random.nextInt(1000); linkedHashMap.put(rs, "v*"+rs); System.out.println(rs); } System.out.println("LinkedHashMap集合輸出:"+linkedHashMap); } }

測試結果:

插入HashMap-key順序:
531
122
279
232
644
525
131
991
374
68
HashMap集合輸出:{68=v*68, 374=v*374, 279=v*279, 991=v*991, 531=v*531, 232=v*232, 525=v*525, 644=v*644, 131=v*131, 122=v*122}
插入TreeMap-key順序:
729
844
297
424
445
286
371
883
453
707
TreeMap集合輸出:{286=v*286, 297=v*297, 371=v*371, 424=v*424, 445=v*445, 453=v*453, 707=v*707, 729=v*729, 844=v*844, 883=v*883}
插入LinkedHashMap-key順序:
152
530
997
772
484
810
18
478
837
951
LinkedHashMap集合輸出:{152=v*152, 530=v*530, 997=v*997, 772=v*772, 484=v*484, 810=v*810, 18=v*18, 478=v*478, 837=v*837, 951=v*951}

總結

共同點

HashMap,LinkedHashMap,TreeMap都屬於Map;Map 主要用於儲存鍵(key)值(value)對,根據鍵得到值,因此鍵不允許鍵重複,但允許值重複。

不同點

1、HashMap鍵無序,它根據鍵的HashCode值儲存資料,根據鍵可以直接獲取它的值,具有很快的訪問速度,在Map 中插入、刪除和定位元素,HashMap 是最好的選擇;
2、LinkedHashMap 是HashMap的一個子類,鍵儲存了插入的順序,使用Iterator遍歷時,得到的也是插入順序的記錄;
3、TreeMap預設按鍵的升序排序,可以定製。
4、HashTable 執行緒安全,鍵不能為null,與HashMap類似,但效率較低,HashMap如果需要實現同步,可以使用Collections. synchronizedMap或ConcurrentHashMap 。