javaは文字列リテラルで操作を最適化しますか?たとえば、javaは文字列リテラルtoLowerCase()を最適化しますか?
"literal".toLowerCase()
いつも新しい文字列インスタンスを作成しますか?
javaは文字列リテラルで操作を最適化しますか?たとえば、javaは文字列リテラルtoLowerCase()を最適化しますか?
"literal".toLowerCase()
いつも新しい文字列インスタンスを作成しますか?
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
}
...
}
私はOPがコンパイル時にリテラル ";"に最適化されるかどうかを知りたいと思います。これは「ロケール」に依存するので、これは複雑になるでしょう...;) – AxelH
@AxelH質問にあるスニペットが「常に新しい文字列インスタンスを作成するかどうか」が質問されました。私はそれに答えた。 – Eran
@AxelH - その答えは*はい* – TheLostMind
まず、私はそれが指定されていないと思いますので、動作がの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
....
自分でテストしてみませんか?簡単なテストではないでしょうか? – Lino
あなたはさらに心配することがあります。 – EJP
「最適化」を定義できますか?これが最適化されているかどうかを確認する瞬間です。 – AxelH