我知道Hashtable不允许空值,因为它是遗留的,由HashMap修复。由于排序是个问题,因此树中不允许为空。但是为什么我们在ArrayDeque中不允许使用null?
答案 0 :(得分:7)
来自Deque
的Javadoc:
虽然
Deque
实施并非严格要求 禁止插入空元素,强烈鼓励他们 这样做。允许的任何Deque
实现的用户 强烈建议使用null元素 not 以利用它 插入空值的能力。这是因为使用了null
作为特殊的返回值,通过各种方法来表示 德克是空的。
ArrayDeque
实现还使用null
来表示空元素(如 sestus '和 Aman jangra &#中所述) 39; s答案),所以推理是双重的:合同和实施细节。
值得注意的是ArrayDeque
可以轻松支持null元素而不会有太多额外的复杂性,因此更有说服力的理由似乎是{{1}的建议} interface。
答案 1 :(得分:4)
这可能是这样,因为null被各种方法用作特殊的返回值,表明deque是空的。但是并非所有deques都禁止插入空值。
答案 2 :(得分:2)
第一个答案是正确的(实现使用null
来表示空元素)。我还想指出,你总是可以插入一个代表 null
的元素 - 这样的东西:
private static final String NULL_INDICATOR = "_NULL_";
private final Deque<String> elementDeque = new ArrayDeque<>();
public final pushElement(String element) {
if (element == null) {
element = NULL_INDICATOR;
}
elementDeque.push(element);
}
public final peekElement() {
String element = elementDeque.peek();
return NULL_INDICATOR.equals(element) ? null : element;
}
public final popElement() {
elementDeque.pop();
}
答案 3 :(得分:1)
我不确定这究竟是背后的原因,但无论如何,这是我的解释。它可能是从ArrayDeque中删除元素的方式:
假设您有一个ArrayDeque,并且想要删除右端的元素(最后一个元素)。然后,在内部,应该有一个数组和一个索引指示符,它指向应该递减的最后一个元素。像这样:
//suppose i points to the last element of the array
arr[i] = null; //In order to avoid loitering
i--; //Point to the "new last element" resize if needed etc
为了避免loitering,必须将该赋值赋给null。如果没有这个,被删除的对象arr [i]仍将被引用(通过deque的内部数组),因此它不会被垃圾收集,这将是一个内存问题。
如果你在Deque上允许空值,那么真正的元素是什么以及什么只是垃圾会有混淆。
答案 4 :(得分:1)
解决方法:ArrayDeque<Optional<T>>
(java.util.Optional)
// Add non-null value
queue.add(Optional.of(value))
// Add nullable value
queue.add(Optional.ofNullable(value))
// Add null
queue.add(Optional.empty())
// Unbox
last = queue.pollLast().orElse(null)