请有人解释一下以下内容:
我很清楚为什么在Java排序集合中禁止使用null键(值) 但是为什么它们不允许在HashTable,ConcurrentHashMap和...... Properties
中它是否与线程安全有关?
CopyOnWriteArrayList中是否允许/禁止空值?为什么呢?
谢谢
答案 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方法。
无法获取该信息(因为为空)
来自source code 的CopyOnWriteArrayList允许/禁止空值
public class CopyOnWriteArrayList<E>
java.util.ArrayList的线程安全变体,其中所有变量都是 操作(添加,设置等)通过重新实现来实现 底层数组的副本。 ...
.... .....
迭代器本身的元素更改操作(删除, 不支持set和add)。抛出这些方法 UnsupportedOperationException异常。
允许使用所有元素,包括null。
有时它有助于阅读文档: