Java集合中的空键未排序

时间:2017-06-08 18:55:54

标签: java sortedset sortedmap

请有人解释一下以下内容:

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

它是否与线程安全有关?

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

谢谢

2 个答案:

答案 0 :(得分:0)

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

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

哈希表:

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

  

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

的ConcurrentHashMap:

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

  

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

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

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

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

  

允许使用所有元素,包括null。

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

答案 1 :(得分:-1)

  

但为什么不允许他们使用HashTable

来自Doc

  

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

空引用对象的

无法获取该信息(因为为空)

  

CopyOnWriteArrayList允许/禁止空值

来自source code

public class CopyOnWriteArrayList<E>
  

java.util.ArrayList的线程安全变体,其中所有变量都是   操作(添加,设置等)通过重新实现来实现   底层数组的副本。 ...

     

....   .....

     

迭代器本身的元素更改操作(删除,   不支持set和add)。抛出这些方法   UnsupportedOperationException异常。

     

允许使用所有元素,包括null。

有时它有助于阅读文档: