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

时间:2018-03-06 08:57:39

标签: java hashmap

我正在尝试检查一个密钥是否在地图(Java)中,并且我对我的一个解决方案的工作原理和另一个解决方案的工作原理有点困惑。

特别是:当我将myMap.get(s)直接与null进行比较时,它会有效,但是当我首先将myMap.get(s)保存到变量(number)然后与{{1它会抛出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\n", 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\n", number); }else { System.out.println("Not in dict"); } } } 也只是一个int?

感谢阅读。

4 个答案:

答案 0 :(得分:2)

int永远不会是null,而Integer可以。{/ p>

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\n", number);
} else {
    System.out.println("Not in dict");
}

答案 1 :(得分:0)

number属于原始类型 int,因此无法null
如果您改为撰写Integer number = myMap.get(s);,则null - 检查会有效。

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

答案 2 :(得分:0)

在第二种情况下,您将值存储在&#34; int&#34; varible,这是一个原始的,永远不能为null。将其更改为&#34;整数&#34;它有效。

答案 3 :(得分:0)

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