栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java中的hashMap允许key为null的原因

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java中的hashMap允许key为null的原因

java中的hashMap允许key为null的原因 一、首先看看为什么hashTable不允许key值为空
    public synchronized V put(K key, V value) {
        if (value == null) {
            throw new NullPointerException();
        }
        Entry tab[] = table;
        int hash = key.hashCode();//问题出在这里!!!(key为null,key.hashCode()报空指针异常。)
        int index = (hash & 0x7FFFFFFF) % tab.length;
        @SuppressWarnings("unchecked")
        Entry entry = (Entry)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;
    }
  • 问题出在int hash = key.hashCode()这里,当key为null时,key.hashCode()会报空指针异常。
  • 所以只要改写hashCode函数就可以了,hashMap就是这么做的。
二、看看hashMap中的put函数 1、java1.8中hashMap中的put函数
    public V put(K key, V value) {
           //采用hash(key)来计算key的hashCode值。
            return putVal(hash(key), key, value, false, true);
    }
  • put函数中用到了putVal()方法,其中的hash(key)就是计算key的hashCode值,那么我们看看和hashCode有什么异同。
2、hash()方法
    static final int hash(Object key) {
        int h;
        //当key等于null的时候,不走hashCode()方法
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }
  • 可以看到,在key==null的时候,将key的hash值置为0,从而解决了当key为null时,走hashCode方法导致空指针异常。
总结
  • hashMap中使用hash()方法来计算key的哈希值,当key为空时,直接另key的哈希值为0,不走key.hashCode()方法;
  • hashMap虽然支持key和value为null,但是null作为key只能有一个,null作为value可以有多个;
  • 因为hashMap中,如果key值一样,那么会覆盖相同key值的value为最新,所以key为null只能有一个。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/292753.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号