2

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

String tmp = "someString";

只是某种“语法糖”

String tmp = new String("someString");

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

public static final String SOME_IDENTIFIER = "SOME_VALUE";

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

每次想要访问静态 final 时,不会实例化一个新的 String 吗?这怎么能被认为是“编译器优化”?

4

3 回答 3

9

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

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

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

于 2013-07-03T15:39:42.870 回答
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 */
于 2013-07-03T15:42:30.870 回答
1

Java 源代码中的字符串存储在 .class 文件的常量表中。当一个类文件被加载时,常量表中的所有字符串都被保留;唯一的字符串被转换为对象实例。对它们的引用指的是实习实例,因此额外的引用不会生成额外的对象。

于 2013-07-03T15:45:21.927 回答