[Java] Javaは + で文字列連結しても大丈夫と言われていたので確かめた
試したこと
こんなファイルを作り
PlainString.java
import java.time.LocalDateTime;
class PlainString {
String getString() {
// え!文字列 + で連結しちゃうの!?
return "abc" + LocalDateTime.now();
}
}
コンパイルし
javac PlainString.java
JDK8の場合
結果
逆コンパイルしてみました。
javap -c PlainString
Compiled from "PlainString.java"
class PlainString {
PlainString();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
java.lang.String getString();
Code:
0: new #2 // class java/lang/StringBuilder
3: dup
4: invokespecial #3 // Method java/lang/StringBuilder."<init>":()V
7: ldc #4 // String abc
9: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
12: invokestatic #6 // Method java/time/LocalDateTime.now:()Ljava/time/LocalDateTime;
15: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder;
18: invokevirtual #8 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
21: areturn
}
しっかり StringBuilder
に置き換えられていました。
結論
イマドキのJavaは、とくに気を使わずに + 使って文字列連結して大丈夫そうです。
2020/2/22追記 @cfm-art さんからコメントいただきました。ありがとうございます。
単純に連結するだけであれば + で大丈夫。
ループのなかで + を使うと、その度にStringBuilder
が作られるのでダメ。
環境
- Ubuntu 18.04.4 LTS
- OpenJDK 8u242-b08-0ubuntu3~18.04
【2020/2/22追記】 JDK13の場合
JDK11 以降は StringBuilder 使われていないと教えていただいたので、試してみました。
結果
javacしてからjavapしました。
javap -c PlainString Compiled from "PlainString.java"
class PlainString {
PlainString();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
java.lang.String getString();
Code:
0: invokestatic #7 // Method java/time/LocalDateTime.now:()Ljava/time/LocalDateTime;
3: invokedynamic #13, 0 // InvokeDynamic #0:makeConcatWithConstants:(Ljava/time/LocalDateTime;)Ljava/lang/String;
8: areturn
}
StringBuilder
が消えて、makeConcatWithConstants
というものに変わっていました。
結論
文字列連結にどこでも + 使って大丈夫そう。
環境
openjdk version “13.0.2” 2020-01-14
OpenJDK Runtime Environment AdoptOpenJDK (build 13.0.2+8)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 13.0.2+8, mixed mode, sharing)