試したこと

こんなファイルを作り

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)