Java中的Map接口与底层解析
Map接口
Map接口实现类的特点
1). Map
与 Collection
并列存在, 用于保存具有映射关系的数据: {Key, Value}
2), Map
中 的Key和Value 可以是任何引用类型的数据, 会封装到HashMap$Node
对象中
3). Map
中的Key不可以重复, 但是Value可以重复, 如果放一个相同的Key, 就会替换对应的Value
4). Key与Value一一对应, 可以通过Key索引到唯一的Value
源码解析 之 Entry
HashMap
中的Node
实现了Entry
接口, 所以一个键值对也可以称之为一个Entry
解读:
1). k-v 最后是HashMap$Node = node = newNode(hash, key, value, null);
2). k-v 为了方便遍历, 还会创建EntrySet
集合, 该集合存放的元素类型是Entry
, 而一个
Entry
对象就有k, v
transient Set<Map.Entry<K,V>> entrySet;
但是注意, 其实entrySet里面存放的对象运行类型是HashMap$Node
, 这里有个向上转型
因为HashMap$Node
实现了Map.Entry
这个接口
public class Main {
public static void main(String[] args) {
HashMap hashMap = new HashMap();
hashMap.put("no1", "111");
hashMap.put("no2", "222");
Set set = hashMap.entrySet();
System.out.println(set.getClass()); // 这里发现EntrySet也是一个内部类
for (Object o : set) {
System.out.println(o.getClass());
// 取出Key和Value
Map.Entry entry = (Map.Entry)o;
System.out.println(entry.getKey() + " " + entry.getValue());
}
}
}
3). 除此之外, Map也提供了keySet()
方法 和 Values
方法
public class Main {
public static void main(String[] args) {
HashMap hashMap = new HashMap();
hashMap.put("no1", "111");
hashMap.put("no2", "222");
Set set = hashMap.keySet();
Collection collection = hashMap.values();
System.out.println(set.getClass());
System.out.println(collection.getClass());
}
}
根据输出可以发现, Values
和 KeySet
也是 HashMap
的内部类!
class java.util.HashMap$KeySet
class java.util.HashMap$Values
Map接口使用方式
Map接口常用方法
1). put()
添加
2). remove()
根据键删除映射关系
3). get()
根据键获取值
4). size()
获取元素个数
5). isEmpty()
判断元素个数是否为0
6). clear()
清除
7). containKey()
查找键是否存在
Map接口遍历方式
@SuppressWarnings("all")
public class Main {
public static void main(String[] args) {
HashMap hashMap = new HashMap();
String str = "Number";
for (int i = 1; i <= 10; i++) {
hashMap.put(str + i, i);
}
// (1) 先取出所有的key, 然后再取出对应的value
Set keySet = hashMap.keySet();
for (Object key : keySet) {
System.out.println(key + " - " + hashMap.get(key));
}
// (2) 取出所有的value, 但是不能取出对应的key
Collection values = hashMap.values();
for (Object v : values) {
System.out.println("value = " + v);
}
// (3) 通过EntrySet获取
Set entrySet = hashMap.entrySet();
for (Object o : entrySet) {
Map.Entry entry = (Map.Entry)o; // HashMap$Node 并没有提供相应的获取key和value的方法, 所以要向下转型
System.out.println(entry.getKey() + " - " + entry.getValue());
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)