有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

为什么==有时可以在Java中处理字符串?

我有以下代码:

Circle c1 = new Circle();
Circle c2 = new Circle();
System.out.println(c1 == c2);

输出False,正如预期的那样。这是因为c1c2是引用类型,“==”检查它们是否引用了相同的类型(它们没有)

然而,我最近尝试了以下方法:

String a = "hello";
String b = "hello";
System.out.println(a == b);

出于某种原因,它输出True。这是为什么?String是一种引用类型,ab表示不同的内存位置。我一直被教导,你需要使用.equals()来让它工作,而这不是

见:https://ideone.com/CyjE49

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

更新2 这个问题的答案可能是:How do I compare strings in Java?,但问题并没有问我在问什么,答案只是比要求的更详细

因此,搜索我的同一个问题(在谷歌或其他网站上)意味着用户不会被发送到该问题,或者可能会因为问题的标题而完全忽略它。因此,为了其他用户的利益,保持这种状态可能是一个好主意


共 (1) 个答案

  1. # 1 楼答案

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

    来自Java语言规范(3.10.5):

    Moreover, a string literal always refers to the same instance of class String. This is because string literals - or, more generally, strings that are the values of constant expressions (§15.28) - are "interned" so as to share unique instances, using the method String.intern.

    在实践中,编译器将“早”地将字符串文本汇集在一起,并在编译后的文本中只存储一个副本。类文件。然而,来自不同类文件的相同字符串文本仍将使用==进行相等比较,因为加载类时文本仍处于内部状态

    另一方面,如果我们正确地将你的例子中的圆圈应用到字符串中,我们会:

    String a = new String("hello");
    String b = new String("hello");
    System.out.println(a == b);  // will print false!
    

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

    通过文本或其他常量字符串表达式以外的方式构造的任何字符串也不一定会将reference equal与相同的字符串进行比较。例如:

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