java為數據結構中的映射定義了一個接口java.util.Map,他實現了四個類,分別是:HashMap,HashTable,LinkedHash,MapTreeMap
Map不允許鍵重復,但允許值重復
1.HashMap:
最常用的Map,根據鍵的hashcode值來存儲數據,根據鍵可以直接獲得他的值(因為相同的鍵hashcode值相同,在地址為hashcode值的地方存儲的就是值,所以根據鍵可以直接獲得值),具有很快的訪問速度,遍歷時,取得數據的順序完全是隨機的,HashMap最多只允許一條記錄的鍵為null,允許多條記錄的值為null,HashMap不支持線程同步,即任意時刻可以有多個線程同時寫HashMap,這樣對導致數據不一致,如果需要同步,可以使用synchronziedMap的方法使得HashMap具有同步的能力或者使用concurrentHashMap
2.HashTable:
與HashMap類似,不同的是,它不允許記錄的鍵或值為空,支持線程同步,即任意時刻只能有一個線程寫HashTable,因此也導致HashTable在寫入時比較慢!
3.LinkedHashMap:
是HahsMap的一個子類,但它保持了記錄的插入順序,遍歷時先得到的肯定是先插入的,也可以在構造時帶參數,按照應用次數排序,在遍歷時會比HahsMap慢,不過有個例外,當HashMap的容量很大,實際數據少時,遍歷起來會比LinkedHashMap慢(因為它是鏈啊),因為HashMap的遍歷速度和它容量有關,LinkedHashMap遍歷速度只與數據多少有關
4.TreeMap:
實現了sortMap接口,能夠把保存的記錄按照鍵排序(默認升序),也可以指定排序比較器,遍歷時得到的數據是排過序的,TreeMap底層是紅黑樹
package zhengze; import java.util.*; public class mapTest { public static void main(String[] args) { Map<Integer, Integer> linkedHashMap = new LinkedHashMap<>(); linkedHashMap.put(1,2); linkedHashMap.put(3,4); linkedHashMap.put(4,5); linkedHashMap.put(2,3); for(var m: linkedHashMap.entrySet() ) { System.out.println(m.getKey()+" "+m.getValue()); } Map<Integer, Integer> HashMap = new HashMap<>(); HashMap.put(1,2); HashMap.put(3,4); HashMap.put(4,5); HashMap.put(2,3); System.out.println("hashMap"); for(var m: HashMap.entrySet() ) { System.out.println(m.getKey()+" "+m.getValue()); } Map<Integer, Integer> treeMap = new TreeMap<>((a,b)->b-a); treeMap.put(1,2); treeMap.put(3,4); treeMap.put(4,5); treeMap.put(2,3); System.out.println("treeMap"); for(var m: treeMap.entrySet() ) { System.out.println(m.getKey()+" "+m.getValue()); } } }
什么情況用什么類型的Map:
在Map中插入,刪除,定位元素:HashMap
要按照自定義順序或自然順序遍歷:TreeMap
要求輸入順序和輸出順序相同:LinkedHashMap