一、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方法。
原创文章,作者:RMAT,如若转载,请注明出处:https://www.506064.com/n/142192.html