0

このコードは他の人が書いたもので、理解するのに苦労しています。

正常に動作し、正しい結果を生成しますが、どのように機能するのか理解できませんでした

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!");
    }
}
}

これら 2 つのクラスの出力は次のとおりです。I'm a Volkswagen with 20 clowns!

しかし、私が印刷するたびに

clowns.size() 

「フォルクスワーゲン」のadd()メソッドでは、常に 0 が返されます。

clowns.size() == 20

そしてそれを真と評価しますか?

4

4 に答える 4

1

Set<Clowns>でありHashSet、それ自体が によってバックアップされていHashMapます。したがって、基本的に、オブジェクトを に追加すると、Set<Clowns>が呼び出されHashMap.put()ます。

HashMap.put()hashCode()提供されたオブジェクトのメソッドを呼び出します。そのため、オブジェクトのhashCode()メソッドは明示的な呼び出しなしで呼び出されます。

于 2013-06-18T06:31:25.920 に答える
1

関数HashSet.addは、fge が述べたように、hashcode追加される前にオブジェクトの をチェックします。つまり、ピエロ #1 が追加される前に、Volkswagan.addピエロ #2 の関数が呼び出されます。

これは、ハッシュコード関数で 20 の深さの再帰が発生するまで続き、それが終了すると、20 個のピエロすべてが一度に追加されます。

于 2013-06-18T06:33:07.063 に答える