Java には文字列オブジェクトがいくつありますか? [重複] 質問する

Java には文字列オブジェクトがいくつありますか? [重複] 質問する

友人が、Java 認定の模擬試験で見た文字列オブジェクトに関する質問を送ってきました。

String makeStrings(){
    String s = "HI";
    s = s + "5";
    s = s.substring(0,1);
    s = s.toLowerCase();
    return s.toString();
}

このメソッドが呼び出されると、いくつの文字列オブジェクトが作成されますか? 試験の正解は 3 でした。しかし、私は 5 だと思います。

  1. "こんにちは"
  2. 「5」
  3. 「HI5」
  4. 「は」
  5. 「は」

私が間違っている?

ベストアンサー1

String makeStrings() {
    String s = "HI";           //String literal
    s = s + "5";               //concatenation creates new String object (1)
    s = s.substring(0,1);      //creates new String object (2)
    s = s.toLowerCase();       //creates new String object (3)
    return s.toString();       //returns already defined String
}

連結に関しては、新しい文字列を作成するときにJVMを使用しますStringBuilder。つまり、

s = new StringBuilder(s).append("5").toString(); 

toString()a の場合は次のStringBuilderとおりです。

public String toString() {
    return new String(value, 0, count); //so a new String is created
}

substring新しい文字列オブジェクトを作成するない限り全体がStringインデックス化されます:

public String substring(int beginIndex, int endIndex) {
    if (beginIndex < 0) {
        throw new StringIndexOutOfBoundsException(beginIndex);
    }
    if (endIndex > count) {
        throw new StringIndexOutOfBoundsException(endIndex);
    }
    if (beginIndex > endIndex) {
        throw new StringIndexOutOfBoundsException(endIndex - beginIndex)
    }

    return ((beginIndex == 0) && (endIndex == count)) ? this :
           new String(offset + beginIndex, endIndex - beginIndex, value);
}

toString()するない新しい文字列を作成します。

public String toString()
{
   return this;
}

toLowerCase()かなり長い方法ですがStringないすでにすべて小文字になっているので、意思を返しますnew String

提供された答えが であることを考えると3、Jon Skeetが示唆したように、両方の文字列リテラルがすでに文字列プールにあると想定できます。文字列がプールに追加されるタイミングの詳細については、Javaの文字列プールに関する質問

おすすめ記事