Map的key可以为null吗

发布时间:2023-05-19

一、Null作为map的key

在Java中,map是一种键值对的集合,它由一个键和一个值组成。键是唯一的,而值可以重复。在使用map时,我们可以使用任何对象作为键,包括null。

Map<String, String> map = new HashMap<>();
map.put(null, "value");

上面的代码中就使用了null作为键,这是合法的。 但是,如果我们使用null作为键,那么要取出值时就需要使用null作为参数,否则会报错。

String value = map.get(null);

如果不加判断直接使用非null的键取值,那么会抛出NullPointerException异常。

String value = map.get("key"); // 抛出NullPointerException异常

二、使用Java8的Optional解决NullPointerException问题

为了解决NullPointerException问题,我们可以使用Java8中的Optional,它是一种容器类,用于包装可能为null的对象。使用Optional包装对象可以避免在使用代码时产生NullPointerException异常。

Map<String, String> map = new HashMap<>();
map.put(null, "value");
Optional<String> optionalValue = Optional.ofNullable(map.get(null));
String value = optionalValue.orElse("default");

这里使用了Optional.ofNullable方法包装了map中的value,然后使用orElse方法在value为null时,返回"default"字符串。

三、使用其他对象作为map的key

我们还可以使用其他对象作为map的key,包括自定义对象。但是,如果我们希望使用自定义对象作为键,那么需要重写hashCode和equals方法,否则就会出现相同的对象却无法找到对应的值的情况。

public class User {
    private String name;
    public User(String name) {
        this.name = name;
    }
    @Override
    public int hashCode() {
        return Objects.hash(name);
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        User user = (User) obj;
        return Objects.equals(name, user.name);
    }
}
Map<User, String> map = new HashMap<>();
User user = new User("Tom");
map.put(user, "value");
String value = map.get(user);

上面的代码中,我们使用自定义的User对象作为map的key,并重写了hashCode和equals方法。这样,即使使用相同的User对象,也可以正确地找到它所对应的值。

四、总结

在Java中,map中的key可以为null,但是要注意在取值时使用null作为参数。如果我们希望避免NullPointerException异常,可以使用Java8的Optional来处理。除了null,我们还可以使用其他对象作为map的key,但是要注意重写hashCode和equals方法。