25

画面の幅に合わない長い文字列があります。たとえば。

String longString = "This string is very long. It does not fit the width of the screen. So you have to scroll horizontally to read the whole string. This is very inconvenient indeed.";

読みやすくするために、このように書くことを考えました-

String longString = "This string is very long." + 
                    "It does not fit the width of the screen." +
                    "So you have to scroll horizontally" +
                    "to read the whole string." +
                    "This is very inconvenient indeed.";

ただし、2番目の方法では文字列の連結を使用し、メモリ内に5つの新しい文字列が作成されるため、パフォーマンスが低下する可能性があることに気付きました。これは本当ですか?それとも、コンパイラは、私が必要としているのは本当に単一の文字列だけであることを理解するのに十分賢いでしょうか?どうすればこれを避けることができますか?

4

3 に答える 3

44

2番目の方法では文字列の連結を使用し、メモリ内に5つの新しい文字列を作成するため、パフォーマンスが低下する可能性があることに気付きました。

いいえ、そうではありません。これらは文字列リテラルであるため、コンパイル時に評価され、1つの文字列のみが作成されます。これは、Java言語仕様#3.10.5で定義されています。


長い文字列リテラルは、常に短い部分に分割し、文字列連結演算子+ [...]を使用して(括弧で囲まれた)式として記述できます。
さらに、文字列リテラルは常にクラスStringの同じインスタンスを参照します。

  • 定数式(§15.28)によって計算された文字列は、コンパイル時に計算され、リテラルであるかのように扱われます。
  • 実行時に連結によって計算された文字列は新しく作成されるため、区別されます。

テスト:

public static void main(String[] args) throws Exception {
    String longString = "This string is very long.";
    String other = "This string" + " is " + "very long.";

    System.out.println(longString == other); //prints true
}

ただし、変数を使用しているため、以下の状況は異なります。連結があり、いくつかの文字列が作成されます。

public static void main(String[] args) throws Exception {
    String longString = "This string is very long.";
    String is = " is ";
    String other = "This string" + is + "very long.";

    System.out.println(longString == other); //prints false
}
于 2012-08-16T14:27:32.370 に答える
8

Javaで文字列を連結すると、常に新しい文字列がメモリに作成されますか?

いいえ、必ずしもそうとは限りません。

連結がコンパイル時の定数式である場合、それはコンパイラーによって実行され、結果の文字列がコンパイルされたクラスの定数プールに追加されます。実行時、式の値はString、定数プールエントリに対応するインターンです。

これはあなたの質問の例で起こります。

于 2012-08-16T14:28:27.260 に答える
1

入力に基づいて以下のスニペットを確認してください。

String longString = "This string is very long. It does not fit the width of the screen. So you have to scroll horizontally to read the whole string. This is very inconvenient indeed.";

String longStringOther = "This string is very long. " + 
        "It does not fit the width of the screen. " +
        "So you have to scroll horizontally " +
        "to read the whole string. " +
        "This is very inconvenient indeed.";

System.out.println(" longString.equals(longStringOther) :"+ longString.equals(longStringOther));      
System.out.println(" longString == longStringother : " + (longString == longStringOther ));

出力:

longString.equals(longStringOther):true
longString == longStringother:true

1番目のケース:両方の文字列が等しい(内容が同じ)

2番目のケース:連結後に文字列が1つしかないことを示します。したがって、1つの文字列のみが作成されます。

于 2013-01-14T07:40:08.643 に答える