LoginSignup
1
1

More than 3 years have passed since last update.

[Java] Javaは + で文字列連結しても大丈夫と言われていたので確かめた

Last updated at Posted at 2020-02-20

試したこと

こんなファイルを作り

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)

1
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1