I學霸官方免費教程三十三:Java集合架構之Map集合

來源:互聯網
上載者:User

標籤:java集合架構   map集合   hashmap類   treemap類   properties類   java免費教程   

Map介面

Map集合採用索引值對(key-value)的方式儲存資料,其中鍵不可以重複、值可以重複。
常用類有HashMap、TreeMap和Properties

HashMap類

假如,現在我有一個集合,集合中儲存著一批WiFi的名稱和密碼,現在要求通過名稱快速找到密碼。這樣的需求使用List集合實現起來非常困難,Java為我們提供了另一種形式的集合,可以很好的解決這樣的問題。就是Map集合。

執行個體:package map.hashMap;import java.util.HashMap;import java.util.Map;/** * 示範HashSet * @author 學霸聯盟 - 趙燦 */public class HashMapDemo {public static void main(String[] args) {//建立集合對象Map map = new HashMap();/* * 注意:map集合添加元素的方法是put,不是add * 前一個參數代表key(鍵),後一個參數代表value(值) */map.put("wifiName1", "password1");/* * 當出現key重複時,後面的值會將前面的值覆蓋 * 而value重複時,無影響 */map.put("wifiName2", "password2");map.put("wifiName2", "password3");map.put("wifiName3", "password3");//擷取集合的長度,加入4次,長度為3int size = map.size();System.out.println(size);//擷取key為"wifiName2"的valueString wifi2 = (String)map.get("wifiName2");System.out.println(wifi2);//兩種方式轉換成String都可以String wifi3 = map.get("wifiName3").toString();System.out.println(wifi3);}}運行結果:3password3password3


注意:Set集合會將加入的元素儲存在Map集合的key上,如果出現重複不會覆蓋,保留前一個;但是Map集合中加入元素出現key相同的情況時,key不會覆蓋,但是value會被後加入的value覆蓋。

上面我們講到向Set集合中添加元素時,會建立Node(節點),在節點的key中保持著當前加入的元素。在該節點中還有一個value屬性,同樣儲存一個Object對象,只不過Set中沒有使用這個value屬性。而Map集合中需要儲存兩個值key和value,其中我們調用put方法時傳入的第一個參數儲存在Node對象的屬性key上,傳入的第二個參數就是儲存在Node對象的屬性value上。
由此一來,在使用key擷取Map集合中對應的value時,先通過在hash表中找到key所在的Node對象,然後就返回Node對象中value的值,這樣就得到了key所對應的value值了。

Map集合一些常用方法的示範

執行個體:package map.hashMap;import java.util.Collection;import java.util.HashMap;import java.util.Set;/** * 示範HashMap類中的一些常用方法 * @author 學霸聯盟 - 趙燦 */public class HashMapMethodDemo {public static void main(String[] args) {//建立兩個班級class1和class2HashMap class1 = new HashMap();HashMap class2 = new HashMap();/* * 向兩個班級中各添加三個學生和成績 * 1班中有個叫“王五”的同學,成績是50分 * 2班中也有個叫“王五”的同學,成績是90分 */class1.put("張三", "80分");class1.put("李四", "60分");class1.put("王五", "50分");class2.put("趙四", "80分");class2.put("陳六", "0分");class2.put("王五", "90分");//判斷1班有沒有姓名叫“王五”的同學boolean containsKey = class1.containsKey("王五");System.out.println("集合class1中有沒有key是王五:" + containsKey);System.out.println("-------------------------------------");//判斷1班有沒有成績是90分的同學boolean containsValue = class1.containsValue("90分");System.out.println("集合class1中有沒有value是90分:" + containsValue);System.out.println("-------------------------------------");//將2班同學合并到一班class1.putAll(class2);//擷取班級人數(集合長度)int size = class1.size();System.out.println("合并後的班級總人數:" + size);System.out.println("-------------------------------------");//擷取1班所有同學的姓名Set nameSet = class1.keySet();//增強for迴圈輸出所有姓名for (Object o : nameSet) {System.out.print(o + "  ");}System.out.println();System.out.println("-------------------------------------");//擷取1班所有同學的成績Collection scores = class1.values();//增強for迴圈輸出所有成績for (Object o : scores) {System.out.print(o + "  ");}System.out.println();System.out.println("-------------------------------------");//擷取1班所有同學的姓名和成績Set nameAndScoreSet = class1.entrySet();//增強for迴圈輸出所有成績for (Object o : nameAndScoreSet) {System.out.print(o + "  ");}System.out.println();System.out.println("-------------------------------------");//擷取王五的成績Object wangwuScore = class1.get("王五");System.out.println("合并後王五的成績:" + wangwuScore);System.out.println("-------------------------------------");//刪除key為“王五”的valueclass1.remove("王五");//刪除“王五”後System.out.println("王五的成績:" + class1.get("王五"));System.out.println("是否包含叫“王五”的key:" + class1.containsKey("王五"));System.out.println("是否包含“90分”的value:" + class1.containsValue("90分"));System.out.println("-------------------------------------");//替換陳六的成績class1.replace("陳六", "59分");System.out.println("替換後陳六的成績:" + class1.get("陳六"));System.out.println("-------------------------------------");//清空集合class1.clear();//判斷集合是否為空白System.out.println("用clear方法清除後集合是否為空白:" + class1.isEmpty());}}


總結:

Map以索引值對的結構儲存;
key出現重複時,新加入的key不會覆蓋原key,但新加入的value會覆蓋原key對應的value
key和value都可以使用null

特殊說明:其實Set集合就是將元素儲存到Map的鍵上。建立HashSet對象A時,會底層會建立一個HashMap的對象map,當想Set集合A中添加元素時(A.add("abc")),此時會調用map.put("abc", obj);
所以Set的實現方式就是Map中key的實現方式(數組 + 單項鏈表),由於元素儲存數組的下標由特定的hash演算法獲得,所以也稱為散列儲存

以下是HashSet中的源碼//建立HashSet對象是會在底層建立一個HashMap對象public HashSet() {map = new HashMap<>();}//向Set集合中添加元素時,底層是將添加的元素添加到map集合的key上public boolean add(E e) {return map.put(e, PRESENT)==null;}


TreeMap類

由名稱可知,其key和TreeSet一樣;其他屬性同HashMap。所以這裡不再詳細講述。

執行個體:package map.treeMap;import java.util.Set;import java.util.TreeMap;/** * 示範TreeSet集合 * @author 學霸聯盟 - 趙燦 */public class TreeMapDemo {public static void main(String[] args) {//建立三個樹枝對象Branch b1 = new Branch(10);Branch b2 = new Branch(5);Branch b3 = new Branch(8);//建立TreeMap對象TreeMap tm = new TreeMap();tm.put(b1, "樹枝10");tm.put(b2, "樹枝5");tm.put(b3, "樹枝8");//擷取TreeMap中包含所有的key的集合Set ts = tm.keySet();//迴圈輸出keyfor(Object o : ts){Branch b = (Branch)o;//輸出年輪System.out.print("年輪:" + b.getAnnualRing());//根據有序的key,擷取有序的valueSystem.out.println("  對應的value:" + tm.get(b));}}}/** * 樹枝類Branch * 加入TreeSet集合的元素類型必須實現Comparable介面 * 否則程式啟動並執行時候會出現異常 * @author 學霸聯盟 - 趙燦 */class Branch implements Comparable{//年輪:用於排序的依據private int annualRing;//帶參構造方法public Branch(int annualRing){this.annualRing = annualRing;}//重寫介面中的方法@Overridepublic int compareTo(Object o) {//強制類型轉換Branch b = (Branch)o;/* * 使用年輪作為排序比較的依據 * 當前對象年輪減去參數傳入的Branch對象的年齡 * 結果等於0表示:兩個樹枝年輪相等,排序不分先後 * 結果大於0表示:當前對象的年輪大,排在後面 * 結果小於0表示:參數對象的年輪大,排在後面 */int result = this.annualRing - b.annualRing;return result;}//擷取年輪public int getAnnualRing(){return annualRing;}}運行結果年輪:5  對應的value:樹枝5年輪:8  對應的value:樹枝8年輪:10  對應的value:樹枝10


Properties類

從檔案中擷取索引值對
檔案內容格式
key = value

執行個體:檔案名稱:properties.txt檔案內容:username = adminpassword = 123456檔案地址:src/map/properties/properties.txt其中檔案地址是從項目根目錄開始的執行個體:package map.properties;import java.io.FileInputStream;import java.util.Properties;/** * 示範Properties類中的一些常用方法 * @author 學霸聯盟 - 趙燦 */public class PropertiesDemo {public static void main(String[] args) {//建立Properties對象Properties p = new Properties();/* * 以下代碼暫時Crowdsourced Security Testing道是什麼作用即可,後面會講解 * try - catch語句的作用是捕獲異常 * load方法的作用是負載檔案 * 其中的參數是檔案的地址 */try {p.load(new FileInputStream("src/map/properties/properties.txt"));} catch (Exception e) {System.out.println("載入出錯");}//擷取檔案中username對應的值String username = p.getProperty("username");System.out.println("使用者名稱:" + username);//擷取檔案中password對應的值String password = p.getProperty("password");System.out.println("密碼:" + password);}}運行結果:使用者名稱:admin密碼:123456



本文出自 “學霸聯盟教育官方部落格” 部落格,轉載請與作者聯絡!

I學霸官方免費教程三十三:Java集合架構之Map集合

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.