Java 将整数转换为字符串-从性能和内存的角度使用字符串文字或原语?
备选案文1:Java 将整数转换为字符串-从性能和内存的角度使用字符串文字或原语?,java,string,concatenation,primitive,Java,String,Concatenation,Primitive,备选案文1: String newStr = someStr + 3 + "]"; 备选案文2: String newStr = someStr + "3" + "]"; 在性能、记忆和一般实践方面,哪个选项更好? 我可以使用哪些推荐的工具/方法来测量代码的内存使用情况及其性能(除了测量开始时间和结束时间并计算差异)两者之间不会有任何明显的差异。使用您认为最符合逻辑和可读性的内容。我会用 String newStr = someStr + "3]"; 我推荐它作为一个很棒的java应用程序
String newStr = someStr + 3 + "]";
备选案文2:
String newStr = someStr + "3" + "]";
在性能、记忆和一般实践方面,哪个选项更好?
我可以使用哪些推荐的工具/方法来测量代码的内存使用情况及其性能(除了测量开始时间和结束时间并计算差异)两者之间不会有任何明显的差异。使用您认为最符合逻辑和可读性的内容。我会用
String newStr = someStr + "3]";
我推荐它作为一个很棒的java应用程序评测工具,帮助我发现很多内存问题
我认为选项1和选项2在内存使用方面没有太大区别,特别是对于桌面应用程序而言。第一个选项将成为:
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 ();
第二个将成为:
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
publicstringfoo(stringsomestr)
{
字符串newStr=someStr+3+“]”;
返回新闻TR;
}
公共字符串栏(字符串someStr)
{
字符串newStr=someStr+“3”+“]”;
返回新闻TR;
}
public java.lang.String foo(java.lang.String);
代码:
0:new#16//类java/lang/StringBuilder
3:dup
4:aload_1
5:invokestatic#18//方法java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
8:invokespecial#24//方法java/lang/StringBuilder。”“:(Ljava/lang/String;)V
11:iconst_3
12:invokevirtual#27//方法java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
15:ldc#31//String]
17:invokevirtual#33//方法java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
20:invokevirtual#36//方法java/lang/StringBuilder.toString:()Ljava/lang/String;
23:astore_2
24:aload_2
25:轮到你了
公共java.lang.String栏(java.lang.String);
代码:
0:new#16//类java/lang/StringBuilder
3:dup
4:aload_1
5:invokestatic#18//方法java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
8:invokespecial#24//方法java/lang/StringBuilder。”“:(Ljava/lang/String;)V
11:ldc#44//String 3
13:invokevirtual#33//方法java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
16:ldc#31//String]
18:invokevirtual#33//方法java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
21:invokevirtual#36//方法java/lang/StringBuilder.toString:()Ljava/lang/String;
24:astore_2
25:aload_2
26:轮到你了
假设someString是常量,则两者都是常量表达式,将在编译时进行计算。它们将导致相同的类文件和运行时行为
资料来源:报告写道:
编译时常量表达式是一个表示原语类型的值或字符串的表达式,该值或字符串不会突然完成,并且仅使用以下内容组成:
- 基本类型的文字和字符串类型的文字(§3.10.1、§3.10.2、§3.10.3、§3.10.4、§3.10.5)
- 加法运算符
和+
(§15.18)-
每当连接一个字符串时,每次连接时,都会创建该字符串的新副本,并且两个字符串都会被复制,每次复制一个字符。这导致时间复杂度为O(n2)(McDowell) 如果要提高性能,请使用
StringBuilder
其中一个构造函数具有以下语法:
public StringBuilder(int size); //Contains no character. Initial capacity of 'size'.
StringBuilder(可变字符序列。请记住字符串是不可变的)通过简单地创建所有字符串的可调整大小的数组来帮助解决此问题。仅在必要时将其复制回字符串(McDowell)
参考:
麦克道尔,盖尔·拉克曼。破解编码面试,第6版。印刷品
“Stringbuilder(Java平台SE 8)”。Docs.oracle.com。N.p.,2016年。网状物2016年6月4日。两者没有任何区别。@Smit:编译器将使用
StringBuilder
作为字符串concatenation@Smit:使用StringBuilder将导致与问题中的代码相同的字节码,或者更糟。@JBNizet和@jlordo,但这是一个不同的答案。我理解错了什么?阅读答案的结尾和评论。答案先是弄错了,然后试图变得正确。阅读米哈伊尔·弗拉基米罗夫对这个问题的回答。第一个将附加3
(装箱为整数3),然后附加]
。第二个附加3]
+1。我不知道为什么,但我的眼睛看到了这一刻的永恒