使用+运算符的字符串常量池

时间:2014-03-22 04:11:50

标签: java

    public class Strings 
    { 
      public static void main(String ads[])
      { 
           String a =    "meow"; 
           String ab = a + "deal"; 
           String abc= "meowdeal"; 
           System.out.println  (ab==abc); 
      } 
    } 

为什么输出为false? 在此计划中abstring字面值中创建,然后abc创建,但为什么ababc不引用字符串常量池中的相同内存,因为在创建abc之前,它在字符串常量池中搜索String meowdeal

3 个答案:

答案 0 :(得分:5)

Java只汇集它在编译时知道的字符串;字符串常量和常量字符串表达式。 a是一个局部变量,所以+"交易"是一个字符串表达式,直到运行时才被评估(即使你看它它可以看到它应该是常量)。 Java编译器并不知道它是一个常量表达式,并且不会将它放在池中。它在运行时执行字符串连接,从而产生与池中任何对象不同的对象。

答案 1 :(得分:1)

我将解释发生了什么:

public class Strings {
           public static void main(String ads[]) {
               String a = "meow"; // new string created
               String ab = a + "deal"; // again a new string created. Reference different.
               String abc = "meowdeal"; // a whole new string.
               System.out.println(ab == abc);// even though the values are same, reference is different. For value equality, use .equals()
           }
       }

答案 2 :(得分:1)

您的问题暗示您希望Java检查每个字符串连接的结果,以查看字符串常量池中是否存在匹配的字符串 - 但这将非常低效。除非所有字符串都是编译时常量,否则字符串连接始终是新对象。

如果你真的想用==来比较字符串,你需要实现构造的字符串,如下所示:

ab=(a+"deal").intern();

然而,这将是一个非常具体的用例,并且非常罕见。

请注意,这与两个常量连接时的情况不同;给定"ab"+"cd"编译器 required 将表达式解析为"abcd"并汇总结果。如果其中一个或两个值是编译时常量static final ...,情况也是如此。