为什么主函数 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 HashSet
的 addAll
和 the 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
双倍数量的原因
那是因为 HashSet
的 addAll
方法的实现调用了 add
方法,并且由于多态性,调用了 InstrumentedSet.add
。
从 InstrumentedSet.addAll
实施中删除 addCount += c.size();
,它将起作用。
我正在尝试理解源代码:
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 HashSet
的 addAll
和 the 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
双倍数量的原因
那是因为 HashSet
的 addAll
方法的实现调用了 add
方法,并且由于多态性,调用了 InstrumentedSet.add
。
从 InstrumentedSet.addAll
实施中删除 addCount += c.size();
,它将起作用。