Java Map接口

Map的核心概念与作用

Map接口定义了一种键值对的映射关系,其中每个键(key)是唯一的,而值(value)可以重复。这种数据结构的核心作用是通过键快速定位值

Map接口的常用方法

Map接口定义了一系列操作键值对的方法,以下是最常用的几个:

方法 功能描述
V put(K key, V value) 添加键值对,若键已存在则替换值,返回被替换的旧值
V remove(Object key) 根据键删除键值对,返回被删除的值
V get(Object key) 根据键获取值,若键不存在则返回null
int size() 返回键值对的数量
boolean containsKey(Object key) 判断是否包含指定键
boolean containsValue(Object value) 判断是否包含指定值
Set<K> keySet() 返回所有键的集合
Collection<V> values() 返回所有值的集合
Set<Map.Entry<K, V>> entrySet() 返回所有键值对的集合
boolean isEmpty() 判断是否为空
Iterator<E> iterator() 返回遍历元素的迭代器

常用Map实现类

Java提供了多种Map接口的实现类,适用于不同场景,其中最常用的是HashMap

1. HashMap:基于哈希表的实现

HashMapMap接口的主要实现类,它基于哈希表(Hash Table)实现,具有以下特点:

  • 查找效率高:平均情况下,putget等操作的时间复杂度为O(1)
  • 无序性:不保证键值对的存储和遍历顺序
  • 允许null键和null值:最多只能有一个null键,但可以有多个null值
  • 非线程安全:多线程环境下需要额外同步
import java.util.HashMap;
import java.util.Map; public class HashMapExample {
public static void main(String[] args) {
// 创建HashMap实例,键为String类型,值为Integer类型
Map<String, Integer> studentScores = new HashMap<>(); // 添加键值对
studentScores.put("张三", 90);
studentScores.put("李四", 85);
studentScores.put("王五", 95); // 重复添加相同键会替换旧值
studentScores.put("张三", 92); // 张三的成绩从90更新为92 // 根据键获取值
System.out.println("李四的成绩:" + studentScores.get("李四")); // 85 // 判断是否包含指定键
System.out.println("是否包含赵六:" + studentScores.containsKey("赵六")); // false // 获取键的数量
System.out.println("学生数量:" + studentScores.size()); // 3
}
}

2. 其他Map实现类

除了HashMap,Java还提供了其他实现类:

  • TreeMap:基于红黑树实现,键按自然顺序或自定义顺序排序,查找时间复杂度为O(log n)
  • LinkedHashMap:继承自HashMap,保留键值对的插入顺序
  • Hashtable:古老的线程安全实现,已被ConcurrentHashMap取代
  • ConcurrentHashMap:线程安全的HashMap实现,适用于多线程环境

选择建议

  • 大多数场景下优先使用HashMap
  • 需要排序时使用TreeMap
  • 需要保持插入顺序时使用LinkedHashMap
  • 多线程环境使用ConcurrentHashMap

Map的遍历方式

Map提供了多种遍历方式,根据需求选择合适的方式:

1. 遍历所有键(keySet)

Map<String, Integer> map = new HashMap<>();
map.put("apple", 10);
map.put("banana", 20);
map.put("orange", 15); // 遍历所有键
for (String key : map.keySet()) {
System.out.println("键:" + key + ",值:" + map.get(key));
} //使用迭代器遍历HashMap
Iterator<String> iterator = map.keySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next();
System.out.println("键:" + key + ",值:" + map.get(key));
}

这种方式先获取所有键,再通过键获取对应的值,对于HashMap效率尚可,但对于TreeMap可能不如entrySet高效。

2. 遍历所有值(values)

如果只需要值,可以直接遍历values()返回的集合:

// 遍历所有值
for (Integer value : map.values()) {
System.out.println("值:" + value);
}

3. 遍历所有键值对(entrySet)

// 遍历所有键值对
for (Map.Entry<String, Integer> entry : map.entrySet()) {
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println("键:" + key + ",值:" + value);
}

entrySet直接返回包含键值对的集合,遍历效率通常高于keySet,是推荐的遍历方式。

键的相等性判断

Map中键的唯一性由两个方法决定:

  • equals():判断两个键是否逻辑相等
  • hashCode():计算键的哈希值

要正确使用自定义对象作为Map的键,必须同时覆写这两个方法,否则可能导致键无法正确查找。

(之后章节讲解)

