“==”;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");
}
- 你能描述一下为什么会发生这种情况吗
==
)对象时比较引用。由于您创建了两个新对象,因此无论其内容如何,它们在内存中都有不同的地址。发生这种情况是因为这里有两个字符串对象-第一个是文本,另一个是使用新字符串创建的对象。当您显式创建一个新的字符串对象时,不会重用池中的字符串。
详细描述它字符串文本是在所谓的:池内存上创建的
但是,当用户使用显式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这是正确的,但这里的情况并非如此。他每次都会以智能方式创建一个新字符串实际上,从Java7开始,字符串池就在主堆中:,@StephenCoh:)我不知道。