關(guān)于Map
Map,其實Map相當(dāng)于ArrayList或者更簡單的數(shù)組的一種擴(kuò)展、推廣资盅。在數(shù)組中我們可以利用下標(biāo)即數(shù)字訪問數(shù)組當(dāng)中的不同元素,那么數(shù)字與對象之間形成了一種關(guān)聯(lián)踊赠,那么如果將這個數(shù)字的概念擴(kuò)展成為對象呵扛,那同樣的我們可以將對象與對象之間關(guān)聯(lián)起來。即Map,也稱為映射表侦鹏、關(guān)聯(lián)數(shù)組、字典允許我們使用一個對象來查找某個對象。
1.如果我們在Map中嵌套了List或者M(jìn)ap那么我們向Map中put數(shù)據(jù)的時候要先new一個List或者M(jìn)ap
2.Map中的庫函數(shù)clear()解愤,即清空整個Map中的數(shù)據(jù)
3.在Map聲明時,我們用Map接口持有了HashMap的引用
關(guān)于Map接口的不同實現(xiàn)
Map接口的具體實現(xiàn)有三個HashMap褥蚯,TreeMap和LinkedHashMap(Map接口還有WeakHashMap酗捌、ConcurrentHashMap、IdentityHashMap等實現(xiàn)利诺,在多線程編程中會用到ConrrentHashMap富蓄,另外兩個轉(zhuǎn)為特殊問題設(shè)計不常用就暫不總結(jié)了):
- HashMap:Map基于散列表的實現(xiàn)(它取代了Hashtable)。插入和查詢鍵值對的開銷是固定的慢逾×⒈叮可以通過構(gòu)造器設(shè)置容量和負(fù)載因子灭红,以調(diào)整容器的性能。
- LinkedHashMap:類似于HashMap口注,但是迭代遍歷它時变擒,取得“鍵值對”的順序是其插入次序,或者是最近最少使用(LRU)的次序寝志。只比HashMap慢一點娇斑;而在迭代訪問時反而更快,因為它使用鏈表維護(hù)內(nèi)部次序材部。
- TreeMap:基于紅黑樹的實現(xiàn)毫缆。查看“鍵”或“鍵值樹”時,它們會被排序(次序由Comparable或Comparator決定)乐导。TreeMap的特點在于苦丁,所得到的結(jié)果是經(jīng)過排序的。TreeMap是唯一的帶有subMap()方法的Map物臂,它可以返回一個子樹旺拉。
- ConcurrentHashMap:一種線程安全的Map,它不涉及同步加鎖鹦聪。(以后自己在多線程編程方面有了總結(jié)再來討論)
EXp:
//: containers/Maps.java
// Things you can do with Maps.
import java.util.concurrent.;
import java.util.;
public class Maps {
public static void printKeys(Map<Integer, String> map) {
System.out.print("Size = " + map.size() + ", ");
System.out.print("Keys: ");
System.out.println(map.keySet()); // 產(chǎn)生一個鍵的集合
}
public static void test(Map<Integer, String> map) {
System.out.println(map.getClass().getSimpleName());
// 用來作為測試數(shù)據(jù)
Map<Integer, String> testData = new HashMap<Integer, String>();
testData.put(3, "A0");
testData.put(2, "B1");
testData.put(9, "A4");
testData.put(1, "C2");
testData.put(8, "D1");
map.putAll(testData);
// Map有Set的特性账阻,keys鍵值是不能重復(fù)的
map.putAll(testData);
printKeys(map);
// 產(chǎn)生值的一個集合
System.out.print("Values: ");
System.out.println(map.values());
System.out.println(map);
System.out.println("map.containsKey(11): " + map.containsKey(11));
System.out.println("map.get(11): " + map.get(11));
System.out.println("map.containsKey(9): " + map.containsKey(9));
System.out.println("map.get(9): " + map.get(9));
System.out.println("map.containsValue(\"F0\"): "
+ map.containsValue("F0"));
Integer key = map.keySet().iterator().next();
System.out.println("First key in map: " + key);
map.remove(key);
printKeys(map);
map.clear();
System.out.println("map.isEmpty(): " + map.isEmpty());
map.putAll(testData);
// Operations on the Set change the Map:
map.keySet().removeAll(map.keySet());
System.out.println("map.isEmpty(): " + map.isEmpty());
}
public static void main(String[] args) {
test(new HashMap<Integer, String>());
test(new TreeMap<Integer, String>());
test(new LinkedHashMap<Integer, String>());
test(new IdentityHashMap<Integer, String>());
test(new ConcurrentHashMap<Integer, String>());
test(new WeakHashMap<Integer, String>());
}
}/* Output:
HashMap
Size = 5, Keys: [1, 2, 3, 8, 9]
Values: [C2, B1, A0, D1, A4]
{1=C2, 2=B1, 3=A0, 8=D1, 9=A4}
map.containsKey(11): false
map.get(11): null
map.containsKey(9): true
map.get(9): A4
map.containsValue("F0"): false
First key in map: 1
Size = 4, Keys: [2, 3, 8, 9]
map.isEmpty(): true
map.isEmpty(): true
TreeMap
Size = 5, Keys: [1, 2, 3, 8, 9]
Values: [C2, B1, A0, D1, A4]
{1=C2, 2=B1, 3=A0, 8=D1, 9=A4}
map.containsKey(11): false
map.get(11): null
map.containsKey(9): true
map.get(9): A4
map.containsValue("F0"): false
First key in map: 1
Size = 4, Keys: [2, 3, 8, 9]
map.isEmpty(): true
map.isEmpty(): true
LinkedHashMap
Size = 5, Keys: [1, 2, 3, 8, 9]
Values: [C2, B1, A0, D1, A4]
{1=C2, 2=B1, 3=A0, 8=D1, 9=A4}
map.containsKey(11): false
map.get(11): null
map.containsKey(9): true
map.get(9): A4
map.containsValue("F0"): false
First key in map: 1
Size = 4, Keys: [2, 3, 8, 9]
map.isEmpty(): true
map.isEmpty(): true
IdentityHashMap
Size = 5, Keys: [2, 9, 8, 3, 1]
Values: [B1, A4, D1, A0, C2]
{2=B1, 9=A4, 8=D1, 3=A0, 1=C2}
map.containsKey(11): false
map.get(11): null
map.containsKey(9): true
map.get(9): A4
map.containsValue("F0"): false
First key in map: 2
Size = 4, Keys: [9, 8, 3, 1]
map.isEmpty(): true
map.isEmpty(): true
ConcurrentHashMap
Size = 5, Keys: [8, 2, 9, 1, 3]
Values: [D1, B1, A4, C2, A0]
{8=D1, 2=B1, 9=A4, 1=C2, 3=A0}
map.containsKey(11): false
map.get(11): null
map.containsKey(9): true
map.get(9): A4
map.containsValue("F0"): false
First key in map: 8
Size = 4, Keys: [2, 9, 1, 3]
map.isEmpty(): true
map.isEmpty(): true
WeakHashMap
Size = 5, Keys: [9, 8, 3, 2, 1]
Values: [A4, D1, A0, B1, C2]
{9=A4, 8=D1, 3=A0, 2=B1, 1=C2}
map.containsKey(11): false
map.get(11): null
map.containsKey(9): true
map.get(9): A4
map.containsValue("F0"): false
First key in map: 9
Size = 4, Keys: [8, 3, 2, 1]
map.isEmpty(): true
map.isEmpty(): true
*///:~
Comparable接口
1)什么是Comarable接口
Comparable是一個接口,它包含一個compareTo()方法用于比較兩個對象之間的大小關(guān)系(這里用大小有點不恰當(dāng)泽本,可能用前后關(guān)系更確切些)淘太,這個函數(shù)的規(guī)則是如果兩個對象相等則返回0,而如果不相等則要看是從大到小排序還是從小到大排序來分规丽,簡單的說就是小于返回-1蒲牧,大于返回1。具體看代碼示例一下就明白了赌莺。
2)為什么要使用Comarable接口
相信學(xué)習(xí)過C語言的朋友都會知道函數(shù)指針的一個概念冰抢,當(dāng)我們在寫一個對數(shù)組進(jìn)行排序的函數(shù)的時候,將數(shù)組傳入的同時艘狭,我們可以傳入一個函數(shù)指針挎扰,讓排序結(jié)果按照我們期望的來,比如或者從大到小或者從小到大巢音。
同樣的TreeMap底層是使用紅黑樹實現(xiàn)的遵倦,那么它要將Map按照Key的值進(jìn)行排序,那么排序的規(guī)則就要由實現(xiàn)Comarable接口中的compareTo函數(shù)提供官撼。