0

次のルーチンは、WIN XP x32、JAVA バージョン 7 Update 9 と WIN7 x64、JAVA バージョン 6 Update 32 では動作が異なります。

private int getNrOfMatches(String temp, String regex) {
            String prev;
            int nrOfIterations = -1;
            do {
                nrOfIterations++;
                prev = temp;
                temp = temp.replaceFirst(regex, " ");
            } while (temp != prev);
            return nrOfIterations;
        }

replaceFirst() は、何も変更せず、ループが WIN XP で終了する場合、同じオブジェクトを返します。!=Win7 では、ルーチンは何も変更していなくても新しいオブジェクトを返すため、常に false を返すため、無限ループに陥ります。.equals()代わりに使用すると!=この問題は解決しますが、私の質問は誰でもこの動作を説明できますか?

4

2 に答える 2

2

==文字列をorと比較しない!=

(str1.equals(str2))または_(!str1.equals(str2))

==非プリミティブ型のオブジェクト参照を!=比較します。

equals()クラスが継承元のこのメソッドをオーバーライドするときに、オブジェクトの内容を比較しますObject

于 2012-11-29T17:33:59.417 に答える
2

ですから、なぜそれが時々機能するのかという質問の一部に答えることに挑戦してください。JVM には、同じ内容で新しい参照を作成するのではなく、同じ文字列の参照を再利用しようとするクリーバーの最適化がいくつかあります。Win XP で実行している場合、JVM にはこれらの最適化があり、Win 7 にはありません (同じバージョンですか?)

This SO Questionはこのトピックをかなりうまくカバーしており、受け入れられた答えは実際に定数プールに文字列を追加する方法について語っています( を呼び出します.intern())。同等性を判断するという点では、これは安定したソリューションではありません。これは、Java コードで行うメモリ管理の選択よりも JVM が常に優先されるためです。

また、 JVM オプションを掘り下げると、この興味深いオプション ( -XX:+UseStringCache) と、それが何をするかについて説明するこのSO の質問が見つかりました。おそらく、Win XP JVM には -server 最適化があり、Win 7 にはありませんか?

于 2012-11-29T17:38:34.823 に答える