在之前的文章我们介绍了一下 Java 中的 集合框架中的Collection,本章我们来看一下 Java 集合框架中的 Map。
Map 接口定义的集合又称查找表,用于存储所谓“Key-Value”映射对,Key 可以看成是 Value 的索引,作为 Key 的对象在集合中不可以重复。
根据内部数据结构的不同,Map 接口有多种实现类,其中常用的有内部为 hash 表实现的 HashMap 和内部为排序二叉树实现的 TreeMap,在开发过程中我们常用到的是 Hashmap。
1 import java.util.HashMap; 2 import java.util.Map; 3 4 /** 5 * java.util.Map 6 * Map 看起来像是一个多行两列的表格 7 * 以 key-value 对的形式存放元素 8 * 以 Map 中 key 不允许重复(重复是依靠 key 的 equals 判断) 9 * 常用的实现类为 HashMap 10 */ 11 public class Main { 12 public static void main(String[] args) { 13 Map<String, Integer> map = new HashMap<String, Integer>(); 14 /** 15 * V put(K k, V v) 16 * 将给定的 key-value 对存入 Map 17 * 顺序不按照给定的顺序排 18 * 由于 Map 要求 key 不允许重复,所以使用 Map 19 * 已有的 key 存入一个新的 value 时的操作是 20 * 替换 value,那么返回值为该 key 原来对应的 value, 21 * 若是一个新的 key,则返回为 null 22 */ 23 map.put("语文", 90); 24 map.put("数学", 93); 25 map.put("英语", 80); 26 map.put("化学", 99); 27 System.out.println(map); // {数学=93, 化学=99, 语文=90, 英语=80} 28 29 Integer value = map.put("物理", 60); // 新 key,返回 null 30 System.out.println(value); // null 31 System.out.println(map); // {物理=60, 数学=93, 化学=99, 语文=90, 英语=80} 32 33 value = map.put("语文", 88); // key 相同替换原来的 value 34 System.out.println(value); // 90 35 System.out.println(map); // {物理=60, 数学=93, 化学=99, 语文=88, 英语=80} 36 37 /** 38 * V get(K k) 39 * 根据给定的 key 获取对应的 value 40 * 若当前 Map 中没有给定的 key,则返回为 null 41 */ 42 value = map.get("数学"); 43 System.out.println(value); // 93 44 value = map.get("生物"); 45 System.out.println(value); // null 46 47 /** 48 * V remove(K k) 49 * 删除给定的 key 所对应的 key-value 对 50 * 返回值为被删除的 key-value 对中的 value 51 */ 52 value = map.remove("数学"); 53 System.out.println(value); // 93 54 System.out.println(map); // {物理=60, 化学=99, 语文=88, 英语=80} 55 } 56 }
在上面的代码中,我们实现了 Map 的基本操作增删改查。接下来我们再来看一下 Map 的循环遍历:
1 import java.util.Collection; 2 import java.util.HashMap; 3 import java.util.Map; 4 import java.util.Set; 5 6 /** 7 * 遍历 Map 8 * 遍历 Map 有三种方式: 9 * 遍历所有的 key 10 * 遍历所有的 key-value 对 11 * 遍历所有的 value(相对不常用) 12 */ 13 public class Main { 14 public static void main(String[] args) { 15 Map<String, Integer> map = new HashMap<String, Integer>(); 16 map.put("语文", 90); 17 map.put("数学", 93); 18 map.put("英语", 80); 19 map.put("化学", 99); 20 System.out.println(map.size()); // 4 21 System.out.println(map); // {数学=93, 化学=99, 语文=90, 英语=80} 22 23 /** 24 * 遍历所有的 key 25 * Set<K> keySet() 26 * 该方法会将当前 Map 中所有的 key 存入一个Set 集合后返回 27 * 那么遍历该集合就等于遍历了所有的 key 28 */ 29 Set<String> keySet = map.keySet(); 30 for (String string : keySet) { 31 System.out.println(string); // 数学 化学 语文 英语 32 } 33 34 /** 35 * 遍历每一组键值对 36 * Map 中每一组键值对都是由 Map 的内部类: 37 * java.util.Map.Entry 的一个实例表示的 38 * Entry 有两个方法:getKey,getValue 39 * 可以分别获取这一组键值对中的 key 与 value 40 * 41 * set<Entry> entrySet 42 * 该方法会将 Map 中每一组键值对(Entry 实例) 43 * 存入一个 Set 集合后返回 44 */ 45 Set<Map.Entry<String, Integer>> entrySet = map.entrySet(); 46 for (Map.Entry<String, Integer> entry : entrySet) { 47 String key = entry.getKey(); 48 Integer value = entry.getValue(); 49 System.out.println(key + ": " + value); // 数学: 93, 化学: 99, 语文: 90, 英语: 80 50 } 51 52 /** 53 * 遍历所有的 value 54 * Collection values 55 * 该方法会将当前 Map 中所有的 value 存入一个集合后返回 56 */ 57 Collection<Integer> values = map.values(); 58 for (Integer value : values) { 59 System.out.println(value); // 93 99 90 80 60 } 61 } 62 }
在上面的代码中,我们实现了 Map 的遍历循环。