注意事项

  1. 注意null键的处理HashMap允许null键,但TreeMap不允许,使用时需注意

  2. 初始化容量设置:创建HashMap时可指定初始容量

    Map<String, Integer> map = new HashMap<>(16); // 初始容量16
  3. 遍历顺序不可依赖HashMap的遍历顺序不固定,若需要固定顺序应使用LinkedHashMap

  4. 并发环境谨慎使用HashMap非线程安全,多线程环境应使用ConcurrentHashMap

总结

  • 理解Map的特性和适用场景
  • 掌握Map常用的增、删、改、查、遍历方法
  • 自定义对象作为键时,必须同时覆写equalshashCode方法(之后章节讲解)

Java集合——4.使用Map的更多相关文章

  1. Java集合框架之map

    Java集合框架之map. Map的主要实现类有HashMap,LinkedHashMap,TreeMap,等等.具体可参阅API文档. 其中HashMap是无序排序. LinkedHashMap是自 ...

  2. Java 集合系列 15 Map总结

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  3. Java 集合系列 08 Map架构

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  4. Java集合框架之Map接口浅析

    Java集合框架之Map接口浅析 一.Map接口综述: 1.1java.util.Map<k, v>简介 位于java.util包下的Map接口,是Java集合框架的重要成员,它是和Col ...

  5. 【JAVA集合框架之Map】

    一.概述.1.Map是一种接口,在JAVA集合框架中是以一种非常重要的集合.2.Map一次添加一对元素,所以又称为“双列集合”(Collection一次添加一个元素,所以又称为“单列集合”)3.Map ...

  6. Java集合框架中Map接口的使用

    在我们常用的Java集合框架接口中,除了前面说过的Collection接口以及他的根接口List接口和Set接口的使用,Map接口也是一个经常使用的接口,和Collection接口不同,Map接口并不 ...

  7. java集合框架07——Map架构与源代码分析

    前几节我们对Collection以及Collection中的List部分进行了分析,Collection中还有个Set,因为Set是基于Map实现的,所以这里我们先分析Map,后面章节再继续学习Set ...

  8. 「 深入浅出 」java集合Collection和Map

    本系列文章主要对java集合的框架进行一个深入浅出的介绍,使大家对java集合有个深入的理解. 本篇文章主要具体介绍了Collection接口,Map接口以及Collection接口的三个子接口Set ...

  9. Java集合 List,Set,Map

      一.List:.有顺序以线性方式存储,可以存放重复对象 线程安全方法:List list = Collections.synchronizedList(new LinkedList(...)); ...

  10. Java集合中的Map接口

    jdk1.8.0_144 Map是Java三种集合中的一种位于java.util包中,Map作为一个接口存在定义了这种数据结构的一些基础操作,它的最终实现类有很多:HashMap.TreeMap.So ...

随机推荐

  1. frp实现内网穿透访问内网多台Linux服务器

    本文主要记录笔者在使用frp实现内网穿透访问内网多台Linux服务器的全过程,包括公网服务器的配置.frp服务端.客户端的下载与配置,以及配置systmctl来实现系统级启停frp,并记录我遇到的一些 ...

  2. 2023人形全能赛v831代码(包括YOLOv2识别和扫码以及颜色识别)

    v831 import time, math from maix import nn, camera, display, image import serial class YOLOv2: def _ ...

  3. 「Log」做题记录 2023.11.27-2023.12.31

    \(2023.11.27-2023.12.3\) \(\color{black}{P6965}\) 2-sat 是显著的. 对于无问号串,直接否定向自己连边即可,然后塞到 Trie 树里. Trie ...

  4. 纯js的购物车案例

    1 <style> 2 table { 3 text-align: center; 4 } 5 img { 6 height: 25px; 7 width: 22px; 8 } 9 < ...

  5. Spring的DI依赖注入

    xml中依赖注入bean bean标签下 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE b ...

  6. 「CF798E」 Mike and code of a permutation

    \(O(n^2)\)做法 让第\(i\)个点向\(p_j(p_j>p_i)\)的点连边 首先\(i\)肯定能连向\(a_i\),若当\(a_i==-1\),那么当前所有没打过标记的点向\(i\) ...

  7. UFT RegExp

  8. .Net Core Winform 缩放比例不是100%设置界面只能看到一半问题

    <PropertyGroup> <TargetFramework>net8.0-windows</TargetFramework> <Nullable> ...

  9. Sqlserver注释

    Sqlserver管理工具操作方法 https://www.xuebuyuan.com/411866.html 右键属性  扩展属性  名称指定特定名称:MS_Description   这就是注释了 ...

  10. 关于MongoDB查找一段时间内的数据

    things相当于一个已经创建好的表 命令: db.things.find({"createTime":{"$gt":"2015-5-21 0:0:0 ...