检查密钥是否在映射中 - 一种方式有效,另一种方式无效

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了检查密钥是否在映射中 - 一种方式有效,另一种方式无效相关的知识,希望对你有一定的参考价值。

我正在尝试检查密钥是否在地图(Java)中,并且对我为什么其中一个解决方案起作用而另一个不起作用有点困惑。

特别是:当我将myMap.get(s)直接与null进行比较时,它可以工作,但是当我第一次将myMap.get(s)保存到变量(number)然后与null进行比较时,它会抛出The operator != is undefined for the argument type(s) int, null错误。

有效的代码:

import java.util.*;
import java.io.*;

class test1{
    public static void main(String []argh){
        // Create a map
        Map<String, Integer> myMap; 
        myMap = new HashMap<String, Integer>();
        // Make an entry in the map
        String key = "hello";
        int value = 5;
        myMap.put(key, value);


        String s = "hi";

        if (myMap.get(s) != null)
        {
            int number = myMap.get(s);
            System.out.printf("%s
", number);
        }else
        {
            System.out.println("Not in dict");
        }
    }
}

代码不起作用:

import java.util.*;
import java.io.*;

class test2{
    public static void main(String []argh){
        // Create a map
        Map<String, Integer> myMap; 
        myMap = new HashMap<String, Integer>();
        // Make an entry in the map
        String key = "hello";
        int value = 5;
        myMap.put(key, value);


        String s = "hi";
        int number = myMap.get(s);
        if (number != null)
        {
            System.out.printf("%s
", number);
        }else
        {
            System.out.println("Not in dict");
        }
    }
}

我想知道我应该如何理解这一点,因为对我而言myMap.get(s)也只是一个整数?

谢谢阅读。

答案

int永远不会是null,但Integer可以。

myMap.get(s)返回Integer,可以是null

int number = myMap.get(s);

如果NullPointerException返回myMap.get(s),将抛出null

如果要将值安全地分配给变量,请使用Integer变量:

Integer number = myMap.get(s);
if (number != null) {
    System.out.printf("%s
", number);
} else {
    System.out.println("Not in dict");
}
另一答案

number是原始类型int,因此不能是null。 如果你改为写Integer number = myMap.get(s);,你的null-check就行了。

但要检查是否存在密钥,您应该使用containsKey(...)

另一答案

在第二种情况下,您将值存储在“int”变量上,该变量是基元,永远不能为null。将其更改为“整数”,它的工作原理。

另一答案

int number = myMap.get(s);返回Integer,它可以是null。因此,当它是null时,原始的int不能保持该值并将导致异常。要么使用Integer来存储值,要么在访问之前使用contains()进行检查。

以上是关于检查密钥是否在映射中 - 一种方式有效,另一种方式无效的主要内容,如果未能解决你的问题,请参考以下文章

eclipse中另一种有效的安装三方插件方式

这是 ManyToMany JPA/Hibernate 关系还是有另一种映射方式?

hibernate关联映射注解

Xshell使用密钥方式登陆

另一种思路比较2个日期是否相等的方式

基于Xshell使用密钥方式连接远程主机