一、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方法。