【问题标题】:What does `putForNullKey` method do inside the `put` method in hashmap?`putForNullKey` 方法在 hashmap 的`put` 方法中做了什么?
【发布时间】:2013-04-22 16:59:08
【问题描述】:

今天我在修复一个缺陷,发现了一件很有趣的事情。

我试图在 hashmap 中放置一个键值对。 (我假设密钥在那里,但后来发现它为空)。

因此,在使用 key 检索值时,我并没有每次都得到 null。

后来发现 key 是 null ,我更正了。

然后我看到Hashmapput 方法的代码。

为什么keynull 时不给出异常?

它调用putForNullKey 私有方法。它有什么作用?

但我认为如果键为空,它应该给出一些异常。

为什么他们没有那样实现它? 如果键为空,键值对就没有用了吗?

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/HashMap.java#HashMap.putForNullKey%28java.lang.Object%29

【问题讨论】:

    标签: java collections hashmap


    【解决方案1】:

    HashMap 只允许一个空键。因此,每当有人想将某个值放入 null 时,它会在 put 方法中调用 putForNullKey 方法,并在 putForNullKey 方法中将值放在零索引处。

    为了通过 null 键获取值,它还有一个 getForNullKey 方法,它从 get 方法内部调用。

    【讨论】:

      【解决方案2】:

      来自 HashMap 的 Javadoc:

      Hash table based implementation of the Map interface.
      This implementation provides all of the optional map
      operations, and permits null values and the null key
      

      这是设计使然,并且已记录在案。 “为什么”的问题很难回答,但自从 HashMap(以及在此之前,Hashtable)被引入以来就是这样(编辑,实际上,Hashtable 不允许空值)。

      至于为什么它有 putForNullKey,那么 HashMap 依赖于 key 的 hashCode() 来放置它,并且由于它无法从 null 值中获取 hashCode(),所以它必须作为一个特殊情况。

      【讨论】:

        【解决方案3】:

        这是HashtableHashMap 之间的区别之一。

        Hashtable 不允许空键或空值。 HashMap 允许一个空键和任意数量的空值。

        通常,我们使用 null 键来表示默认情况(即,如果给定键不存在时应使用的值)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-10-29
          • 1970-01-01
          • 2013-12-12
          • 2011-01-04
          • 2022-12-17
          • 2018-10-04
          • 1970-01-01
          相关资源
          最近更新 更多