我知道这个数据结构对于入队和出队具有恒定的时间性能,但它是否具有删除(Object o)的恒定时间性能?
答案 0 :(得分:1)
我认为查看ConcurrentLinkedQueue的source code可以给出明确的答案。
public boolean remove(Object o) {
if (o == null) return false;
Node<E> pred = null;
for (Node<E> p = first(); p != null; p = succ(p)) {
E item = p.item;
if (item != null &&
o.equals(item) &&
p.casItem(item, null)) {
Node<E> next = succ(p);
if (pred != null && next != null)
pred.casNext(p, next);
return true;
}
pred = p;
}
return false;
}
正如您所看到的,在找到删除节点之前,会通过队列节点进行迭代并检查每个节点。有了这个,我们可以说删除性能线性地依赖于队列大小。因此,与enqueue和dequeue相比, ConcurrentLinkedQueue remove(Object)方法没有恒定的时间性能,但依赖于队列大小。