Java集合——4.使用Map
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:基于哈希表的实现
HashMap是Map接口的主要实现类,它基于哈希表(Hash Table)实现,具有以下特点:
- 查找效率高:平均情况下,
put、get等操作的时间复杂度为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的键,必须同时覆写这两个方法,否则可能导致键无法正确查找。
(之后章节讲解)
注意事项
注意
null键的处理:HashMap允许null键,但TreeMap不允许,使用时需注意初始化容量设置:创建
HashMap时可指定初始容量Map<String, Integer> map = new HashMap<>(16); // 初始容量16
遍历顺序不可依赖:
HashMap的遍历顺序不固定,若需要固定顺序应使用LinkedHashMap并发环境谨慎使用:
HashMap非线程安全,多线程环境应使用ConcurrentHashMap
总结
- 理解
Map的特性和适用场景 - 掌握Map常用的增、删、改、查、遍历方法
- 自定义对象作为键时,必须同时覆写
equals和hashCode方法(之后章节讲解)
Java集合——4.使用Map的更多相关文章
- Java集合框架之map
Java集合框架之map. Map的主要实现类有HashMap,LinkedHashMap,TreeMap,等等.具体可参阅API文档. 其中HashMap是无序排序. LinkedHashMap是自 ...
- Java 集合系列 15 Map总结
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- Java 集合系列 08 Map架构
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- Java集合框架之Map接口浅析
Java集合框架之Map接口浅析 一.Map接口综述: 1.1java.util.Map<k, v>简介 位于java.util包下的Map接口,是Java集合框架的重要成员,它是和Col ...
- 【JAVA集合框架之Map】
一.概述.1.Map是一种接口,在JAVA集合框架中是以一种非常重要的集合.2.Map一次添加一对元素,所以又称为“双列集合”(Collection一次添加一个元素,所以又称为“单列集合”)3.Map ...
- Java集合框架中Map接口的使用
在我们常用的Java集合框架接口中,除了前面说过的Collection接口以及他的根接口List接口和Set接口的使用,Map接口也是一个经常使用的接口,和Collection接口不同,Map接口并不 ...
- java集合框架07——Map架构与源代码分析
前几节我们对Collection以及Collection中的List部分进行了分析,Collection中还有个Set,因为Set是基于Map实现的,所以这里我们先分析Map,后面章节再继续学习Set ...
- 「 深入浅出 」java集合Collection和Map
本系列文章主要对java集合的框架进行一个深入浅出的介绍,使大家对java集合有个深入的理解. 本篇文章主要具体介绍了Collection接口,Map接口以及Collection接口的三个子接口Set ...
- Java集合 List,Set,Map
一.List:.有顺序以线性方式存储,可以存放重复对象 线程安全方法:List list = Collections.synchronizedList(new LinkedList(...)); ...
- Java集合中的Map接口
jdk1.8.0_144 Map是Java三种集合中的一种位于java.util包中,Map作为一个接口存在定义了这种数据结构的一些基础操作,它的最终实现类有很多:HashMap.TreeMap.So ...
随机推荐
- 基于AI来汉化Joomla扩展的尝试
之前Joomla中文网的汉化平台使用Goolge翻译API和百度翻译API来实现自动汉化,这种方案存在很大的一个问题就是没有足够的上下文支持使得翻译的结果并不理想,另外,API接口处理包含HTML字符 ...
- kubernetes之Ingress工作原理
一.kubernetes集群外部访问的方式 在kubernetes集群中,如果外部的应用需要访问集群内部的服务,可以通过NodePort Service.LoadBalancer Service.In ...
- 了解php当中简单的单例模式
本文由 ChatMoney团队出品 单例模式是一种常用的设计模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点来获取这个实例.在 PHP 中实现单例模式通常有三种形式:饿汉式(Eager ...
- 故障处理:Oracle一体机磁盘故障时磁盘组重平衡失败的故障处理
最近半个月遇到有两个客户的Oracle Exadata一体机出现物理磁盘的损坏,一个客户是机械磁盘.一个客户是FLASH磁盘.很巧的是这两个客户他们的日常运维过程中都是只看物理服务器的故障信号灯.但是 ...
- MongoDB入门实战教程(1)
对于后端开发工程师,NoSQL是一个需要掌握的技术点,而NoSQL中比较火热的技术当属MongoDB.欢迎入门MongoDB,进入无模式的文档数据库世界. 1 关于MongoDB 通过下面几个问题,我 ...
- C#/.NET/.NET Core优秀项目和框架2025年6月简报
前言 公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的详细介绍.功能特点.使用方式以及部分功能 ...
- 前端开发系列122-进阶篇之Floating point addition
本文简单说明 JavaScript 中常见的进制转换函数以及浮点数计算的注意点. 如何把任意进制的数据转换为十进制? 假设我们有二进制数据110,如果要把该数据转换为十进制数据可以参考下面的处理过程. ...
- 前端开发系列025-基础篇之Canvas绘图(路径)
本文将介绍Canvas中的路径.矩形以及描边和填充等绘制方法,非零正交原则以及线性渐变等内容,并提供折线图和柱状图等综合案例. 一.Canvas路径和状态 核心API介绍 设置绘制的起点 语法 ctx ...
- SciTech-Mathmatics-Lean : 数学推导的自动化形式化证明语言
SciTech-Mathmatics-Lean : 数学推导的自动化形式化证明语言 Official Site https://lean-lang.org/documentation/ Lean4 - ...
- SciTech-Mathematics-数学专业笔记总结
数学专业笔记总结: https://gitee.com/duanjinyi/real-number-set-and-function