2017-10-30 15 views
3

javaは文字列リテラルで操作を最適化しますか?たとえば、javaは文字列リテラルtoLowerCase()を最適化しますか?

"literal".toLowerCase() 

いつも新しい文字列インスタンスを作成しますか?

+1

自分でテストしてみませんか?簡単なテストではないでしょうか? – Lino

+2

あなたはさらに心配することがあります。 – EJP

+0

「最適化」を定義できますか?これが最適化されているかどうかを確認する瞬間です。 – AxelH

答えて

4

toLowerCase()toLowerCase(Locale.getDefault())となります。

には、文字を変更する必要がない場合は、元のStringが返されることがわかります実装を見て:の

public String toLowerCase(Locale locale) { 
    if (locale == null) { 
     throw new NullPointerException(); 
    } 

    int firstUpper; 
    final int len = value.length; 

    /* Now check if there are any characters that need to be changed. */ 
    scan: { 
     for (firstUpper = 0 ; firstUpper < len;) { 
      char c = value[firstUpper]; 
      if ((c >= Character.MIN_HIGH_SURROGATE) 
        && (c <= Character.MAX_HIGH_SURROGATE)) { 
       int supplChar = codePointAt(firstUpper); 
       if (supplChar != Character.toLowerCase(supplChar)) { 
        break scan; 
       } 
       firstUpper += Character.charCount(supplChar); 
      } else { 
       if (c != Character.toLowerCase(c)) { 
        break scan; 
       } 
       firstUpper++; 
      } 
     } 
     return this; // the original String is returned 
    } 
    ... 
} 
+0

私はOPがコンパイル時にリテラル ";"に最適化されるかどうかを知りたいと思います。これは「ロケール」に依存するので、これは複雑になるでしょう...;) – AxelH

+0

@AxelH質問にあるスニペットが「常に新しい文字列インスタンスを作成するかどうか」が質問されました。私はそれに答えた。 – Eran

+0

@AxelH - その答えは*はい* – TheLostMind

2

まず、私はそれが指定されていないと思いますので、動作がのJDKの間で異なる場合があります。

しかし、私のOracle JDK 1.8.0_131では、String.toLowerCase(Locale)のソースコードを見ると、文字を変更する必要がなければ、文字列自体を返すチェックがあることがわかります。

/* Now check if there are any characters that need to be changed. */ 
scan: { 
    for (firstUpper = 0 ; firstUpper < len;) { 
     // Basically 
     if(characterNeedsToBeChanged) { 
      break scan; 
     } 
    } 
    return this; 
} 
... 
// Create a new string 
.... 
関連する問題