为什么ArrayDeque中不允许使用空值?

时间:2016-01-18 09:41:41

标签: java

我知道Hashtable不允许空值,因为它是遗留的,由HashMap修复。由于排序是个问题,因此树中不允许为空。但是为什么我们在ArrayDeque中不允许使用null?

5 个答案:

答案 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)