聊聊java的Map

關(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)

Paste_Image.png

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ù)提供官撼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末梧躺,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子傲绣,更是在濱河造成了極大的恐慌掠哥,老刑警劉巖巩踏,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異续搀,居然都是意外死亡塞琼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門目代,熙熙樓的掌柜王于貴愁眉苦臉地迎上來屈梁,“玉大人,你說我怎么就攤上這事榛了≡谘龋” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵霜大,是天一觀的道長构哺。 經(jīng)常有香客問我,道長战坤,這世上最難降的妖魔是什么曙强? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮途茫,結(jié)果婚禮上碟嘴,老公的妹妹穿的比我還像新娘。我一直安慰自己囊卜,他們只是感情好娜扇,可當(dāng)我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著栅组,像睡著了一般雀瓢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上玉掸,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天刃麸,我揣著相機(jī)與錄音司浪,去河邊找鬼。 笑死啊易,一個胖子當(dāng)著我的面吹牛脱吱,可吹牛的內(nèi)容都是我干的认罩。 我是一名探鬼主播续捂,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼宦搬,長吁一口氣:“原來是場噩夢啊……” “哼劫拗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起页慷,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤憔足,失蹤者是張志新(化名)和其女友劉穎酒繁,沒想到半個月后滓彰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡州袒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年揭绑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片郎哭。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡他匪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出夸研,到底是詐尸還是另有隱情邦蜜,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布亥至,位于F島的核電站悼沈,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏抬闯。R本人自食惡果不足惜井辆,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望溶握。 院中可真熱鬧杯缺,春花似錦、人聲如沸睡榆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胀屿。三九已至塘揣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間宿崭,已是汗流浹背亲铡。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人奖蔓。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓赞草,卻偏偏與公主長得像,于是被迫代替她去往敵國和親吆鹤。 傳聞我的和親對象是個殘疾皇子厨疙,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容