Map容器的Key、Value是否可以为null问题
Map接口下实现的几个常用类:HashMap、TreeMap、ConcurrentHashMap、Hashtable这几个类均有put()方法,可以给这些容器中添加元素对象;但是,key和value是否可以为空呢?这个图说明HashMap的key和value都允许为null;而Hashtabe、ConcurrentHashMap是都不允许的,TreeMap允许value为null;现在我们通过ID
·
Map接口下实现的几个常用类:
HashMap、TreeMap、ConcurrentHashMap、Hashtable
这几个类均有put()方法,可以给这些容器中添加元素对象;但是,key和value是否可以为空呢?
这个图说明HashMap的key和value都允许为null;而Hashtabe、ConcurrentHashMap是都不允许的,TreeMap允许value为null;现在我们通过IDEA查看他们的源代码有何不同;
1.首先是HashMap:
下面是源码部分:
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
value处。
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
通过putVal里面的参数调用的方法hash()可以看出,当key为null时返回0不会抛出异常,而value也是直接添加到
2.其次是Hashtable:
*/
public synchronized V put(K key, V value) {
// Make sure the value is not null
if (value == null) {
throw new NullPointerException();
}
// Makes sure the key is not already in the hashtable.
Entry<?,?> tab[] = table;
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
@SuppressWarnings("unchecked")
Entry<K,V> entry = (Entry<K,V>)tab[index];
for(; entry != null ; entry = entry.next) {
if ((entry.hash == hash) && entry.key.equals(key)) {
V old = entry.value;
entry.value = value;
return old;
}
}
addEntry(hash, key, value, index);
return null;
}
上述代码是源码部分,直接告诉我们,Hashtable是不允许value为null的,否则直接抛出异常;显然对吧!!!!其次,key部分如果为空,那么key.equals(0方法也会抛出异常,因此key也不允许为null;
3.TreeMap:
Objects.requireNonNull(key);
@SuppressWarnings("unchecked")
可见其不允许key为null;
4.ConcurrentHashMap:
final V putVal(K key, V value, boolean onlyIfAbsent) {
if (key == null || value == null) throw new NullPointerException();
int hash = spread(key.hashCode());
int binCount = 0;
由此可见,key和value都不允许为null 否则直接抛出异常!!对吧!到此结束!!!
更多推荐
已为社区贡献1条内容
所有评论(0)