java - Java 中的字符串连接和自动装箱

标签 java concatenation autoboxing

当您将字符串与原始类型(如 int)连接时,是否首先自动装箱值。

例如

String string = "Four" + 4;

Java 中如何将值转换为字符串?

最佳答案

要查看 Java 编译器生成的内容,使用 javap -c 显示实际生成的字节码总是有用的:

例如下面的 Java 代码:

String s1 = "Four" + 4;
int i = 4;
String s2 = "Four" + i;

将产生以下字节码:

   0:   ldc     #2; //String Four4
   2:   astore_1
   3:   iconst_4
   4:   istore_2
   5:   new     #3; //class java/lang/StringBuilder
   8:   dup
   9:   invokespecial   #4; //Method java/lang/StringBuilder."<init>":()V
   12:  ldc     #5; //String Four
   14:  invokevirtual   #6; //Method java/lang/StringBuilder.append:(Ljava/lang/
String;)Ljava/lang/StringBuilder;
   17:  iload_2
   18:  invokevirtual   #7; //Method java/lang/StringBuilder.append:(I)Ljava/lan
g/StringBuilder;
   21:  invokevirtual   #8; //Method java/lang/StringBuilder.toString:()Ljava/la
ng/String;
   24:  astore_3
   25:  return

由此我们可以看出:

  • "Four"+ 4 的情况下,Java 编译器(我使用的是 JDK 6)足够聪明地推断这是一个常量,因此在运行时不需要计算,因为字符串在编译时连接
  • "Four"+ i 的情况下,等效代码是 new StringBuilder().append("Four").append(i).toString()
  • 此处不涉及自动装箱,因为有一个 StringBuilder.append(int)根据文档使用的方法 String.valueOf(int)创建整数的字符串表示。

关于java - Java 中的字符串连接和自动装箱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12445064/

相关文章:

java - JVM 是否优化了不必要的自动装箱?

scala - 如何在 Scala 中发现装箱/拆箱

java - 从 IntelliJ 运行 Jetty 时找不到模块 [protonego-impl/alpn-1.8.0_45]

java - 将 Scala API 编写为 Java API 包装器的指南

scala - 在 Scala 2 中合并 2 个元组

python - 在 Python 中将列添加到二维数组

java - "a <= b && b <= a && a != b"怎么可能是真的?

java - 不兼容的类型 : Cannont be converted

java - android google guice框架时生成No class def found错误

用于在查询中进行多次替换的 mysql 存储函数