我有别人写的这段代码,我很难理解。

它工作正常并且生成正确的结果,但是我不明白它是如何工作的

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中)。

09-25 21:39