前言:
**Java 自帶了各種 Map 類。這些 Map 類可歸爲三種類型:
- 通用Map,用於在應用程序中管理映射,通常在 java.util 程序包中實現
HashMap、Hashtable、Properties、LinkedHashMap、IdentityHashMap、TreeMap、WeakHashMap、ConcurrentHashMap - 專用Map,通常我們不必親自創建此類Map,而是通過某些其他類對其進行訪問
java.util.jar.Attributes、javax.print.attribute.standard.PrinterStateReasons、java.security.Provider、java.awt.RenderingHints、javax.swing.UIDefaults - 一個用於幫助我們實現自己的Map類的抽象類
AbstractMap**
HashMap的遍歷
public static void main(String[] args) {
HashMap<String,Integer> map = new HashMap<>();
map.put("zdj",1);
map.put("zdk",2);
Iterator<String> it = map.keySet().iterator();
while(it.hasNext()){
String key = it.next();
System.out.println(key + map.get(key));
}
System.out.println("---------------------");
Iterator<Map.Entry<String,Integer>>it2 = map.entrySet().iterator();
while(it2.hasNext()){
Map.Entry<String,Integer>entry = it2.next();
System.out.println(entry.getKey()+" "+entry.getValue());
}
System.out.println("---------------------");
for(Map.Entry<String,Integer> entry: map.entrySet()){
System.out.println(entry.getKey()+" "+entry.getValue());
}
System.out.println("---------------------");
for(String key : map.keySet())
System.out.println(key);
}
總結:
主要分爲for each 循環遍歷 和迭代器遍歷這兩種遍歷裏面有keySet 迭代和entrySet迭代兩種
迭代器遍歷效率比較高,entrySet遍歷效率高,迭代器的遍歷速度要比增強for循環快很多,是增強for循環的2倍左右。使用entrySet遍歷的速度要比keySet快很多,是keySet的1.5倍左右。
排序
HashMap是無法排序,只能用自己的map.entryset傳給list用ArrayList實現排序,
TreeMap是可以通過重寫比較器方法,自身按key值排序,不能按value排序,TreeMap底層是根據紅黑樹的數據結構構建的,默認是根據key的自然排序來組織(比如integer的大小,String的字典排序)。所以,TreeMap只能根據key來排序,是不能根據value來排序的(否則key來排序根本就不能形成TreeMap)。
如果非要按值排序就得利用ArrayList接一下,重新排序,
HashMap 按key排序:
Map<String,Integer>map = new HashMap<String,Integer>();
map.put("b",1);
map.put("a",4);
map.put("d",3);
map.put("c",2);
List<Map.Entry<String,Integer>>list = new ArrayList<Map.Entry<String, Integer>>(map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
return o1.getKey().compareTo(o2.getKey());
}
});
for(Map.Entry<String,Integer> entry :list) System.out.println(entry.getKey()+" "+entry.getValue());
a 4
b 1
c 2
d 3
Process finished with exit code 0
HashMap 按value排序:
Map<String,Integer>map = new HashMap<String,Integer>();
map.put("a",1);
map.put("b",4);
map.put("c",3);
map.put("d",2);
List<Map.Entry<String,Integer>>list = new ArrayList<Map.Entry<String, Integer>>(map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
return o1.getKey().compareTo(o2.getKey());
}
});
for(Map.Entry<String,Integer> entry :list) System.out.println(entry.getKey()+" "+entry.getValue());
b 1
c 2
d 3
a 4
Process finished with exit code 0
TreeMap 按key排序*(自身排序)
Map<String,Integer>map = new TreeMap<String,Integer>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
map.put("b",1);
map.put("a",4);
map.put("d",3);
map.put("c",2);
for(Map.Entry<String,Integer> entry :map.entrySet()) System.out.println(entry.getKey()+" "+entry.getValue());
a 4
b 1
c 2
d 3
Process finished with exit code 0
TreeMap的按值排序還是跟HashMap的一樣靠ArrayList實現的就不寫了;
HashMap的實現原理
HashMap是一個由數組和單鏈表組成的散列桶,