【问题标题】:is "someString" equivalent to new String("someString")? in java“someString”是否等同于新字符串(“someString”)?在java中
【发布时间】:2013-07-03 15:38:20
【问题描述】:

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

String tmp = "someString";

只是某种“语法糖”

String tmp = new String("someString");

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

public static final String SOME_IDENTIFIER = "SOME_VALUE";

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

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

【问题讨论】:

  • 很可能是实习的原因。

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


【解决方案1】:

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

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

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

【讨论】:

  • 但是 equals() 在这两种情况下都会返回 true。 (不要混淆初学者)
【解决方案2】:
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 */

【讨论】:

  • 使用 /* 多行 cmets */ :)
  • AFAIK 字符串不再存储在 permgen 中(Oracle Java SE 7),permgen 将在 Oracle Java SE 8 中完全删除。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-14
    • 2012-09-15
    • 1970-01-01
    • 2013-03-08
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多