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

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

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


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

一、Map 接口概述

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


Map 接口的主要特点包括:

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


二、Map 接口的常见实现类


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


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


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

三、使用示例

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

import java.util.HashMap;
import java.util.Map;
 
public class Main {
    public static void main(String[] args) {
        // 创建一个 HashMap 对象
        Map<String, Integer> myMap = new HashMap<>();
 
        // 添加键值对到集合
        myMap.put("Apple", 10);
        myMap.put("Banana", 20);
        myMap.put("Orange", 30);
 
        // 获取集合大小
        int size = myMap.size();
        System.out.println("Map size: " + size);
 
        // 访问集合中的值
        System.out.println("Value for key 'Apple': " + myMap.get("Apple"));
        System.out.println("Value for key 'Banana': " + myMap.get("Banana"));
 
        // 遍历集合并打印每个键值对
        System.out.println("All key-value pairs:");
        for (Map.Entry<String, Integer> entry : myMap.entrySet()) {
            System.out.println(entry.getKey() + " -> " + entry.getValue());
        }
 
        // 检查集合中是否包含某个键
        boolean containsKey = myMap.containsKey("Banana");
        System.out.println("Does map contain key 'Banana'? " + containsKey);
 
        // 删除集合中的某个键值对
        myMap.remove("Banana");
        System.out.println("After removing key 'Banana':");
        System.out.println(myMap);
 
        // 清空集合
        myMap.clear();
        System.out.println("After clearing the map:");
        System.out.println(myMap);
    }
}

四、 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 进行添加元素后的输出排序情况:

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeMap;
 
public class Main {
    public static void main(String[] args) {
        // HashMap 示例
        Map<String, Integer> hashMap = new HashMap<>();
        hashMap.put("Banana", 2);
        hashMap.put("Apple", 1);
        hashMap.put("Orange", 3);
        hashMap.put("Cool", 5);
        hashMap.put("Door", 4);
        System.out.println("HashMap:");
        System.out.println(hashMap);
 
        // TreeMap 示例
        Map<String, Integer> treeMap = new TreeMap<>();
        treeMap.put("Banana", 2);
        treeMap.put("Apple", 1);
        treeMap.put("Orange", 3);
        treeMap.put("Cool", 5);
        treeMap.put("Door", 4);
        System.out.println("TreeMap:");
        System.out.println(treeMap);
 
        // LinkedHashMap 示例
        Map<String, Integer> linkedHashMap = new LinkedHashMap<>();
        linkedHashMap.put("Banana", 2);
        linkedHashMap.put("Apple", 1);
        linkedHashMap.put("Orange", 3);
        linkedHashMap.put("Cool", 5);
        linkedHashMap.put("Door", 4);
        System.out.println("LinkedHashMap:");
        System.out.println(linkedHashMap);
    }
}

很明显:

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


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

这里解答下

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


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

相关文章
|
2天前
|
存储 Java API
键值对魔法:如何优雅地使用Java Map,让代码更简洁?
【6月更文挑战第18天】在Java中,高效使用Map能提升代码质量。例如,Java 9引入了简洁的初始化语法`Map.of()`来创建Map。Stream API允许优雅地处理Map,如遍历、筛选和转换数据。Map的方法如`merge`用于合并键值,`computeIfAbsent`和`computeIfPresent`则在条件满足时计算并更新值。此外,Map的默认方法如`getOrDefault`提供便利。掌握这些特性可使Map操作更高效和易读。
|
2天前
|
存储 算法 Java
滚雪球学Java(65):深入理解Java中的Map接口:实现原理剖析
【6月更文挑战第19天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
6 3
滚雪球学Java(65):深入理解Java中的Map接口:实现原理剖析
|
8天前
|
Java 数据安全/隐私保护 Android开发
Java基础21-读懂Java序列化和反序列化(二)
Java基础21-读懂Java序列化和反序列化(二)
7 1
|
8天前
|
XML 存储 Java
Java基础21-读懂Java序列化和反序列化(一)
Java基础21-读懂Java序列化和反序列化(一)
10 1
|
8天前
|
IDE Java 编译器
Java基础20-从IDE的实现原理聊起,谈谈那些年我们用过的Java命令(二)
Java基础20-从IDE的实现原理聊起,谈谈那些年我们用过的Java命令(二)
11 2
|
2天前
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【6月更文挑战第18天】在Java中,Map的两大代表HashMap和TreeMap提供高效键值对操作。HashMap允许设定初始容量和加载因子以优化性能,非线程安全,可借助synchronized或ConcurrentHashMap处理多线程。遍历可通过entrySet()、keySet()和values()。而TreeMap依据键进行排序,支持自然排序和自定义Comparator,提供范围查询、获取首尾键的功能,适用于需有序遍历的场景。理解和利用这些特性能增强代码功能和效率。
|
2天前
|
存储 Java 数据管理
告别混乱!用Java Map优雅管理你的数据结构
【6月更文挑战第18天】Java Map接口简化了数据管理,如在购物平台开发中。用Map存储商品ID与对象,便于查找、修改和删除。用户管理中,Map以用户ID为键存储用户信息,支持登录验证和信息更新。订单管理同样受益,订单ID与订单对象配对,易于查询和状态变更。Map使得数据结构清晰,提升代码效率。
|
2天前
|
存储 安全 Java
从入门到精通:Java Map全攻略,一篇文章就够了!
【6月更文挑战第18天】Java Map是键值对集合,接口有HashMap、TreeMap、LinkedHashMap等实现。创建Map如`Map&lt;String, Integer&gt; map = new HashMap&lt;&gt;();`。访问修改值用`get()`和`put()`。遍历Map用`entrySet()`配合for-each。多线程下用ConcurrentHashMap。优化包括选对实现类、设置容量和负载因子、避免遍历时修改。本文助你精通Map使用。
|
2天前
|
存储 Java 数据处理
Java Map实战:用HashMap和TreeMap轻松解决复杂数据结构问题!
【6月更文挑战第18天】在Java中,HashMap基于哈希表提供快速的键值对操作,适合无序数据;而TreeMap利用红黑树保证排序,适用于有序场景。示例展示了HashMap如何存储并查找用户信息,以及TreeMap如何按员工编号排序存储员工名。两者在不同需求下优化了数据处理。
|
2天前
|
存储 Java API
深入剖析Java Map:不只是存储数据,更是设计艺术的体现!
【6月更文挑战第18天】Java Map是键值对数据结构的艺术,展示了设计效率与易用性的平衡。HashMap利用哈希表实现快速访问,TreeMap通过红黑树保证排序。选择合适的实现类如HashMap、TreeMap或LinkedHashMap至关重要。注意空指针异常,谨慎在遍历时修改Map。Map的高效使用能提升编程效果。