为什么主函数 returns 意外的执行结果?

Why does the main function returns unexpected execution result?

我正在尝试理解源代码:

public class InstrumentedSet extends HashSet {
    // Keeps the number of attempted element insertions

    private int addCount;

    public InstrumentedHashSet(Collection c) {
        super(c);
    }

    public boolean add(Object o) {
      addCount++;
      return super.add(o);
    }

    public boolean addAll(Collection c) {
      addCount += c.size();
      return super.addAll(c);
    }

    public int getAddCount() {
      return addCount;
    }

    public static void main(String[] args) {
      InstrumentedHashSet s = new InstrumentedHashSet();
      String s1[] = new String[] {"Snap","Crackle","Pop"};
      s.addAll(Arrays.asList(s1));
      System.out.println(s.getAddCount());
      }
    }
}

我不明白为什么主函数return的执行值为6而不是return的值为3 .

好吧,除了您当前的代码无法编译这一事实之外,还有可能解释该行为。

您在新的 InstrumentedHashSet(或 InstrumentedSet)实例上调用 addAll,此方法如下所示:

addCount += c.size();
return super.addAll(c);

首先你要将 3 添加到 addCount 并且由于该变量之前是 0,因此它也将是 3。
然后你调用 super class HashSetaddAllthe implementation of it 看起来像这样:

public boolean addAll(Collection<? extends E> c) {
    boolean modified = false;
    for (E e : c)
        if (add(e))
            modified = true;
    return modified;
}

最重要的部分是if语句:if (add(e))。它为传递的 Collection 中的每个项目调用 add 并且由于您已经 overriden 使用自己的实现方法:

public boolean add(Object o) {
    addCount++;
    return super.add(o);
}

...将调用该方法而不是父实现。在这里,您要为每个添加的元素增加 addCount。所以你现在计算每个元素 时间。
这基本上就是 System.out.println(s.getAddCount());Arrays.asList(s1).

打印传递的 Collection 双倍数量的原因

那是因为 HashSetaddAll 方法的实现调用了 add 方法,并且由于多态性,调用了 InstrumentedSet.add

InstrumentedSet.addAll 实施中删除 addCount += c.size();,它将起作用。