Java Map的containsKey(Object key)和containsValue(Object value)方法

简介: public void testContainsKeyOrValue(){ Scanner sc = new Scanner(System.
public void testContainsKeyOrValue(){

        Scanner sc = new Scanner(System.in);
        //Key
        System.out.println("请输入要查询的学生id:");
        String id = sc.next();
        System.out.println("你输入的学生id为:"+id+",在学生映射表中是否存在"+
            students.containsKey(id));
        if(students.containsKey(id)){
            System.out.println("对应的学生为:"+students.get(id).name);
        }

        //Value
        System.out.println("请输入要查询的学生姓名:");
        String name = sc.next();
        if(students.containsValue(new Student(null,name))){
            System.out.println("在学生映射表中,确实包含学生:"+name);
        }
        else{
            System.out.println("在学生映射表中不存在这个学生");
        }
    }

运行结果:

请输入学生id: 
1 
输入学生姓名以创建学生: 
小明 
成功添加学生:小明 
请输入学生id: 
2 
输入学生姓名以创建学生: 
哈哈 
成功添加学生:哈哈 
请输入学生id: 
3 
输入学生姓名以创建学生: 
极客咯 
成功添加学生:极客咯 
总共有3个学生 
学生:小明 
学生:哈哈 
学生:极客咯 
请输入要查询的学生id: 
2 
你输入的学生id为:2,在学生映射表中是否存在true 
对应的学生为:哈哈 
请输入要查询的学生姓名: 
小明 
在学生映射表中不存在这个学生

结果分析:
可以看到,通过containsKey(Object key)方法比较的结果返回true,是我们想要的结果。通过containsValue(Object value)方法比较的结果返回是false,但是我们确实是有一个名字叫小明的学生啊。为什么呢?

查看containsKey(Object key)和containsValue(Object value)的API说明:

  • containsKey(Object key):Returns true if this map contains a mapping for the specified key. More formally, returns true if and only if this map contains a mapping for a key k such that (key==null ? k==null : key.equals(k)). (There can be at most one such mapping.)
  • containsValue(Object value):Returns true if this map maps one or more keys to the specified value. More formally, returns true if and only if this map contains at least one mapping to a value v such that (value==null ? v==null : value.equals(v)). This operation will probably require time linear in the map size for most implementations of the Map interface.

可以看到,都调用了equals()方法进行比较!因此可以回答为什么了,我们的Key是String类型的,String类型的equals()比较的是字符串本身的内容,所以我们根据键去查找学生的结果是true。而Value是Student类型的,equals()是直接用==实现的,==比较的是对象的引用地址,当然返回结果是false(参考equals()与==的区别与实际应用)。所以,要在Map中通过学生的名字判断是否包含该学生,需要重写equals()方法。
在Student.java中重写equals()方法:

@Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Student other = (Student) obj;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }

再次运行,得到运行结果:
请输入学生id:
1
输入学生姓名以创建学生:
小明
成功添加学生:小明
请输入学生id:
2
输入学生姓名以创建学生:
哈哈
成功添加学生:哈哈
请输入学生id:
3
输入学生姓名以创建学生:
极客咯
成功添加学生:极客咯
总共有3个学生
学生:小明
学生:哈哈
学生:极客咯
请输入要查询的学生id:
2
你输入的学生id为:2,在学生映射表中是否存在true
对应的学生为:哈哈
请输入要查询的学生姓名:
小明

在学生映射表中,确实包含学生:小明

结果分析:
通过重写equals()实现了Map中通过学生姓名查找学生对象(containsValue()方法)。

目录
相关文章
|
3天前
|
安全 Java API
JAVA三种权限认证框架的搭建方法
SaToken、JustAuth和MaxKey是三个用于身份认证和权限管理的工具。SaToken是轻量级框架,简化登录、权限、OAuth2.0等认证,适合中小型项目;JustAuth是第三方授权登录库,支持多种社交平台,易于集成;MaxKey是企业级IAM产品,提供复杂的权限管理和统一认证,支持多种标准协议及社交账号集成。
|
1天前
|
Java 编译器 数据库
滚雪球学Java(40):解读Java面向对象编程中的方法和继承,打造可维护的代码库
【5月更文挑战第15天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
13 4
滚雪球学Java(40):解读Java面向对象编程中的方法和继承,打造可维护的代码库
|
2天前
|
安全 Java 开发者
Java多线程同步方法
【5月更文挑战第24天】在 Java 中,多线程同步是保证多个线程安全访问共享资源的关键。Java 提供了几种机制来实现线程间的同步,保证了操作的原子性以及内存的可见性。
12 3
|
3天前
|
Java
【JAVA学习之路 | 进阶篇】方法引用与构造器引用
【JAVA学习之路 | 进阶篇】方法引用与构造器引用
|
3天前
|
Java 测试技术 C++
【JAVA学习之路 | 进阶篇】File类及常用方法
【JAVA学习之路 | 进阶篇】File类及常用方法
|
3天前
|
存储 Java
【JAVA学习之路 | 进阶篇】Map接口及其实现类及常用方法
【JAVA学习之路 | 进阶篇】Map接口及其实现类及常用方法
|
3天前
|
存储 Java
【JAVA学习之路 | 进阶篇】Set及其实现类与常用方法
【JAVA学习之路 | 进阶篇】Set及其实现类与常用方法
|
11天前
|
存储 安全 Java
Java一分钟之-Map接口与HashMap详解
【5月更文挑战第10天】Java集合框架中的`Map`接口用于存储唯一键值对,而`HashMap`是其快速实现,基于哈希表支持高效查找、添加和删除。本文介绍了`Map`的核心方法,如`put`、`get`和`remove`,以及`HashMap`的特性:快速访问、无序和非线程安全。讨论了键的唯一性、`equals()`和`hashCode()`的正确实现以及线程安全问题。通过示例展示了基本操作和自定义键的使用,强调理解这些概念对编写健壮代码的重要性。
16 0
|
7月前
|
存储 Java
java集合框架------Map接口与实现类
java集合框架------Map接口与实现类
|
11天前
|
存储 安全 Java
[Java基础面试题] Map 接口相关
[Java基础面试题] Map 接口相关