Map集合 在Map集合中保存的數據為一組數據,其中:一個數據為key,另外一個數據為value。而key和value具備對應的關係,在集合中它們屬於一組(一對)數據。而每個key只能對應唯一的一個value值並且所有的key不能重覆。 但是其中的value值是可以重覆的。 Collection中的 ...
-
-
Map
中的集合,元素是成對存在的(理解為夫妻)。每個元素由鍵與值兩部分組成,通過鍵可以找對所對應的值。 -
Collection
中的集合稱為單列集合,Map
中的集合稱為雙列集合。 -
需要註意的是,
Map
中的集合不能包含重覆的鍵,值可以重覆;每個鍵只能對應一個值。
HashMap集合
LinkedHashMap集合。
-
HashMap<K,V>:存儲數據採用的哈希表結構,元素的存取順序不能保證一致。由於要保證鍵的唯一、不重覆,因此需要重寫鍵的hashCode()方法、equals()方法。
-
LinkedHashMap<K,V>:存儲數據採用的哈希表結構+鏈表結構。通過鏈表結構可以保證元素的存取順序一致;通過哈希表結構可以保證的鍵的唯一、不重覆,需要重寫鍵的hashCode()方法、equals()方法。
-
public V put(K key, V value)
: 把指定的鍵與指定的值添加到Map集合中。如果鍵值存在則覆蓋。 -
public V remove(Object key)
: 把指定的鍵和對應的值在集合中刪除,返回被刪除元素的值。 -
public V get(Object key)
根據指定的鍵,在Map集合中獲取對應的值。
Map介面的方法演示
1 public class MapDemo { 2 public static void main(String[] args) { 3 //創建 map對象 4 HashMap<String, String> map = new HashMap<String, String>(); 5 6 //添加元素到集合 7 map.put("黃曉明", "楊穎"); 8 map.put("文章", "馬伊琍"); 9 map.put("鄧超", "孫儷"); 10 System.out.println(map); 11 12 //String remove(String key) 13 System.out.println(map.remove("鄧超")); 14 System.out.println(map); 15 16 // 想要查看 黃曉明的媳婦 是誰 17 System.out.println(map.get("黃曉明")); 18 System.out.println(map.get("鄧超")); 19 } 20 }
1 public class MapDemo01 { 2 public static void main(String[] args) { 3 //創建Map集合對象 4 HashMap<String, String> map = new HashMap<String,String>(); 5 //添加元素到集合 6 map.put("胡歌", "霍建華"); 7 map.put("郭德綱", "於謙"); 8 map.put("薛之謙", "大張偉"); 9 10 //獲取所有的鍵 獲取鍵集 11 Set<String> keys = map.keySet(); 12 // 遍歷鍵集 得到 每一個鍵 13 for (String key : keys) { 14 //key 就是鍵 15 //獲取對應值 16 String value = map.get(key); 17 System.out.println(key+"的CP是:"+value); 18 } 19 } 20 }
public Set<Map.Entry<K,V>> entrySet()
: 獲取集合中所有的鍵值對
對象,保存到Set集合中。
我們已經知道,Map
中存放的是兩種對象,一種稱為key(鍵),一種稱為value(值),它們在在Map
中是一一對應關係,這一對對象又稱做Map
中的一個Entry(項)
。Entry
將鍵值對的對應關係封裝成了對象。即鍵值對
對象,這樣我們在遍歷Map
集合時,就可以從每一個鍵值對(Entry
)對象中獲取對應的鍵與對應的值。
既然Entry表示了一對鍵和值,那麼也同樣提供了獲取對應鍵和對應值得方法:
-
public K getKey()
:獲取Entry對象中的鍵。 -
public V getValue()
:獲取Entry對象中的值。
1 public class MapDemo02 { 2 public static void main(String[] args) { 3 // 創建Map集合對象 4 HashMap<String, String> map = new HashMap<String,String>(); 5 // 添加元素到集合 6 map.put("胡歌", "霍建華"); 7 map.put("郭德綱", "於謙"); 8 map.put("薛之謙", "大張偉"); 9 10 // 獲取 所有的 entry對象 entrySet 11 Set<Entry<String,String>> entrySet = map.entrySet(); 12 13 // 遍歷得到每一個entry對象 14 for ( Entry<String, String> entry : entrySet) { 15 // 解析 16 String key = entry.getKey(); 17 String value = entry.getValue(); 18 System.out.println(key+"的CP是:"+value); 19 } 20 } 21 }
在HashMap下麵有一個子類LinkedHashMap,它是鏈表和哈希表組合的一個數據存儲結構。在保證key值對象唯一的前提下,還能保證元素的存取順序。
1 public class LinkedHashMapDemo { 2 public static void main(String[] args) { 3 LinkedHashMap<String, String> map = new LinkedHashMap<String, String>(); 4 map.put("鄧超", "孫儷"); 5 map.put("李晨", "範冰冰"); 6 map.put("劉德華", "朱麗倩"); 7 Set<Entry<String, String>> entrySet = map.entrySet(); 8 for (Entry<String, String> entry : entrySet) { 9 System.out.println(entry.getKey() + " " + entry.getValue()); 10 } 11 } 12 }
需求:
計算一個字元串中每個字元出現次數。
分析:
-
獲取一個字元串對象
-
創建一個Map集合,鍵代表字元,值代表次數。
-
遍歷字元串得到每個字元。
-
判斷Map中是否有該鍵。
-
如果沒有,第一次出現,存儲次數為1;如果有,則說明已經出現過,獲取到對應的值進行++,再次存儲。
-
1 public class MapTest { 2 public static void main(String[] args) { 3 //友情提示 4 System.out.println("請錄入一個字元串:"); 5 String line = new Scanner(System.in).nextLine(); 6 // 定義 每個字元出現次數的方法 7 findChar(line); 8 } 9 public static void findChar(String line) { 10 //1:創建一個集合 存儲 字元 以及其出現的次數 11 HashMap<Character, Integer> map = new HashMap<Character, Integer>(); 12 //2:遍歷字元串 13 for (int i = 0; i < line.length(); i++) { 14 char c = line.charAt(i); 15 //判斷 該字元 是否在鍵集中 16 if (!map.containsKey(c)) {//說明這個字元沒有出現過 17 //那就是第一次 18 map.put(c, 1); 19 } else { 20 //先獲取之前的次數 21 Integer count = map.get(c); 22 //count++; 23 //再次存入 更新 24 map.put(c, ++count); 25 } 26 } 27 System.out.println(map); 28 } 29 }
TreeMap()
:使用自然順序對key值進行排序。
TreeMap(Comparator comparator)
:創建對象時,傳遞比較器對象。按比較器的比較方式排序。
1 public class Demo { 2 public static void main(String[] args) { 3 // 創建集合對象,key值按照自然順序排序 4 TreeMap<String, String> map1 = new TreeMap<>(); 5 // 給集合中保存元素 6 map1.put( "affd", "123" ); 7 map1.put( "fff", "456" ); 8 map1.put( "ABC", "789" ); 9 System.out.println( "map1 = " + map1); 10 11 // 創建集合對象,並傳遞比較器,按照指定的方式比較 12 TreeMap<String, String> map2 = new TreeMap<>(new Comparator<String>() { 13 public int compare(String o1, String o2) { 14 // 按照長度比較 , 相同長度不保存 15 return o1.length() - o2.length(); 16 } 17 }); 18 // 給集合中保存元素 19 map2.put( "affd", "123" ); 20 map2.put( "fff", "456" ); 21 map2.put( "ABC", "789" ); 22 System.out.println( "map2 = " + map2 ); 23 } 24 }