Java 为什么字符串在连接期间显示不同的行为?

Java 为什么字符串在连接期间显示不同的行为?,java,Java,它打印“true”,因为它在字符串常量池中共享相同的内存。但是当我写下面的代码时 String a = "x"; String b = "x"; System.out.println(a==b); 它的打印错误 我知道“==”会比较实例 我的问题是——为什么第二个场景中的实例不一样。创建新字符串时,它总是检查池中是否有相同的字符串可用。然后在创建字符串b之后,即池中有“xy”。因此,当我试图创建具有相同“xy”的字符串c时,它不应该创建新实例。它应该共享相同的内存,而不是创建新实例。那么,为什

它打印“true”,因为它在字符串常量池中共享相同的内存。但是当我写下面的代码时

String a = "x";
String b = "x";
System.out.println(a==b);
它的打印错误

我知道“==”会比较实例


我的问题是——为什么第二个场景中的实例不一样。创建新字符串时,它总是检查池中是否有相同的字符串可用。然后在创建字符串b之后,即池中有“xy”。因此,当我试图创建具有相同“xy”的字符串c时,它不应该创建新实例。它应该共享相同的内存,而不是创建新实例。那么,为什么在第二个场景中实例不同呢?

这里,
a+“y”
创建一个新的
字符串
对象,因此,
=
返回false。它检查对象引用,而不是对象相等

比较字符串时,应使用
equals
方法

  • =
    运算符检查两个引用变量是否引用同一对象
  • equals()
    方法检查对象的内容是否相同

了解问题是字符串是
不可变的
,对字符串的每次更新操作都会生成新字符串,
=
在类类型中检查实例,而不是其值

尝试
final

String a = "x";
String b = a + "y";
String c = "xy";
System.out.println(b==c);
或者使用
equals()

编辑:

字符串文字在字符串池中直接可用。在本例中,字符串b=a+“y”不同,这里是它的堆。您可以使用
intern()
使其在字符串池中可用

System.out.println(b.equals(c));

这可能有效,并且可以找到原因的解释


我的问题是——为什么第二个场景中的实例不一样。创建新字符串时,它总是检查池中是否有相同的字符串可用。然后在创建字符串b之后,即池中有“xy”。因此,当我试图创建具有相同“xy”的字符串c时,它不应该创建新实例。。正确???@user2590663错误。您有这样一个概念,“当创建一个新字符串时,它总是检查池中是否有相同的字符串可用”。这根本不是事实。程序在运行时不进行检查。(这会花费太多时间。)dupe也是“当创建一个新字符串时,它总是检查池中是否有相同的字符串。”基本上,这是错误的。这只在编译时是正确的,这是无关的。提问者特别询问了为什么实例平等不起作用。他并没有询问比较字符串的正确方法,但字符串是不可变的对象,这就解释了为什么实例不等式不起作用。如果他/她想知道如何正确地检查字符串的相等性,这是一种方法。从我的角度来看,我认为这是一个问题,为什么存储在一个变量中的“xy”与存储在另一个变量中的“xy”是不同的对象。
System.out.println(b.equals(c));
String b = (a + "y").intern();
System.out.println(a==b);//true
String a = "x";
String b = a + "y";
String c = "xy";
System.out.println(b.equals(c));