我知道使用“ +”串联运算符来构建字符串效率很低,这就是为什么建议使用StringBuilder类的原因,但是我想知道这种模式是否也效率低下?
String some = a + "\t" + b + "\t" + c + "\t" + d + "\t" + e;
我猜这里编译器会优化分配,好吗?
该特定示例将由编译器内联:
String a = "a";
String b = "bb";
String c = "ccc";
String some = a + "\t" + b + "\t" + c;
Java
9+将使用带有makeConcatWithConstants的invokedynamic来内联此代码,以使其高效。根据javap -v
输出:
Code:
stack=3, locals=5, args_size=1
0: ldc #2 // String a
2: astore_1
3: ldc #3 // String bb
5: astore_2
6: ldc #4 // String ccc
8: astore_3
9: aload_1
10: aload_2
11: aload_3
12: invokedynamic #5, 0 // InvokeDynamic #0:makeConcatWithConstants:(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
17: astore 4
19: return
但是,如果a
b
and c
是编译时间常数,则编译器将进一步优化代码:
final String a = "a";
final String b = "bb";
final String c = "ccc";
String some = a + "\t" + b + "\t" + c;
并将some
加载一个常量值:
Code:
stack=1, locals=5, args_size=1
0: ldc #2 // String a
2: astore_1
3: ldc #3 // String bb
5: astore_2
6: ldc #4 // String ccc
8: astore_3
9: ldc #5 // String a\tbb\tccc
11: astore 4
13: return
在其他情况下,例如for
循环,编译器可能无法生成优化的代码,因此StringBuilder
可能会更快。
问题内容: 我试图理解字符串比较与字符串比较的输出。需要明确的是,我拥有使用==和equals比较两个字符串的类。我试图将==和equals()的输出合并为字符串。equals()的输出会连续显示,但==的输出不会 连续显示。使用Java的装箱功能,将与字符串连接的布尔值联系起来。equals和==都返回布尔值。那么为什么会有这种差异呢?有人可以解释吗? 输出 更新:答案 如果不使用s1 == s
问题内容: 在Go中,a 是原始类型,这意味着它是只读的,对其的每次操作都会创建一个新的字符串。 因此,如果我想多次连接字符串而又不知道结果字符串的长度,那么最好的方法是什么? 天真的方法是: 但这似乎不是很有效。 问题答案: 新方法: 在Go 1.10+中strings.Builder,这里是。 生成器用于使用Write方法有效地构建字符串。它最大程度地减少了内存复制。零值可以使用了。 与几乎相
本文向大家介绍通过+(字符串串联)运算符进行字符串串联。,包括了通过+(字符串串联)运算符进行字符串串联。的使用技巧和注意事项,需要的朋友参考一下 您可以使用Java的“ +”运算符来连接字符串。 示例 输出结果
问题内容: 我需要知道是否可以连接字符串,如下所示?如果没有,那么还有什么选择呢? 它应该看起来像人等。 您不能在串联中使用符号,那么替代方法是什么? 问题答案: 仅用于连接。而您错过了增量!
问题内容: 以下语句, 产生输出。 但是,以下内容 产生。 区别在哪里? 问题答案: 您会因为操作符优先级和字符串转换的结合而看到此行为。 JLS 15.18.1 指出: 如果只有一个操作数表达式的类型为String,则对另一操作数执行字符串转换(第5.1.11节),以在运行时生成字符串。 因此,第一个表达式中的右侧操作数将隐式转换为字符串: 但是对于第二个表达式,必须将复合赋值运算符与一起考虑。
问题内容: 我正在从事Java代码优化。我不清楚或符号之间的区别: 第2行和第3行有什么区别? 问题答案: 这种方法使用StringBuilder创建结果字符串 此方法仅调用的静态方法来获取int的String版本 依次调用