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 ...
随机推荐
- frp实现内网穿透访问内网多台Linux服务器
本文主要记录笔者在使用frp实现内网穿透访问内网多台Linux服务器的全过程,包括公网服务器的配置.frp服务端.客户端的下载与配置,以及配置systmctl来实现系统级启停frp,并记录我遇到的一些 ...
- 2023人形全能赛v831代码(包括YOLOv2识别和扫码以及颜色识别)
v831 import time, math from maix import nn, camera, display, image import serial class YOLOv2: def _ ...
- 「Log」做题记录 2023.11.27-2023.12.31
\(2023.11.27-2023.12.3\) \(\color{black}{P6965}\) 2-sat 是显著的. 对于无问号串,直接否定向自己连边即可,然后塞到 Trie 树里. Trie ...
- 纯js的购物车案例
1 <style> 2 table { 3 text-align: center; 4 } 5 img { 6 height: 25px; 7 width: 22px; 8 } 9 < ...
- Spring的DI依赖注入
xml中依赖注入bean bean标签下 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE b ...
- 「CF798E」 Mike and code of a permutation
\(O(n^2)\)做法 让第\(i\)个点向\(p_j(p_j>p_i)\)的点连边 首先\(i\)肯定能连向\(a_i\),若当\(a_i==-1\),那么当前所有没打过标记的点向\(i\) ...
- UFT RegExp
- .Net Core Winform 缩放比例不是100%设置界面只能看到一半问题
<PropertyGroup> <TargetFramework>net8.0-windows</TargetFramework> <Nullable> ...
- Sqlserver注释
Sqlserver管理工具操作方法 https://www.xuebuyuan.com/411866.html 右键属性 扩展属性 名称指定特定名称:MS_Description 这就是注释了 ...
- 关于MongoDB查找一段时间内的数据
things相当于一个已经创建好的表 命令: db.things.find({"createTime":{"$gt":"2015-5-21 0:0:0 ...