为何AbstractCollection的removeAll方法不像AbstractSet的removeAll方法那样,先比较size,选择size比较小的进行iterate,iterate的时候进行删除。

解决方案 »

  1.   

    我感觉可能跟是否能有重复元素有关。set没有重复元素,而Collection可以有重复元素。
    源码public boolean removeAll(Collection<?> c) {
            boolean modified = false;        if (size() > c.size()) {
                for (Iterator<?> i = c.iterator(); i.hasNext(); )
                    modified |= remove(i.next());
            } else {
                for (Iterator<?> i = iterator(); i.hasNext(); ) {
                    if (c.contains(i.next())) {
                        i.remove();
                        modified = true;
                    }
                }
            }
            return modified;
        }public boolean removeAll(Collection<?> c) {
    boolean modified = false;
    Iterator<?> e = iterator();
    while (e.hasNext()) {
        if (c.contains(e.next())) {
    e.remove();
    modified = true;
        }
    }
    return modified;
        }
    因为是用contains来判断是否重复的,如果Collection中A.removeAll(B)的时候使用B做遍历,那么就需要a.contain(B中的某个元素),如果包含那么A就要调用A.remove(B中的元素)。如果A中有多个元素和B中的这个元素相同,而remove()一次只删除一个,就很难判断需要进行多少次remove(),可能需要写while(A.contain(B中的元素))A.remove(B中的元素)了。
      

  2.   

    因为 它的另外一个儿子  AbstractList 不愿意??
      

  3.   

    Good Question.
    我认为,1F是对的。Set没有重复元素,遍历少的即可。而Collection可能会有重复,因此必须遍历自己。