JavaSE中Map框架学习笔记
前言:最近幾天都在生病,退燒之后身體虛弱、頭疼。在床上躺了幾天,什么事情都干不了。接下來這段時間,要好好加快進度才好。
?
前面用了三篇文章的篇幅學習了Collection框架的相關內容,而Map框架相對而言比較簡單,爭取在這一篇博客里面講完。
?
2.1 鍵值對應的Map
就如同網絡搜索,根據關鍵字可找到對應的數據,程序設計中也常有這類需求,根據某個鍵(Key)來取得對應的值(Value)。可以事先利用java.util.Map接口的操作對象來建立鍵值對應數據,之后若要取得值,只要用對應的鍵就可以迅速取得。
?
同樣地,在學習Map相關API之前,先了解框架設計架構對正確使用API會有幫助。
?
從圖中我們可以看到,常用的Map操作類為java.util.HashMap與java.util.TreeMap,其繼承自抽象類java.util.AbstractMap。至于java.HashTable是從JDK1.0就遺留下來的API,不建議使用,所以也不會多加講述。但是它的子類Properties卻非常頻繁地被使用,因此將會一起介紹。
?
2.2 使用HashMap
Map的使用比較簡單,所以我們先直接寫一個關于HashMap的demo,根據指定的姓名獲取對應的備注信息:
1 import java.util.*; 2 3 /** 4 * HashMap的實驗用例 5 */ 6 public class Remarks { 7 public static void main(String[] args) { 8 Map<String, String> remarks = new HashMap<>(); 9 remarks.put("Jack", "一個高大帥氣的小伙子"); 10 remarks.put("Jane", "一位落落大方的小淑女"); 11 remarks.put("Tom", "一個人到中年的怪大叔"); 12 13 Scanner scanner = new Scanner(System.in); 14 System.out.print("請輸出需要查詢的姓名: "); 15 String remark = remarks.get(scanner.nextLine()); 16 System.out.println(remark); 17 System.out.println(remarks); 18 } 19 }?
要建立鍵值對應,可以使用put()方法,第一個自變量是鍵,第二個自變量是值。在Map框架當中,鍵是不會重復的,在這一點上跟之前學習過的Set類似。因為判斷鍵是否重復要根據hashCode()方法和equals()方法,所以作為鍵的對象必須實現這兩個方法,否則就會出錯(如有需要,可以重新閱讀Collection框架系列文章中的第二篇)。如果要取回跟鍵對應的值,我們要使用get()方法。
?
在HashMap中建立鍵值對應之后,鍵是無序的,這可以在執行結果中看到。如果想讓鍵是有序的,我們可以選擇使用TreeMap.
?
2.3 使用TreeMap
我們剛才提到,TreeMap會對鍵進行排序,而排序就需要比較大小。
?
在之前講Collection的文章里曾經提到過,如果要比較大小,就要求參與比較的對象必須實現Comparable接口,或者是指定實現Comparator接口的對象,例如我們接下來要運行的兩個demo:
1 import java.util.*; 2 3 /** 4 * TreeMap的實驗用例 5 */ 6 public class Remarks { 7 public static void main(String[] args) { 8 Map<String, String> remarks = new TreeMap<>(); 9 remarks.put("Jack", "一個高大帥氣的小伙子"); 10 remarks.put("Jane", "一位落落大方的小淑女"); 11 remarks.put("Tom", "一個人到中年的怪大叔"); 12 13 System.out.println(remarks); 14 } 15 }?
因此String本身就已經實現了Comparable接口,所以我們可以看到結果是根據鍵來排序的:
?
假設我們想要看到相反的排序結果,那么我們可以用到之前就提到過的實現Comparator接口的方法:
1 import java.util.*; 2 3 /** 4 * TreeMap的實驗用例 5 */ 6 class StringComparator implements Comparator<String> { 7 @Override 8 public int compare(String s1, String s2) { 9 return -s1.compareTo(s2); 10 } 11 } 12 13 public class Remarks { 14 public static void main(String[] args) { 15 Map<String, String> remarks = new TreeMap<>(new StringComparator()); 16 remarks.put("Jack", "一個高大帥氣的小伙子"); 17 remarks.put("Jane", "一位落落大方的小淑女"); 18 remarks.put("Tom", "一個人到中年的怪大叔"); 19 20 System.out.println(remarks); 21 } 22 }?
創建TreeMap的時候指定了StringComparator對象,所以我們可以得到想要的結果:
?
2.4 使用Properties
雖然Properties有Map的行為,也可以使用put()設定鍵值對應、get()取得鍵對應的值,不過一般我們更多的是使用Properties的setPropertity()指定字符串類型的鍵值,getProperty()指定字符串類型的鍵,取回字符串類型的值,通常稱為屬性名稱與屬性值。例如這樣的語句:
1 Properties props = new Properties(); 2 props.setProperty("username", "jack"); 3 props.setProperty("password", "123456"); 4 System.out.println(props.getProperty("username")); 5 System.out.println(props.getProperty("password"));?
使用Properties一般有兩種常見方式,一是載入.properties文檔,二是使用loadFromXML()方法加載.xml文檔。由于篇幅關系,這里就不詳細舉例說明了。
?
2.5 Map的鍵和值
如果想取得Map中所有的鍵,或是想取得Map中所有的值該怎么做?Map雖然與Collection沒有繼承上的關系,然而卻是彼此搭配的關系。
?
如果想取得Map中所有的鍵,可以調用Map的keySet()方法返回Set對象。因為鍵是不重復的,所以我們很容易理解為什么用Set來返回。如果想取得Map中所有的值,則可以使用values()返回Collection對象。例如下面這個demo:
1 import java.util.*; 2 3 /** 4 * Map的鍵和值實驗用例 5 */ 6 public class MapKeyValue { 7 public static void main(String[] args) { 8 Map<String, String> map = new HashMap<>(); 9 map.put("one","一"); 10 map.put("two","二"); 11 map.put("three","三"); 12 13 System.out.println("顯示所有的鍵"); 14 foreach(map.keySet()); 15 16 System.out.println("顯示所有的值"); 17 foreach(map.values()); 18 } 19 20 public static void foreach(Iterable<String> iterable) { 21 for(String element : iterable) { 22 System.out.println(element); 23 } 24 } 25 }?
運行之后,我們可以看到這樣的結果:
?
如果想要同時取得Map的鍵和值,可以使用entrySet()方法,返回一個Set對象。這個Set里面的每一個元素都是Map.Entry實例,可以調用getKey()方法取得鍵,調用getValue()方法取得值。
?
2.6 Map框架小結
相比Collection框架,Map框架較為簡單,需要熟悉了解的常用類只有HashMap、TreeMap和Properties三種。也因為之前已經學習過Collection框架,有了相關的知識儲備,所以在新的學習過程當中可以省下不少功夫,例如為什么Map的鍵必須實現hashCode()和equals()方法,為什么TreeMap的鍵必須實現Comparable接口或指定實現了Comparator接口的對象。
?
這就體現出了之前我們常常提及的“熟悉框架架構”的重要性,不僅容易理解為什么要這樣設計,還方便之后的記憶和使用。很多人學習JavaSE都會有一個問題,就是死記硬背API——在網上找到一些文章(往往寫得不好),記住里面的一兩句話就以為自己掌握了。其實,這遠遠不夠。
?
當然,熟悉API架構只是剛起步,更多的掌握過程要在大量的實際編程中實現。只要一開始動手寫代碼,你就會發現自己學來的東西是有用的。同時也會發現存在問題和漏洞,但是一旦查缺補漏完畢,你的水平將會上升不止一個層次。
?
?
?
相關文章推薦:
JavaSE中Collection集合框架學習筆記(1)——具有索引的List
JavaSE中Collection集合框架學習筆記(2)——拒絕重復內容的Set和支持隊列操作的Queue
JavaSE中Collection集合框架學習筆記(3)——遍歷對象的Iterator和收集對象后的排序?
?
如果你喜歡我的文章,可以掃描關注我的個人公眾號“李文業的思考筆記”。
不定期地會推送我的原創思考文章。
?
?
轉載于:https://www.cnblogs.com/levenyes/p/7163843.html
總結
以上是生活随笔為你收集整理的JavaSE中Map框架学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 轻量级代码生成器-OnlyCoder 第
- 下一篇: 数据类型及其基本操作
