3

これまでJavaを使ったことがなかったので、ジェネリック構文を自分で学んでいました。いくつかの文字列を使用して単純なジェネリック関数をテストしていたところ、少し奇妙なことに気づきました。

public class Main {

    public static <T> boolean areSameReference(T lhs, T rhs) {
        return lhs == rhs;
    }

    public static void main(String[] args) {
        String s = new String("test1");
        String t = s;
        String u = new String("test1");

        System.out.println(areSameReference(s, t)); //true
        System.out.println(areSameReference(s, u)); //false

        String v = "test2";
        String w = "test2";
        System.out.println(areSameReference(v, w)); //true
    }
}

なぜ[s]と[u]は異なる参照ですが、[v]と[w]は同じ参照ですか?「新しい」文字列リテラルの有無にかかわらず、どちらの場合も一貫して同じまたは異なる文字列リテラルになると思いました。

私はここで何か他のことが起こっているのを見逃していますか?

4

5 に答える 5

4

なぜ[s]と[u]は異なる参照であり、

コンパイラに新しい文字列が欲しいと言ったので、そうではありませんか?

于 2013-03-12T21:22:28.947 に答える
3

JLS3.10.5による

文字列リテラルは常にクラスStringの同じインスタンスを参照します。これは、文字列リテラル(またはより一般的には定数式(§15.28)の値である文字列)が、メソッドString.internを使用して、一意のインスタンスを共有するように「インターン」されるためです。

     String v = "test2";
     String w = "test2";

文字列リテラルと見なされます。

new演算子を使用してオブジェクトを作成すると、String新しいStringオブジェクトが割り当てられます。

于 2013-03-12T21:18:55.643 に答える
1

newを使用して、メモリ管理システムを呼び出し、新しいオブジェクトを取得します。

newがない場合、コンパイラは文字列の内容を「.class」定数テーブルの1つのエントリに最適化し、「。class」定数テーブルの同じエントリに2回アクセスします。

Javaの=比較演算子は参照比較演算であるため、2つの手法の違いがわかります。を十分に使用することで、これらの違いを隠すことができる場合がありString.intern(otherString)ます。

ここで持ち帰る教訓は、極端な状況を除いて、常に.equals(...)オブジェクトとの比較に使用することです。

于 2013-03-12T21:20:48.623 に答える
1

JVMは文字列のプールを保持するため、重複する文字列でメモリを浪費することはありません。したがって、vwは同じである必要があります。あなたが経験している振る舞いは、コンストラクターに暗示されているコントラクトによるものだと思います。これは、new String(String original)コンストラクターが新しいオブジェクトを作成することを示しています(http://docs.oracle.com/javase/1.5.0/docs/を参照)。 api / java / lang / String.html#String(java.lang.String))。

于 2013-03-12T21:22:12.227 に答える
1

文字列オブジェクトは不変であり、文字列参照は変更可能です。「s」と「u」を定義すると、それぞれに新しいオブジェクトが作成されます。コンストラクターを呼び出すため、ここでの値は重要ではありませんが、異なるStringオブジェクトに同じ値を割り当てると、それらはメモリー内の同じ「test2」オブジェクトへの参照になります。

Javaの不変オブジェクトについてもっと読むことをお勧めします。良い記事はここにあります:http: //javarevisited.blogspot.com/2010/10/why-string-is-immutable-in-java.html

于 2013-03-12T21:30:47.900 に答える