0

以下在 Java 中是正确的

"abc"=="abc"

为什么?这两个Strings是两个不同的对象,它们不应该具有相同的对象标识吗?

4

3 回答 3

5

==java中对非原始对象的操作将按内存位置进行比较。由于这两个字符串都是编译时常量,编译器只会将它们存储一次,因此您将获得您描述的结果。

于 2014-03-01T00:59:38.270 回答
4

这是因为 Java 编译器执行了优化。

在编译时它看到你有一个常量 string "abc",所以当它遇到另一个常量字符串时,它会检查并发现它已经将该字符串加载到内存中。所以,它只是再次使用相同的对象。

结果是它们在内存中是完全相同的对象。

于 2014-03-01T00:58:48.530 回答
2

Java 将所有文字(放置在代码中的字符串)保存在 JVM 内存的特殊部分中。如果有两个或多个相同的文字,JVM 只需指向同一个对象,而不是创建几个具有相同内容的字符串。

所以:

"ab" == "ab" // true - because they are the same objects

但:

"ab" == new String("ab") // false - because new String(...) is new String not literal

intern()您可以通过调用方法获取或移动您的字符串到特殊内存。

    String ab1 = "ab";
    String ab2 = new String("ab");
    // ab1 == ab2 is false as described above
    ab2 = ab2.intern();
    // ab1 == ab2 but now it's true because ab2 pointers to "ab" in special part of memory.
于 2014-03-01T01:09:47.073 回答