3

次のコードが「false」を出力する可能性はありますか?

タイプ Class のオブジェクトがロードされ、アンロードされ、プログラムの実行中に再ロードされる可能性がある場合、これは false ? を出力する可能性があります。

Androidと「通常のJava」で状況は同じですか?

    class Person
    {
      Integer age;
      Person(Integer age) {this.age=age;}
    }

    int v1;
    {
      Person p1 = new Person(5);
      v1 = System.identityHashCode(p1.getClass());
    }
    .
    .

    int v2;
    {
      Person p2 = new Person(10);
      v2 = System.identityHashCode(p2.getClass());
    }


    if (v1 == v2)
      System.out.println("true");
    else
      System.out.println("false");
4

2 に答える 2

1

すべてのコード (Person のクラス定義を除く) が単一のクラスにある場合、Person クラスの 2 つの異なるインスタンスを取得できるとは思いません。

OSGI のようなものを使用すると、実際には異なるクラスローダーによって複数回ロードされた Person クラスを取得でき、それらの hashCodes は異なるため、次のように推測します。

はい、これが「false」を返すケースを作成できます

Person インスタンスへの参照を保持しないため、理論的にはクラスが実際にアンロードされる可能性があります。これは、インスタンス化する 2 つのピース自体がリフレクションによってロードされ、後でガベージ コレクションが行われる場合です。私の知る限り、言語仕様にはクラス定義のガベージ コレクションを妨げるものは何もありません。これは、開発中に常に新しいバージョンのクラスを展開する Web コンテナーなどがある場合に非常に重要です。古いバージョンでガベージ コレクションが行われないと、メモリの問題が発生します。

以下も参照してください。

Javaでクラスをアンロードしますか?

Javaですでにロードされているクラスをアンロードするには?

于 2012-12-04T17:02:25.980 に答える
0

このコードは常に true を出力する必要があります。p1.getClass() を使用して同じクラスを指しているため

identityHashCode

public static int identityHashCode(Object x)
Returns the same hash code for the given object as would be returned by the default method hashCode(), whether or not the given object's class overrides hashCode(). The hash code for the null reference is zero.
Parameters:
x - object for which the hashCode is to be calculated
Returns:
the hashCode
Since:
JDK1.1

上記の説明に従って、オブジェクトのインスタンス化では常に異なるデフォルトの hashCode 値が与えられます...

Person は Class クラスのインスタンスなので、 P1.getClass と P2.getClass はクラスの同じインスタンスを指しています...つまり、V1 == V2.

于 2012-12-04T16:54:00.543 に答える