HashMap、HashTable、ConcurrentHashMap放入null源码

HashMap

map.put(null, null);

public V put(K key, V value) {
    // hash key的值
    return putVal(hash(key), key, value, false, true);
}

static final int hash(Object key) {
    int h;
    // 如果key为null,hash key的值直接返回0
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

通过源码:hashmap放入key和value都是null,可以成功,key通过hash之后返回的是0,多次放入key为null的值,会覆盖之前放入的key为null的value值

HashTable

map.put(null, null);

public synchronized V put(K key, V value) {
    // Make sure the value is not null
    // 如果value为null,直接抛空指针异常
    if (value == null) {
         throw new NullPointerException();
     }

     // Makes sure the key is not already in the hashtable.
     Entry<?,?> tab[] = table;
     // key为null的情况下,获取key的hashcode报空指针异常,所以key可value都不可以为null
     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;
}

不允许放入key和value为null的值

HashSet

hashSet.add(null);

public boolean add(E e) {
    // 使用的hashmap的put方法,key是null,可以成功放入,多次放入会覆盖前面放入的值
    return map.put(e, PRESENT)==null;
}

ConcurrentHashMap

concurrentHashMap.put(null, null);

final V putVal(K key, V value, boolean onlyIfAbsent) {
        // 如果key或者value任何一个为null,直接抛空指针异常
        if (key == null || value == null) throw new NullPointerException();
        int hash = spread(key.hashCode());
        int binCount = 0;
}

不允许key或value为null

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值