Concat整数到字符串 - 从性能和内存的角度来看,使用字符串文字或原语?

use*_*658 9 java string primitive concatenation

选项1:

String newStr = someStr + 3 + "]";
Run Code Online (Sandbox Code Playgroud)

选项2:

String newStr = someStr + "3" + "]";
Run Code Online (Sandbox Code Playgroud)

在性能,记忆和一般实践方面哪个选项更好?我可以使用哪些推荐的工具/方法来测量代码的内存使用情况及其性能(除了测量开始时间和结束时间以及计算差异)

Mik*_*rov 11

第一个将成为:

StringBuilder sb = new StringBuilder (String.valueOf (someStr));
sb.append (3);
sb.append ("]");
String newStr = sb.toString ();
Run Code Online (Sandbox Code Playgroud)

第二个将成为:

StringBuilder sb = new StringBuilder (String.valueOf (someStr));
sb.append ("3");
sb.append ("]");
String newStr = sb.toString ();
Run Code Online (Sandbox Code Playgroud)

这是反汇编:

public String foo (String someStr)
{
    String newStr = someStr + 3 + "]";
    return newStr;
}

public String bar (String someStr)
{
    String newStr = someStr + "3" + "]";
    return newStr;
}

public java.lang.String foo(java.lang.String);
Code:
   0: new           #16                 // class java/lang/StringBuilder
   3: dup
   4: aload_1
   5: invokestatic  #18                 // Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
   8: invokespecial #24                 // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
  11: iconst_3
  12: invokevirtual #27                 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
  15: ldc           #31                 // String ]
  17: invokevirtual #33                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  20: invokevirtual #36                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
  23: astore_2
  24: aload_2
  25: areturn

public java.lang.String bar(java.lang.String);
Code:
   0: new           #16                 // class java/lang/StringBuilder
   3: dup
   4: aload_1
   5: invokestatic  #18                 // Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
   8: invokespecial #24                 // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
  11: ldc           #44                 // String 3
  13: invokevirtual #33                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  16: ldc           #31                 // String ]
  18: invokevirtual #33                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  21: invokevirtual #36                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
  24: astore_2
  25: aload_2
  26: areturn
Run Code Online (Sandbox Code Playgroud)

  • 第一个将附加`3`(加到整数3),然后追加`]`.第二个附加"3" (3认同)

JB *_*zet 7

两者之间不会有任何明显的差异.使用您认为最具逻辑性和可读性的内容.我会用

String newStr = someStr + "3]";
Run Code Online (Sandbox Code Playgroud)