是“someString”等同于新的String(“someString”)?在java中

时间:2013-07-03 15:38:21

标签: java string compiler-construction instantiation compiler-optimization

我一直认为java中的表达式是这样的:

String tmp = "someString";

只是

的某种“语法糖”
String tmp = new String("someString");

当我最近反编译我的java应用程序时,我看到

的所有用法
public static final String SOME_IDENTIFIER = "SOME_VALUE";

在代码中仅被值替换,并且静态最终变量被剥离。

每次想要访问静态final时,都不会将这个新的String实例化吗?如何将其视为“编译器优化”??

3 个答案:

答案 0 :(得分:9)

Java源代码中的字符串文字是 interned ,这意味着具有相同文本的所有文字将解析为同一个实例。

换句话说,"A" == "A"将是真的。

创建一个新的String实例将绕过它; "A" == new String("A")不会是真的。

答案 1 :(得分:4)

String tmp1 = "someString"; 
String tmp2 = new String("someString");
String tmp3 = "someString"; 

 if(tmp1 == tmp2)/* will return false as both are different objects
                     stored at differnt location in heap */

 if(tmp1.equals(tmp2))/* will return true as it will compare the values 
                        not object reference */

 if(tmp1 == tmp3)/* will return true. see string literals and they are interned. 
                  brief about them is they  are stored in pool in  permgen  till 
                  java 6.They are stored as part of heap only in java 7
                  Every time u create string literal with same value , 
                  it will refer from same location in pool instead of creating 
                  object each time */

答案 2 :(得分:1)

Java源代码中的字符串存储在.class文件的常量表中。加载类文件时,常量表中的所有字符串都被实现;唯一字符串将转换为对象实例。对它们的引用引用了实例化实例,因此其他引用不会生成其他对象。