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()方法)。

目录
相关文章
|
10月前
|
安全 Java API
【Java性能优化】Map.merge()方法:告别繁琐判空,3行代码搞定统计累加!
在日常开发中,我们经常需要对Map中的值进行累加统计。}else{代码冗长,重复调用get()方法需要显式处理null值非原子操作,多线程下不安全今天要介绍的方法,可以让你用一行代码优雅解决所有这些问题!方法的基本用法和优势与传统写法的对比分析多线程安全版本的实现Stream API的终极优化方案底层实现原理和性能优化建议一句话总结是Java 8为我们提供的Map操作利器,能让你的统计代码更简洁、更安全、更高效!// 合并两个列表});简单累加。
885 0
|
JSON Java 关系型数据库
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
在Java中,使用mybatis-plus更新实体类对象到mysql,其中一个字段对应数据库中json数据类型,更新时报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
1517 4
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
|
存储 Java API
Java交换map的key和value值
通过本文介绍的几种方法,可以在Java中实现Map键值对的交换。每种方法都有其优缺点,具体选择哪种方法应根据实际需求和场景决定。对于简单的键值对交换,可以使用简单遍历法或Java 8的Stream API;对于需要处理值不唯一的情况,可以使用集合存储或Guava的Multimap。希望本文对您理解和实现Java中的Map键值对交换有所帮助。
387 1
|
存储 缓存 安全
在Java的Map家族中,HashMap和TreeMap各具特色
【10月更文挑战第19天】在Java的Map家族中,HashMap和TreeMap各具特色。HashMap基于哈希表实现,提供O(1)时间复杂度的高效操作,适合性能要求高的场景;TreeMap基于红黑树,提供O(log n)时间复杂度的有序操作,适合需要排序和范围查询的场景。两者在不同需求下各有优势,选择时需根据具体应用场景权衡。
187 2
Kam
|
Java
java中使用@Value获取值为null问题解决:
java中使用@Value获取值为null问题解决
Kam
1876 0
|
5月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
269 1
|
5月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
285 1
|
6月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
248 0
|
6月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
436 16

热门文章

最新文章