【问题标题】:Null keys in Java collections that are not sortedJava 集合中未排序的空键
【发布时间】:2017-06-08 18:55:54
【问题描述】:

请有人给我解释一下:

我很清楚为什么在 Java 排序集合中禁止空键(值) 但是为什么在 HashTable、ConcurrentHashMap 和...属性中不允许使用它们

它是否与线程安全有关?

在 CopyOnWriteArrayList 中是否允许/禁止空值?为什么?

谢谢

【问题讨论】:

  • 因为value的存在与key的存在有关,否则就没有HashMap的概念了!
  • 文档直接回答你的最后一个问题。
  • 一个重要的原因是 Java 开发人员开始相信 null 在集合中是个坏主意 :)

标签: java sortedset sortedmap


【解决方案1】:

这里有 2 个问题。两者都可以通过阅读文档来回答。

1 - 为什么 HashTable、ConcurrentHashMap 和 Properties 不能接收“null”作为键?

哈希表:

https://docs.oracle.com/javase/8/docs/api/java/util/Hashtable.html

要成功地从哈希表中存储和检索对象,用作键的对象必须实现 hashCode 方法和 equals 方法。

并发哈希映射:

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html

相反,因为映射中的键和值永远不会为空,所以 null 可作为当前缺少任何结果的可靠原子指示符。

Properties 类扩展了 HashTable,所以你已经知道原因了。

2 - CopyOnWriteArrayList 中是否允许/禁止空值?为什么?

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CopyOnWriteArrayList.html

允许所有元素,包括 null。

没有进一步解释为什么会这样,但我相信这是一个设计决定。

【讨论】:

    【解决方案2】:

    但是为什么在 HashTable 中不允许使用它们

    来自Doc

    要成功地从 Hashtable 存储和检索对象, 用作键的对象必须实现 hashCode 方法和 equals 方法。

    一个空引用的对象是不可能得到那个信息的(因为是空的)

    在 CopyOnWriteArrayList 中是否允许/禁止空值?

    来自source code

    public class CopyOnWriteArrayList<E>
    

    java.util.ArrayList 的线程安全变体,其中所有可变的 操作(添加、设置等)是通过创建一个新的 底层数组的副本。 ...

    .... .....

    迭代器本身的元素更改操作(删除, 不支持设置和添加)。这些方法抛出 UnsupportedOperationException。

    允许所有元素,包括 null。

    有时它有助于阅读文档:

    【讨论】:

      猜你喜欢
      • 2010-09-29
      • 2018-01-02
      • 1970-01-01
      • 1970-01-01
      • 2012-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多