Java 使用+;操作人员

Java 使用+;操作人员,java,Java,为什么输出为false? 在这个程序中,ab是在stringliteral中创建的,然后创建abc但是为什么ab和abc在字符串常量池中不引用相同的内存,因为在创建abc之前,它会在字符串常量池中搜索字符串meowdeal 我会解释发生了什么: public class Strings { public static void main(String ads[]) { String a = "meow";

为什么输出为
false

在这个程序中,
ab
是在
string
literal中创建的,然后创建
abc
但是为什么
ab
abc
在字符串常量池中不引用相同的内存,因为在创建
abc
之前,它会在字符串常量池中搜索字符串meowdeal

我会解释发生了什么:

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

Java只在编译时存储它知道的字符串;字符串常量和常量字符串表达式。a是一个局部变量,因此+“deal”是一个直到运行时才计算的字符串表达式(即使您查看它时可以看到它应该是常量)。Java编译器不知道它是一个常量表达式,也不把它放在池中。它在运行时执行字符串连接,从而产生一个与池中任何对象不同的对象。

您的问题意味着您希望Java检查每个字符串连接的结果,以查看字符串常量池中是否有匹配的字符串,但这将是非常低效的。字符串concat总是新对象,除非所有字符串都是编译时常量

如果您真的想使用
==
比较字符串,您需要像这样插入构造的字符串:

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()
           }
       }
然而,这将是一个非常特殊的用例,非常罕见


请注意,这与连接两个常量的情况不同;给定
“ab”+“cd”
,编译器需要将表达式解析为
“abcd”
,并汇集结果。如果一个或两个值都是编译时常量,
static final…
,则情况也是如此

这是因为它检查的是对象的相等性,而不是内容。尝试ab.equals(abc),它将显示true.System.out.println(“test”==“te”+“st”)------这是真的,为什么。我从@devnull提供的链接中获得了这段代码作为对这个问题的注释。常量检查器不能“看穿”任何类型的变量。@shin--“test”==“te”+“st”,所有字符串都是常量,因此编译器将“te”+“st”简化为“test”;常量池中的对象与以这种方式编写的“test”相同。@antlersoft好的,谢谢您的回复。那么java不会将包含任何变量或方法的字符串表达式汇集在一起?
ab=(a+"deal").intern();