removeFirstOccurrence和remove之间的区别

时间:2017-06-11 07:13:53

标签: java list collections

集合api中的remove(Object o)方法(of List interface)方法removeFirstOccurrence(Object o)(of LinkedList class)方法:vs 'A 之间是否有任何区别? 我可以看到两者都是一样的,即删除列表中第一次出现的对象。

3 个答案:

答案 0 :(得分:1)

不,没有区别

如果您查看removeFirstOccurrence()的来源,您会看到:

public boolean removeFirstOccurrence(Object o) {
    return remove(o);
}

LinkedList两者的原因在每个的javadoc中给出:

remove(Object o)
Collection<E>接口中指定为:remove
Deque<E>接口中指定为:remove
指定人:List<E>

中的remove

removeFirstOccurrence(Object o)
指定人:Deque<E>

中的removeFirstOccurrence

答案 1 :(得分:0)

不,我认为没有任何区别是删除第一次出现的元素并返回。更正式地,删除索引最低的元素i

Java API ArrayList remove。

  public boolean remove(Object o) {
            if (o == null) {
                for (int index = 0; index < size; index++)
                    if (elementData[index] == null) {
                        fastRemove(index);
                        return true;
                    }
            } else {
                for (int index = 0; index < size; index++)
                    if (o.equals(elementData[index])) {
                        fastRemove(index);
                        return true;
                    }
            }
            return false;
        }

LinkedList removeFirstOccurrence

if (o == null) {
            for (Node<E> x = first; x != null; x = x.next) {
                if (x.item == null) {
                    unlink(x);
                    return true;
                }
            }
        } else {
            for (Node<E> x = first; x != null; x = x.next) {
                if (o.equals(x.item)) {
                    unlink(x);
                    return true;
                }
            }
        }
        return false;

答案 2 :(得分:0)

  

remove(Object o)方法(List。)之间是否有任何区别   接口)和removeFirstOccurrence(Object o)方法(LinkedList   class)在集合框架中?

这是两种不同的方法,来自两个不同的界面 第一个(remove(Object o))在java.util.Collection界面中定义 另一个(removeFirstOccurrence(Object o)java.util.Deque界面中定义。

第一个(remove(Object o))在Collection界面中有一个相当普遍的契约:

  

从中删除指定元素的单个实例   集合,如果它存在...

但扩展List的{​​{1}}接口有更具体的合同:

  

从此列表中删除第一次出现的指定元素,   如果它存在(可选操作)....

另一方面,Collection接口中定义的removeFirstOccurrence(Object o)指定了类似的合同:

  

从此双端队列中删除第一次出现的指定元素...

事实证明Deque直接实现LinkedListList
由于DequeList.remove(Object o)指定了类似的契约,因此Deque.removeFirstOccurrence(Object o)类中这两种方法的行为和实现是相同的并不奇怪。