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 否则直接抛出异常!!对吧!到此结束!!!

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