Java中的Map接口与底层解析

Map接口

Map接口实现类的特点

1). MapCollection 并列存在, 用于保存具有映射关系的数据: {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());
    }
}

根据输出可以发现, ValuesKeySet 也是 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());
        }

    }
}
posted @   Xingon2356  阅读(3)  评论(0编辑  收藏  举报
编辑推荐:
· 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)
点击右上角即可分享
微信分享提示