String str = new String("my string")效率真的低吗?

One*_*ero 6 java string optimization

我经常看到人们说String str = new String("my string")写作效率低于写作,String str = "my string",因为前者创建了一个静态的"my string"对象,然后new是一个从静态复制的String对象.

但是,鉴于这里的语言非常简单明了,我很难想象Java优化器不会花费任何精力简单地将前者转换为后者.为什么它会选择以更费力的方式做到这一点?如果Java优化它会有什么负面影响?

use*_*ica 9

但是,鉴于这里的语言非常简单明了,我很难想象Java优化器不会花费任何精力简单地将前者转换为后者.

首先,你不应该只是因为你认为编译器会用更快的东西替换它来编写代码来说做慢事.

其次,编译器一般不能对此进行优化,因为new保证了新对象的创建.如果你这样做

String str = new String("my string");
Run Code Online (Sandbox Code Playgroud)

然后它保证str != "my string".Java只能优化new它是否可以证明String对象的标识对程序的执行无关紧要.

  • [*每次评估\ [类实例创建\]表达式时,都会创建一个新对象.*](http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html #JLS-15.9.4-200) (2认同)

Ole*_*hov 6

查看生成的字节码 String s1 = "1":

LDC "1"
ASTORE 1
Run Code Online (Sandbox Code Playgroud)

并为 String s2 = new String("2"):

NEW java/lang/String
DUP
LDC "2"
INVOKESPECIAL java/lang/String.<init> (Ljava/lang/String;)V
ASTORE 2
Run Code Online (Sandbox Code Playgroud)

后一个例子是多余的,更复杂.在这种情况下,编译器不会进行任何优化.这是保证一个String类的新实例将被创建.

使用String str = "my string"JVM 可以重用String的实例而不是创建新的实例.考虑下面的例子:

String s1 = "1";
String s2 = "1";
System.out.println(s1 == s2); // true  => same reference, s1 & s2 point to the same object

String s3 = "1";
String s4 = new String("1");
System.out.println(s3 == s4); // false => s3 & s4 point to different objects
Run Code Online (Sandbox Code Playgroud)