精华内容
下载资源
问答
  • java中的hashMap允许key为null的原因 一、首先看看为什么hashTable不允许key值为空 public synchronized V put(K key, V value) { if (value == null) { throw new NullPointerException(); } Entry<?,?>...

    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<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;
        }
    
    • 问题出在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只能有一个。
    展开全文
  • Why HashTable doesn’t allow null and HashMap does? To successfully store and retrieve objects from a HashTable, the objects used as keys must implement the hashCode method and the equals method. ...

    Why HashTable doesn’t allow null and HashMap does?

    To successfully store and retrieve objects from a HashTable, the objects used as keys must implement the hashCode method and the equals method. Since null is not an object, it can’t implement these methods. HashMap is an advanced version and improvement on the Hashtable. HashMap was created later.
    in one word, hashmap is more advanced. and we should choose hashmap instead of hashtable if there is no multiple thread involves.

    展开全文
  • 我们查看两个类的put方法的源码。 Hashtable: ... // Make sure the value is not null if (value == null) { throw new NullPointerException(); } // Makes sure the key is not already in the ha

    我们查看两个类的put方法的源码。
    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() ;//这里如果key=null,抛出异常
            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;
                }
            }
    

    HashMap:

    public V put(K key, V value) {
            return putVal(hash(key), key, value, false, true);
        }
    
    final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
                       boolean evict) {
            Node<K,V>[] tab; Node<K,V> p; int n, i;
            if ((tab = table) == null || (n = tab.length) == 0)
                n = (tab = resize()).length;
            if ((p = tab[i = (n - 1) & hash]) == null)
                tab[i] = newNode(hash, key, value, null);
            else {
                Node<K,V> e; K k;
                if (p.hash == hash &&
                    ((k = p.key) == key || (key != null && key.equals(k))))
                    e = p;
                else if (p instanceof TreeNode)
                    e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
                else {
                    for (int binCount = 0; ; ++binCount) {
                        if ((e = p.next) == null) {
                            p.next = newNode(hash, key, value, null);
                            if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
                                treeifyBin(tab, hash);
                            break;
                        }
                        if (e.hash == hash &&
                            ((k = e.key) == key || (key != null && key.equals(k))))
                            break;
                        p = e;
                    }
                }
                if (e != null) { // existing mapping for key
                    V oldValue = e.value;
                    if (!onlyIfAbsent || oldValue == null)
                        e.value = value;
                    afterNodeAccess(e);
                    return oldValue;
                }
            }
            ++modCount;
            if (++size > threshold)
                resize();
            afterNodeInsertion(evict);
            return null;
        }
    

    Hashtable的源码可以看出,如果value=null直接抛出空指针异常;而使用key.hashCode()不允许key=null,所以无论是key还是value都不能是null。而在HashMap中并没有这样的限制,key和value允许使用null。

    展开全文
  • 结论:HashMap对象的key、value值均可为null。 Hashtable对象的key、value值均不可为null。 且两者的的key值均不重复,若添加key相同的键值对,后面的value会自动覆盖前面的value,但不会报错。 1.从源码...

    结论:HashMap对象的key、value值均可为null。

               Hashtable对象的key、value值均不可为null。

    且两者的的key值均不能重复,若添加key相同的键值对,后面的value会自动覆盖前面的value,但不会报错。

     

    1.从源码分析

    HashMap从源码分析:

    HashMap在put的时候会调用hash()方法来计算key的hashcode值,可以从hash算法中看出当key==null时返回的值为0。因此key为null时,hash算法返回值为0,不会调用key的hashcode方法。

    HashTable从源码分析:

    上面可以看出当Hashtable存入的value为null时,抛出NullPointerException异常。如果value不为null,而key为空,在执行到int  hash = key.hashCode()时同样会抛出NullPointerException异常

    2.从设计师角度分析
    Hashtable是Java中的遗留类,现在不怎么用了,这里HashMap vs Hashtable有个解释。也许Hashtable类的设计者当时认为null作为key 和value 是没有什么用的。

    HashMap是之后的版本引进的类,它的接口Map表达的意义更为广泛,也许HashMap的设计者认为null作为key和value是有实际意义的,所以才允许为null.

    当然实际项目中,真的是有value为null的情况的。key为null的情况比较少见,但不代表没有。HashMap允许null为key和value应当是类的设计者思考让这个类更有用的设计吧。
    --------------------- 
    原文:https://blog.csdn.net/codeHaoHao/article/details/85392932 
     

    展开全文
  • Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复会覆盖),但允许值重复。 Hashmap是一个最常用的Map,它根据键的...HashMap最多只允许一条记录的键为Null允许多条记录的值为Null; ...
  • HashMap在put的时候会调用hash()方法来计算key的hashcode值,可以从hash算法中看出当key==null时返回的值0。因此key为null时,hash算法返回值0,不会调用key的hashcode方法。 HashTable从源码分析: 上面可以...
  • HashMap在put的时候会调用hash()方法来计算key的hashcode值,可以从hash算法中看出当key==null时返回的值0。因此key为null时,hash算法返回值0,不会调用key的hashcode方法。 上面可以看出当HashTable存入...
  • HashMap允许一个 null键,多个 null值,而 Hashtable不允许键和值为null。 从下图可以看到 HashMap 对 null 做了特殊处理: 但是 Hashtable 会在我们 put 空值的时候直接抛出空指针异常,如下图: 不过更详细的...
  • 1.从源码分析HashMap从源码分析:HashMap在put的时候会调用hash()方法来计算key的hashcode值,可以从hash算法中看出当key==null时返回的值0。因此key为null时,hash算法返回值0,不会调用key的hashcode方法。...
  • HashTable源代码: /** * Maps the specified <code>key</code> to the specified * <code>value</code> in this hashtable. Neither the key nor the * value can be <...null<...
  • 先说结论:hashmap允许多个null值和一个null键,hashtable不允许有任何null值和null键 基于jdk1.8源码分析: 我们都知道Map作为集合中比较重要的键值对集合,key不重复,所以可以初步判断hashmap和hashtable都不...
  • HashMap里面key为null存放到哪?

    千次阅读 2020-08-06 12:47:49
    我们知道HashMap集合是允许存放null值的 hashMap是根据key的hashCode来寻找存放位置的,那当key为null时, 怎么存储呢? 在put方法里头,其实第一行就处理了key=null的情况。 // HashMap的put方法 public V put(K ...
  • hashmap为什么允许key和value为空 但是hashtable却不允许呢?源码说这是特殊的map,难道它除了线程安全,还有别的吗?
  • HashMap<Node,Node> = map new HashMap(); map.put(null,null); 这样写是可以的
  • HashMap 允许插入键 null 的键值对。但是因为无法调用 null 的 hashCode() 方法,也就无法确定该键值对的桶下标,只能通过强制指定一个桶下标来存放。HashMap 使用第 0 个桶存放键 null 的键值对。 1.6版本 : ...
  • 1.HashMap支持null键和null值JSE...(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 import java.util.HashMap; public class te...
  • HashMap保证元素的顺序,HashMap能够将键设为null,也可以将值设为null。 与之对应的是Hashtable,(注意大小写:不是HashTable),Hashtable不将键和值设为null,否则运行时会报空指针异常错误; HashMap线程不...
  • 我们知道HashMap集合是允许存放null值的hashMap是根据key的hashCode来寻找存放位置的,那当key为null时, 怎么存储呢?在put方法里头,其实第一行就处理了key=null的情况。// HashMap的put方法public V put(K key, V...
  • importjava.util.HashMap; importjava.util.Map; importjava.util.TreeMap; publicclassTestMain { publicstaticvoidmain(String[] args) { // HashMap可以的键值可以是null, "". ...
  • 万元万元屋收万元万元0万度取得如的投下收销售、销(系某服、投投资业2益1益)元8年内被装生自产租房资收资收赠收角余、接企业产企、出从境入:入3入2入5服装分回料收收入售边受捐,()万得额应纳元年度则该企业税所...
  • 因为hashtable,concurrenthashmap它们是用于多线程的,并发的 ,如果map.get(key)得到了null,不判断到底是映射的value是null,还是因为没有找到对应的key...hashtable为什么就不containKey(key) 一个线程先get(ke
  • * 目标:认识HashMap只能有一个key为null值的键值对的原理; * * 那接下来还是和以往一样创建一个自己的测试类; * @author Administrator * */ public class HashMapTest { /** * 程序的入口|主函数; * @...
  • 我们知道,HashMap允许null 的 key 和 null 的 value,但是当加入多个null key时,后面的数据会覆盖前面的数据。实验如下: 源码 public static void main(String[] args) { HashMap<Integer,String> ...
  • HashMap put返回Null的问题

    千次阅读 2018-05-22 11:17:19
    今早一过来就遇到一个bug,result.setData数据没写入成功,具体代码如下:result.setData(new ...debug后发现data中的数据是null;查hashMap源码:public HashMap() { this.loadFactor = DEFAULT_LOAD_FACTOR;...
  • 在一篇博客里看到的,这一块讲解的很好,所以截图啦
  • Hashtable 是线程安全的,ConcurrentHashMap 和 Hashtable 是不允许 null 作为键和值的,HashMap允许null键值
  • 1 实验 1.1 HashMap public static void main(String[] args) { HashMap<String, Object> map = new HashMap<...map.put(null, null); System.out.println(map); } 1.2 ConcurrentHashMap public stati...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 132,726
精华内容 53,090
关键字:

hashmap为什么能允许null