当前位置:   article > 正文

【JAVA基础篇教学】第十篇:Java中Map详解说明_java map

java map

博主打算从0-1讲解下java基础教学,今天教学第十篇:Java中Map详解说明。  

Java 编程中,Map 接口代表了一种键值对的集合,每个键对应一个值。Map 接口提供了一系列操作方法,可以方便地对键值对进行增删改查等操作。本文将介绍 Map 接口的基本概念以及如何在 Java 中使用 Map 接口。

目录

一、Map 接口概述

二、Map 接口的常见实现类

三、使用示例

四、 HashMap,TreeMap,LinkedHashMap区别

1、HashMap

2、TreeMap

3、LinkedHashMap

4、输出排序情况示例


一、Map 接口概述

Map 接口是 Java Collections Framework 中的一部分,位于 java.util 包中。它是一个接口,代表了一种键值对的集合,每个键对应一个值。Map 接口允许键值对具有唯一性,即同一个键只能对应一个值。

Map 接口的主要特点包括:

  • 键的唯一性:Map 中的键是唯一的,不能包含重复的键。
  • 允许空键和空值:Map 中可以包含空键和空值。
  • 可以通过键来查找值:可以通过键来查找对应的值,并且可以根据需要修改、删除或者添加键值对。

二、Map 接口的常见实现类

Java 中常见的 Map 接口的实现类包括:

  1. HashMap:基于哈希表实现的键值对集合,无序且不保证键值对的顺序。
  2. TreeMap:基于红黑树实现的键值对集合,按键的自然顺序或者自定义顺序进行排序。
  3. LinkedHashMap:继承自 HashMap,内部使用双向链表维护键值对的顺序,可以保持键值对的插入顺序或者访问顺序。

在本文中,我们将主要介绍 HashMap 的使用。

三、使用示例

下面是一个使用 Map 接口的 HashMap 实现的示例代码:

  1. import java.util.HashMap;
  2. import java.util.Map;
  3. public class Main {
  4. public static void main(String[] args) {
  5. // 创建一个 HashMap 对象
  6. Map<String, Integer> myMap = new HashMap<>();
  7. // 添加键值对到集合
  8. myMap.put("Apple", 10);
  9. myMap.put("Banana", 20);
  10. myMap.put("Orange", 30);
  11. // 获取集合大小
  12. int size = myMap.size();
  13. System.out.println("Map size: " + size);
  14. // 访问集合中的值
  15. System.out.println("Value for key 'Apple': " + myMap.get("Apple"));
  16. System.out.println("Value for key 'Banana': " + myMap.get("Banana"));
  17. // 遍历集合并打印每个键值对
  18. System.out.println("All key-value pairs:");
  19. for (Map.Entry<String, Integer> entry : myMap.entrySet()) {
  20. System.out.println(entry.getKey() + " -> " + entry.getValue());
  21. }
  22. // 检查集合中是否包含某个键
  23. boolean containsKey = myMap.containsKey("Banana");
  24. System.out.println("Does map contain key 'Banana'? " + containsKey);
  25. // 删除集合中的某个键值对
  26. myMap.remove("Banana");
  27. System.out.println("After removing key 'Banana':");
  28. System.out.println(myMap);
  29. // 清空集合
  30. myMap.clear();
  31. System.out.println("After clearing the map:");
  32. System.out.println(myMap);
  33. }
  34. }

四、 HashMap,TreeMap,LinkedHashMap区别

1、HashMap

  • 数据结构:HashMap 基于哈希表实现,内部使用数组和链表/红黑树(JDK8+)来存储键值对。
  • 无序性:HashMap 不保证键值对的顺序,即遍历时输出的顺序可能是随机的。
  • 性能:HashMap 的插入、删除和查找操作的平均时间复杂度为 O(1),具有很好的性能。
  • 允许空键和空值:HashMap 允许键和值都为 null。

2、TreeMap

  • 数据结构:TreeMap 基于红黑树实现,内部使用红黑树来存储键值对,并且保持键的有序性。
  • 有序性:TreeMap 会按键的自然顺序或者自定义顺序进行排序,因此遍历时输出的键值对是有序的。
  • 性能:TreeMap 的插入、删除和查找操作的时间复杂度为 O(log n),比 HashMap 略慢。
  • 不允许空键:TreeMap 不允许键为 null,但允许值为 null。

3、LinkedHashMap

  • 数据结构:LinkedHashMap 继承自 HashMap,内部使用双向链表来维护键值对的顺序,可以保持插入顺序或者访问顺序。
  • 有序性:LinkedHashMap 可以按照插入顺序或者访问顺序来遍历输出键值对。
  • 性能:LinkedHashMap 的性能与 HashMap 类似,但由于额外维护了链表,可能会稍微慢一些。
  • 允许空键和空值:LinkedHashMap 允许键和值都为 null。

4、输出排序情况示例

下面是一个示例,展示了对 HashMap、TreeMap 和 LinkedHashMap 进行添加元素后的输出排序情况:

  1. import java.util.HashMap;
  2. import java.util.LinkedHashMap;
  3. import java.util.Map;
  4. import java.util.TreeMap;
  5. public class Main {
  6. public static void main(String[] args) {
  7. // HashMap 示例
  8. Map<String, Integer> hashMap = new HashMap<>();
  9. hashMap.put("Banana", 2);
  10. hashMap.put("Apple", 1);
  11. hashMap.put("Orange", 3);
  12. hashMap.put("Cool", 5);
  13. hashMap.put("Door", 4);
  14. System.out.println("HashMap:");
  15. System.out.println(hashMap);
  16. // TreeMap 示例
  17. Map<String, Integer> treeMap = new TreeMap<>();
  18. treeMap.put("Banana", 2);
  19. treeMap.put("Apple", 1);
  20. treeMap.put("Orange", 3);
  21. treeMap.put("Cool", 5);
  22. treeMap.put("Door", 4);
  23. System.out.println("TreeMap:");
  24. System.out.println(treeMap);
  25. // LinkedHashMap 示例
  26. Map<String, Integer> linkedHashMap = new LinkedHashMap<>();
  27. linkedHashMap.put("Banana", 2);
  28. linkedHashMap.put("Apple", 1);
  29. linkedHashMap.put("Orange", 3);
  30. linkedHashMap.put("Cool", 5);
  31. linkedHashMap.put("Door", 4);
  32. System.out.println("LinkedHashMap:");
  33. System.out.println(linkedHashMap);
  34. }
  35. }

很明显:

  • hashMap的输出,顺序是随机的。
  • treeMap的输出,是根据字母自然排序的。是根据键的自然顺序或者通过传入的比较器(Comparator)进行排序的。
  •  linkedHashMap的输出,是按照你插入的顺序。

这里要注意一下,当你多次运行程序时,你会发现hashmap的输出趋向于有序?

这里解答下

虽然 HashMap 不保证元素的顺序,但是在实际使用中,对于相同的哈希表大小和相同的哈希函数,相同的元素插入顺序往往会导致相同的哈希码分布,从而使得元素在哈希表中的位置趋于相同,进而使得元素的遍历顺序看起来是有序的。这种现象称为“桶中的元素顺序”。

但是,这种“有序性”仅仅是一种“看起来”的现象,实际上 HashMap 并不保证元素的顺序,因此不应该依赖于遍历结果的顺序。如果需要有序的遍历,应该使用 TreeMap 或者 LinkedHashMap,它们会根据键的自然顺序或者插入顺序进行有序遍历。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/983970
推荐阅读
相关标签
  

闽ICP备14008679号