今天偶然之间,发现Map接口的put方法的使用问题,先看下面代码:
public class TestMap {
public static void main(String[] args) {
Map m1 = new HashMap();
m1.put(null, null);
System.out.println("m1.size="+m1.size());
Map m2 = new TreeMap();
m2.put(null, null);
System.out.println("m1.size="+m2.size());
Map m3 = new Hashtable();
m3.put("key", null);
}
}
这段代码的打印输出是:
m1.size=1
m1.size=1
Exception in thread "main" java.lang.NullPointerException
at java.util.Hashtable.put(Hashtable.java:396)
at TestMap.main(TestMap.java:16)
我们可以发现HashMap与TreeMap的key与value都可以为null, 而HashTable则都不可以为null,为什么会这样?最后,我查看了API文档,文档分别说明如下:
HashMap与TreeMap的返回值说明文档如下:
previous value associated with specified key, or null if there was no mapping for key. A null return can also indicate that the HashMap previously associated null with the specified key.
而HashTable的返回值说明文档如下:
the previous value of the specified key in this hashtable, or null
if it did not have one.
而且HashTable的异常文档明确说明:
NullPointerException - if the key or value is null
.
所以上面代码的结果应该是正确的,但是我有一点疑惑,若是key/value可以为null,那么某次我用get方法返回的值为null的话,不能确定上因为没有这个值,还是这个值确实是为null.
总之,我认为我们没有必要每次都要检测从Map取出的value,因为在很多时候都是我们自己在组织Map对象, 但是这还是带来了问题,假如我使用的某个接口返回值是Map类型,但是我们不知道该对象到底时什么具体类型,在取值时,是否需要检测取出的值.我想这要看什么情况了,不过,我想我是从来不检测这些值的.