1 Map 概览

image.png

如果向 **Map** 中添加 key 重复的元素,则会将之前 key 对应的 value 修改。

image.png

2 Map 的遍历

Map 对象大概一共有 4 种遍历的方法:

方法一for-each 遍历 Map.entrySet() 方法 —- 同时获取键值对

  1. Map<Integer, Integer> map = new HashMap<Integer, Integer>();
  2. for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
  3. System.out.printf("key=%d, value=%d\n", entry.getKey(), entry.getValue());
  4. }

类似于 Python 中的 for key, value in map.items():

方法二for-each 中单独遍历 key 和 value(效率最高

  1. for (Integer key : map.keySet()) {
  2. System.out.println("key=" + key);
  3. }
  4. for (Integet value : map.values()) {
  5. System.out.println("value=" + value);
  6. }

方法三】使用 Iterator 遍历

  1. Interaotr<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator();
  2. while (entries.hasNext()) {
  3. Map.Entry<Integer, Integer> entry = entries.next();
  4. System.out.printf("key=%d, value=%d\n", entry.getKey(), entry.getValue());
  5. }

不适用泛型:

  1. Iterator entries = map.entrySet().iterator();
  2. while (entries.hasNext()) {
  3. Map.Entry entry = (Map.Entry) entries.next();
  4. Integer key = (Integer) entry.getKey();
  5. Integer value = (Integer) entry.getValue();
  6. System.out.printf("key=%d, value=%d\n", key, value);
  7. }

方法四】通过键查找值(效率很低

  1. for (Integer key : map.keySet()) {
  2. Integer value = map.get(key);
  3. System.out.printf("key=%d, value=%d\n", key, value);
  4. }

效率低的原因是使用键计算值的操作是需要耗费时间的。

3 Map 的复制

首先 Map 拷贝的方法有 3 种:

  • = —- 浅拷贝
  • Map.putAll() —- 深拷贝
  • for 循环手动拷贝 —- 深拷贝

= 是浅拷贝, putAll() 是深拷贝

  1. public class mapCopy {
  2. public static void main(String[] args) {
  3. Map<String, Object> map1 = new HashMap<>();
  4. map1.put("name", "Holy");
  5. map1.put("age", 12);
  6. Map<String, Object> map2 = new HashMap<>();
  7. map2.putAll(map1);
  8. map2.remove("name");
  9. System.out.println(map1); // 深拷贝,map1 的内容没有改变
  10. System.out.println(map2);
  11. map2 = map1;
  12. map1.remove("name");
  13. System.out.println(map1); // 浅拷贝,map1 的内容被改变
  14. System.out.println(map2);
  15. }
  16. }

输出结果:

  1. {name=Holy, age=12}
  2. {age=12}
  3. {age=12}
  4. {age=12}

手动拷贝就不展示了,主要是使用 Map.entrySet() 方法遍历 Map 的 key 和 value。