为什么DOES ==有时会在Java中处理字符串?

Yah*_*din -3 java

我有以下代码:

Circle c1 = new Circle();
Circle c2 = new Circle();
System.out.println(c1 == c2);
Run Code Online (Sandbox Code Playgroud)

False按预期方式输出哪些产出.这是因为c1并且c2是引用类型和"=="检查它们是否引用相同的类型(它们不是).

但是,我最近试过这个:

String a = "hello";
String b = "hello";
System.out.println(a == b);
Run Code Online (Sandbox Code Playgroud)

由于某种原因输出True.为什么是这样?String是引用类型,a并且b指向不同的内存位置.我总是被告知你需要使用.equals()它来工作,这不是!

请参阅:https://ideone.com/CyjE49

更新 这不是重复!我知道比较字符串的正确方法是使用.eqauls()

更新2 这个问题可能有一个答案:我如何比较Java中的字符串?,但问题是没有问我在问什么,答案只是比需要更详细.

因此,使用我的相同问题(在谷歌或其他方面)进行搜索意味着用户将不会被发送到该问题,或者由于问题的标题而可能完全解雇该问题.因此,为了其他用户的利益而保持这一点可能是一个好主意!

dav*_*mac 5

因为字符串文字是实习的,所以相同的文字引用同一个对象.因此,检查它们之间的引用相等性必然会返回true.

从Java语言规范(3.10.5):

此外,字符串文字始终引用类String的相同实例.这是因为字符串文字 - 或者更常见的是作为常量表达式(第15.28节)的值的字符串 - 被"实例化"以便使用String.intern方法共享唯一实例.

在实践中,编译器将"早期"汇集字符串文字,并仅在已编译的.class文件中存储一个副本.但是,来自单独的类文件的相同字符串文字仍将比较相等,==因为在加载类时文字仍然是实际的.

另一方面,如果我们正确地将您的示例应用于Circle to String,我们将:

String a = new String("hello");
String b = new String("hello");
System.out.println(a == b);  // will print false!
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们显式创建新对象,因此它们不能是相等的引用.

通过除文字或其他常量字符串表达式以外的方式构造的任何字符串也不一定要将引用相等与相同的字符串进行比较.例如:

String a = "hello";
String b = "hello";
System.out.println(a.substring(0,3) == b.substring(0,3));  // may print false!
Run Code Online (Sandbox Code Playgroud)