Map 是一種把鍵對(duì)象和值對(duì)象進(jìn)行關(guān)聯(lián)的容器羡滑, 而一個(gè)值對(duì)象又可以是一個(gè)Map, 依次類推菇爪,這樣就可形成一個(gè)多級(jí)映射算芯。
想想學(xué)習(xí)英語(yǔ)使用的詞典軟件,輸入英文(key)后凳宙,軟件會(huì)顯示出對(duì)應(yīng)的中文(value)熙揍。Map就是在內(nèi)存中的這種結(jié)構(gòu)。
Key(鍵):
- 和 set— 樣氏涩,鍵對(duì)象不允許重復(fù)届囚,這是為了保持查找結(jié)果的一致性。 如果有兩個(gè)鍵對(duì)象一樣是尖, 那你想得到那個(gè)鍵對(duì)象所對(duì)應(yīng)的值對(duì)象時(shí)就有問(wèn)題了意系。
- 在使用過(guò)程中某個(gè)鍵所對(duì)應(yīng)的值對(duì)象可能會(huì)發(fā)生變化, 這時(shí)會(huì)按照最后一次修改的值對(duì)象與鍵對(duì)應(yīng)(就是key同一個(gè)key有多次值綁定析砸,最后一個(gè)就會(huì)覆蓋之前的)
- 可以使用 null 作為 Key
Value(值):
- 值對(duì)象沒(méi)有唯一性的要求昔字, 你可以將任意多個(gè)鍵都映射到一個(gè)值對(duì)象上, 這不會(huì)發(fā)生任何問(wèn)題( 不過(guò)對(duì)使用卻可能會(huì)造成不便首繁, 你不知道你得到的到底是那一個(gè)鍵所對(duì)應(yīng)的值對(duì)象作郭,所以請(qǐng)不要這樣做)
- 可以使用 null 作為 Value
Map 有兩種比較常用的實(shí)現(xiàn): HashMap 和 TreeMap
常用的方法
方法名 | 說(shuō)明 |
---|---|
put(key , value) | 儲(chǔ)存數(shù)據(jù) |
get(key) | 通過(guò)key得到值 |
remove(key) | 通過(guò)key刪除對(duì)應(yīng)的值(key當(dāng)然也會(huì)刪除) |
entrySet() | 獲取Map所有的Key,返回一個(gè)Set集合 |
values() | 獲取Map所有的value弦疮,返回一個(gè)List 集合 |
containsKey(key) | 判斷Map中是否有輸入的參數(shù):key |
containsValue(value) | 判斷Map中是否有輸入的參數(shù):value |
size() | 判斷Map中數(shù)據(jù)的總數(shù) |
clear() | 清空Map中所有的數(shù)據(jù) |
isEmpty() | 判斷Map中是否有數(shù)據(jù) |
HashMap
HashMap 用到了哈希碼的算法夹攒, 以便快速查找一個(gè)鍵。
public static void main(String[] args) {
HashMap<String, String> zsInfo = new HashMap<>();
zsInfo.put("name", "張三");
zsInfo.put("height", "173CM");
zsInfo.put("sex", "男性");
for (Map.Entry<String, String> info : zsInfo.entrySet()) {
System.out.println( info );
}
}
負(fù)載因子胁塞,當(dāng)容量使用到75%時(shí)咏尝,觸發(fā)擴(kuò)容的操作
DEFAULT_LOAD_FACTOR = 0.75 負(fù)載因子 = 0.75
DEFAULT_INITIAL_CAPACITY = 16 默認(rèn)的初始化容量=16,必須是2的整數(shù)次冪啸罢,原因是便于Hash運(yùn)算编检,提高效率
TREEIFY_THRESHOLD = 8 樹化_閾值 = 8 當(dāng)長(zhǎng)度大于8時(shí),鏈表的查詢會(huì)變慢扰才,優(yōu)化為樹
TreeMap
TreeMap 是對(duì)鍵按序存放允懂, 因此它便有一些擴(kuò)展的方法, 比如 firstKey() 衩匣、lastKey() 等蕾总, 可以從TreeMap 中指定一個(gè)范圍以取得其子Map
public static void main(String[] args) {
TreeMap<String, String> tree = new TreeMap<>();
tree.put("name", "Jack");
tree.put("age", "22");
tree.put("身高", "173");
tree.put("sex", "man");
tree.put("體重", "70KG");
System.out.println("-------------------");
for (Map.Entry<String, String> entry : tree.entrySet()) {
System.out.println( entry );
}
System.out.println("-------------------");
System.out.println("firstKey = "+ tree.firstKey());
System.out.println("firstEntry = "+ tree.firstEntry());
System.out.println("lastKey = "+ tree.lastKey());
System.out.println("lastEntry = "+ tree.lastEntry());
}
樹:紅黑樹
性質(zhì)1. 結(jié)點(diǎn)是紅色或黑色。
性質(zhì)2. 根結(jié)點(diǎn)是黑色琅捏。
性質(zhì)3. 所有葉子都是黑色生百。(葉子是NIL結(jié)點(diǎn))
性質(zhì)4. 每個(gè)紅色結(jié)點(diǎn)的兩個(gè)子結(jié)點(diǎn)都是黑色。(從每個(gè)葉子到根的所有路徑上不能有兩個(gè)連續(xù)的紅色結(jié)點(diǎn))
性質(zhì)5. 從任一節(jié)結(jié)點(diǎn)其每個(gè)葉子的所有路徑都包含相同數(shù)目的黑色結(jié)點(diǎn)柄延。