我有别人写的这段代码,我很难理解。
它工作正常并且生成正确的结果,但是我不明白它是如何工作的
package you;
import clowns.Clown;
import clowns.Volkswagen;
public class You {
static int counter = 0;
static Volkswagen vw = new Volkswagen();
public static void main(String args[]) {
vw.add(new RecursiveClown());
vw.done();
}
static class RecursiveClown extends Clown {
public int hashCode() {
if (++counter < 20) {
vw.add(new RecursiveClown());
}
return super.hashCode();
}
}
}
无法理解
RecursiveClown
显然没有在其hashcode()
函数的任何地方被调用然后它如何工作并添加
RecursiveClown
对象。以及为什么它返回
super.hashCode();
上面的代码中引用了另一个类。
package clowns;
import java.util.HashSet;
import java.util.Set;
public class Volkswagen {
private static final int CAPACITY = 5;
private Set<Clown> clowns = new HashSet<Clown>();
public synchronized void add(Clown clown) {
if (clowns.size() >= CAPACITY) {
throw new IllegalStateException("I'm full");
} else {
clowns.add(clown);
}
}
public synchronized void done() {
if (clowns.size() == 20) {
// The goal is to reach this line
System.out.println("I'm a Volkswagen with 20 clowns!");
}
}
}
这两个类的输出是:
I'm a Volkswagen with 20 clowns!
但是每当我打印
clowns.size()
在'Volkswagen'的
add()
方法中,它总是返回0,然后比较clowns.size() == 20
并认为它是真的?
最佳答案
为何您的大众汽车包含的小丑数量超出其能力所允许的,是因为添加了小丑的方式。
它基本上在行内
clowns.add(clown);
在方法
Volkswagen.add()
中。它首先调用要添加的小丑的hashCode
,然后将其添加到其内部结构中。由于hashCode
再次递归调用Volkswagen.add()
,因此此时小丑尚未添加到(内部数据结构支持)HashSet
中,因此size()
返回0。这样,在方法
Volkswagen.add()
开始时不会达到容量,而仅在退出此方法时才达到此能力(因为只有这样,小丑才真正添加到HashSet
中)。