以下在 Java 中是正确的
"abc"=="abc"
为什么?这两个Strings是两个不同的对象,它们不应该具有相同的对象标识吗?
以下在 Java 中是正确的
"abc"=="abc"
为什么?这两个Strings是两个不同的对象,它们不应该具有相同的对象标识吗?
==
java中对非原始对象的操作将按内存位置进行比较。由于这两个字符串都是编译时常量,编译器只会将它们存储一次,因此您将获得您描述的结果。
这是因为 Java 编译器执行了优化。
在编译时它看到你有一个常量 string "abc"
,所以当它遇到另一个常量字符串时,它会检查并发现它已经将该字符串加载到内存中。所以,它只是再次使用相同的对象。
结果是它们在内存中是完全相同的对象。
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.