我想了解源代码:
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());
}
}
}
我无法理解为什么main函数会返回执行值6 而不是返回值3 。
答案 0 :(得分:1)
嗯,除了你当前的代码没有编译的事实,它可以解释这种行为。
您在新的/bin/sh
(或cmd.exe
)实例上调用addAll
,此方法如下所示:
InstrumentedHashSet
首先你要向InstrumentedSet
添加3,因为之前该变量是0,所以它也是3。
然后,您正在调用addCount += c.size();
return super.addAll(c);
班addCount
的{{1}},the implementation of it如下:
addAll
最重要的部分是super
声明:HashSet
。它会为传递的public boolean addAll(Collection<? extends E> c) {
boolean modified = false;
for (E e : c)
if (add(e))
modified = true;
return modified;
}
中的每个项目调用if
,因为您使用自己的实现overriden该方法:
if (add(e))
...将调用该方法而不是父实现。在这里,您为每个添加的元素增加add
。所以你现在正在计算每个元素的秒时间
这基本上是Collection
打印public boolean add(Object o) {
addCount++;
return super.add(o);
}
传递的addCount
的两倍数量的原因。
答案 1 :(得分:1)
这是因为HashSet
方法的addAll
方法调用add
方法的实现,并且由于多态性,InstrumentedSet.add
被调用。
从addCount += c.size();
实施中删除InstrumentedSet.addAll
,它将有效。