“==”;Java中的运算符

“==”;Java中的运算符,java,Java,我想知道:为什么这个代码会导致false? 因为当它是相同的存储点时,操作符应该返回true public static void main(String[] args) { String a = new String("hello"); System.out.println(a == "hello"); } 你能描述一下为什么会发生这种情况吗 Java在比较(==)对象时比较引用。由于您创建了两个新对象,因此无论其内容如何,它们在内存中都有不同的地址。发生这种情况是因为这

我想知道:为什么这个代码会导致
false

因为当它是相同的存储点时,操作符应该返回
true

public static void main(String[] args) {
    String a = new String("hello");

    System.out.println(a == "hello");
}
  • 你能描述一下为什么会发生这种情况吗

Java在比较(
==
)对象时比较引用。由于您创建了两个新对象,因此无论其内容如何,它们在内存中都有不同的地址。

发生这种情况是因为这里有两个字符串对象-第一个是文本,另一个是使用
新字符串创建的对象。当您显式创建一个新的字符串对象时,不会重用池中的字符串。

详细描述它

字符串文本是在所谓的:池内存上创建的

但是,当用户使用显式
new
关键字创建字符串时,实际上会创建一个新字符串对象,与池内存的对象无关。这意味着两个引用完全不同

在您的示例中,您可以通过两种方式解决此问题:

_使用
java.lang.String.intern
方法:将显式创建的字符串放入池内存中

_仅使用文字来创建/重用
字符串

作为参考,创建池内存是为了避免一些无用的公共/冗余文本字符串的创建,从而优化内存空间


整数也有类似的概念:

命令
stringa=newstring(“hello”)
在内存的非池部分创建字符串对象,然后
a
引用它。然后,
“hello”
被放入
字符串
池中。而在比较时,
a==“hello”
的“hello”在字符串池中。因此,尽管两个对象的内容相同,但它们的引用是不同的。必须以以下方式声明
a
,比较结果将返回
true

String a = "hello";

您回答了自己的问题:“当它是相同的记忆点时,它应该返回true”。显然,这不是同一个记忆点。这个问题每天被问100次左右。应该有一个自动的答案,它不是那么简单。在第一个实例中,OP创建一个
新字符串
。在第二个实例中,OP使用
字符串
文本。所以
System.out.println(“hello”==“hello”)
实际上会返回
true
。可能值得一提的是
String
interning.@BoristSpider这是正确的,但这里的情况并非如此。他每次都会以智能方式创建一个新字符串