选项1:
String newStr = someStr + 3 + "]";
选项2:
String newStr = someStr + "3" + "]";
在性能、内存和一般实践方面,哪个选项更好?有哪些推荐的工具/方法可以用来测量代码的内存使用情况和性能(除了测量开始时间和结束时间并计算差异之外)?
选项1:
String newStr = someStr + 3 + "]";
选项2:
String newStr = someStr + "3" + "]";
在性能、内存和一般实践方面,哪个选项更好?有哪些推荐的工具/方法可以用来测量代码的内存使用情况和性能(除了测量开始时间和结束时间并计算差异之外)?
第一句话将变成:
StringBuilder sb = new StringBuilder (String.valueOf (someStr));
sb.append (3);
sb.append ("]");
String newStr = sb.toString ();
第二个将变成:
StringBuilder sb = new StringBuilder (String.valueOf (someStr));
sb.append ("3");
sb.append ("]");
String newStr = sb.toString ();
这里是分解:
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
3
(装箱为整数3),然后添加]
。第二个会添加3]
。 - Steve KuoString s = "hello" + 3 + "]"
会创建一个单一的字符串"hello3]"
。奇怪的是编译器不能优化这种情况。还是要点赞,因为我学到了东西。 - JB Nizet两者之间不会有任何明显的区别。使用你认为最合乎逻辑和易读的方式。我会使用
String newStr = someStr + "3]";
StringBuilder
public StringBuilder(int size); //Contains no character. Initial capacity of 'size'.
StringBuilder(可变字符序列。请记住,字符串是不可变的)通过简单地创建所有字符串的可调整大小的数组来帮助解决此问题。只有在必要时才将它们复制回字符串(麦克道威尔)。
StringBuilder str = new StringBuilder(0);
str.append(someStr);
str.append(3);
str.append("]");
参考资料:
麦克道威尔,盖尔·拉克曼。《破解编程面试》,第6版。印刷版。
“Stringbuilder (Java Platform SE 8 )”。Docs.oracle.com。N.p.,2016年。网络。2016年6月4日。
StringBuilder
进行字符串连接。 - jlordo