我想知道:为什么这段代码会导致false
?当它是相同的内存点时,
Coz==
运算符应该返回。true
public static void main(String[] args) {
String a = new String("hello");
System.out.println(a == "hello");
}
- 你能描述一下为什么会这样吗?
我想知道:为什么这段代码会导致false
?当它是相同的内存点时,
Coz==
运算符应该返回。true
public static void main(String[] args) {
String a = new String("hello");
System.out.println(a == "hello");
}
当您比较 ( ==
) 对象时,Java 会比较引用。由于您创建了两个新对象,因此无论其内容如何,它们在内存中的地址都不同。
发生这种情况是因为这里有两个 String 对象 - 第一个是文字,另一个是使用new String
. 当您显式创建一个新的 String 对象时,池中的 String 不会被重用。详细描述http://theopentutorials.com/tutorials/java/strings/string-literal-pool/
字符串文字是在所谓的:Pool Memory上创建的。
但是,当使用显式new
关键字创建 String 时,他实际上创建了一个新的 String 对象,与池内存的对象无关。这意味着两个引用根本不一样。
在您的示例中,您可以通过以下两种方式解决此问题:
_ 使用java.lang.String.intern
方法:将你显式创建的 String 放入池内存中。
_ 仅使用文字来创建/重用String
.
作为信息,创建池内存是为了避免创建一些无用的通用/冗余文字字符串,从而优化内存空间。
Integer 也存在类似的概念:Integer caching in Java
该命令String a = new String("hello");
在内存的非池部分创建一个 String 对象,然后a
引用它。然后"hello"
被放入String
池中。而在比较时,a == "hello"
“hello”在字符串池中。因此,尽管两个对象的内容相同,但两个对象的引用是不同的。必须以以下方式声明a
比较将返回true
String a = "hello";