Java 逻辑相等与对象引用相等

Java 逻辑相等与对象引用相等,java,string,equals,stringbuilder,Java,String,Equals,Stringbuilder,我正在学习OCA 8认证。在Java中,“逻辑平等”是什么意思 我有这个案子: String s1 = new String("java"); String s3 = new String("java"); StringBuilder s2 = new StringBuilder("java"); StringBuilder s4 = new StringBuilder("java"); if (s1 == s2) { System.out.print("1"); } //er

我正在学习OCA 8认证。在Java中,“逻辑平等”是什么意思

我有这个案子:

String s1 = new String("java");
String s3 = new String("java");
StringBuilder s2 = new StringBuilder("java");
StringBuilder s4 = new StringBuilder("java");

if (s1 == s2)      {    System.out.print("1"); } //error
if (s1.equals(s2)) {    System.out.print("2"); } //false
if (s1.equals(s3)) {    System.out.print("3"); } //true
if (s2.equals(s4)) {    System.out.print("4"); } //false
该部分:

对象
String
上的方法
equals()
被重新定义,以将对象的值与另一个值进行比较。出于这个原因,当我排除该行时:

if (s1.equals(s3)) {    System.out.print("3"); } 
我有结果3

在对象
StringBuilder
上,未重新定义方法
equals()
,因此它将比较对象引用等式。因此,当我执行代码行时:

if (s2.equals(s4)) {    System.out.print("4"); }
我得到了结果
false

我的问题是:

  • 为什么当我执行
    如果(s1==s2)
    时,我会得到一个编译错误
  • 为什么当我计算s1.equals(s2)时它是假的
  • 为什么当我执行if(s1==s2)时,我将是一个编译错误
  • 为什么当我超越s1.equals(s2)时它是假的
  • 对。因为
    String
    不是
    StringBuilder
    。您将得到“操作数类型String和StringBuilder不兼容”(因为
    String
    不是
    StringBuilder
  • 同样,因为
    String
    不是
    StringBuilder
    。您可以使用
    s1.equals(s2.toString())
    (即
    true
    • 为什么当我执行if(s1==s2)时,我将是一个编译错误
    =
    运算符是一个。引用JLS:

    如果无法通过强制转换将任一操作数的类型转换为另一个操作数的类型(§5.5),则为编译时错误

    在您的情况下,这两个操作数的类型为
    String
    StringBuilder
    ,它们不兼容:不能将
    String
    转换为
    StringBuilder
    ,反之亦然

    • 为什么当我超越s1.equals(s2)时它是假的

    String
    StringBuilder
    是两种不同的类型。
    String
    中的
    equals()
    方法检查给定的参数是否也是
    String
    类型,这里不是这种情况,因此
    String
    的实例永远不能等于
    StringBuilder
    的实例。我刚刚发现了原因

    由于equals方法采用了类似对象的参数,我感到困惑(为此,我认为它在方法中被视为对象,但我发现这是第二个if条件,它只适用于String对象(在这里,我找到了关于逻辑相等性问题的答案)。
    Thnk to all

    您是否查看了第一部分的编译器错误?您不了解错误消息的哪一部分?对于第二个问题,您为什么希望
    StringBuilder
    等于
    String
    ?我已经阅读了编译器错误(它说它们是两个不同的对象).出于这个原因,我询问了java中的逻辑相等问题。我不排除2对象将相等,但我支持这样一种情况,即我需要创建2个对象,定义相同的方法(其中一个查找值相等,另一个查找引用相等)如果你不期望这两个对象是相等的,我不明白你为什么问第二个问题。恐怕你的评论一般不清楚:(当我需要考虑2个不同的对象的平等或不平等的情况吗?)
    1012    public boolean equals(Object anObject) {
    1013        if (this == anObject) {
    1014            return true;
    1015        }
    1016        if (anObject instanceof String) {
    1017            String anotherString = (String)anObject;
    1018            int n = count;
    1019            if (n == anotherString.count) {
    1020                char v1[] = value;
    1021                char v2[] = anotherString.value;
    1022                int i = offset;
    1023                int j = anotherString.offset;
    1024                while (n-- != 0) {
    1025                    if (v1[i++] != v2[j++])
    1026                        return false;
    1027                }
    1028                return true;
    1029            }
    1030        }
    1031        return false;
    1032    }