-3

我想知道:为什么这段代码会导致false?当它是相同的内存点时,
Coz==运算符应该返回。true

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

    System.out.println(a == "hello");
}
  • 你能描述一下为什么会这样吗?
4

4 回答 4

5

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

于 2013-05-12T10:20:17.183 回答
3

发生这种情况是因为这里有两个 String 对象 - 第一个是文字,另一个是使用new String. 当您显式创建一个新的 String 对象时,池中的 String 不会被重用。详细描述http://theopentutorials.com/tutorials/java/strings/string-literal-pool/

于 2013-05-12T10:23:45.443 回答
3

字符串文字是在所谓的:Pool Memory上创建的。

但是,当使用显式new关键字创建 String 时,他实际上创建了一个新的 String 对象,与池内存的对象无关。这意味着两个引用根本不一样。

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

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

_ 仅使用文字来创建/重用String.

作为信息,创建池内存是为了避免创建一些无用的通用/冗余文字字符串,从而优化内存空间。

Integer 也存在类似的概念:Integer caching in Java

于 2013-05-12T10:25:04.290 回答
0

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

String a = "hello";
于 2013-05-12T10:26:20.207 回答