equals方法和==运算符在Java中意外输出以下代码

equals方法和==运算符在Java中意外输出以下代码,java,string,operators,Java,String,Operators,原因:获取equals方法的不同输出 由于java.lang.String类重写equals方法,所以若两个String对象包含相同的内容,它将返回true,但若两个引用指向同一对象,则==将仅返回true 对于==运算符,我得到了正确的结果,但对于equals方法,我在程序中有点困惑,因为输出不同。请问,有谁能分享一下他们对此的看法吗?提前感谢字符串类重写等于,但您的计数器类不重写,这就是等于行为与=相同的原因t1.s1.equals(t2.s1)将返回true 类对象的equals方法实现了

原因:获取equals方法的不同输出

由于java.lang.String类重写equals方法,所以若两个String对象包含相同的内容,它将返回true,但若两个引用指向同一对象,则==将仅返回true


对于==运算符,我得到了正确的结果,但对于equals方法,我在程序中有点困惑,因为输出不同。请问,有谁能分享一下他们对此的看法吗?提前感谢

字符串
类重写
等于
,但您的
计数器
类不重写,这就是
等于
行为与
=
相同的原因
t1.s1.equals(t2.s1)
将返回
true

类对象的equals方法实现了最有区别的 对象上可能的等价关系;也就是说,对于任何非空 参考值x和y,当且仅当x 和y引用同一个对象(x==y的值为true)


计数器
不会重写
equals
方法,因此其行为与==。但是,在
String
类中,如果字符串的内容匹配,则重写此方法以返回
true
。您可以重写类中的方法以实现相同的功能

equals()
字符串的方法定义为:

public class Counter {

    String s1;

    Counter(String s) {
        this.s1 = s;
    }

    public static void main(String[] args) {
        Counter t1 = new Counter("test");
        Counter t2 = new Counter("test");
        System.out.println(t1 == t2); //false - Output
        System.out.println(t1.equals(t2)); //false - Output

        String s1 = new String("rt");
        String s2 = new String("rt");
        System.out.println(s1 == s2); //false - Output
        System.out.println(s1.equals(s2)); //true - Output
    }
}
而计数器类的
equals()
方法定义如下(继承对象为
Object
class)

正如您所看到的,这两种方法做的事情不同,得到的结果也不同。如果希望得到相同的结果,则可以重写
计数器
类中的
equals()
方法来实现类似字符串的功能,如下所示:

public boolean equals(Object obj) {
    return (this == obj);
}

=
equals
是不一样的,
=
是一种操作,它可以在受对象约束时比较对象的内存地址。但是equal方法只返回一个布尔值,它取决于equal方法内部包含的内容。equal方法位于对象类上。所以你可以重写这个方法,你可以说它等于或不等于

以你为例

public class Counter {

    String s1;

    Counter(String s) {
        this.s1 = s;
    }

    @Override
    public boolean equals(Counter counter) {
        return this.s1.equals(counter.s1);
    }

    ...
    ...
}

因此,如果要将HashMap和对象作为键处理,则需要重写equal方法,即重写
hashcode
方法。不仅仅是HashMap,其中涉及到哈希技术,这里是原因

您的类
计数器
既不重写
hashCode()
也不重写
equals()
。因此,类
计数器的行为与类
对象的行为完全相同。只有当两个
对象表示同一实例时,它们才是
=
equals()


如果您想更改此行为,则必须根据
equals()
方法定义的契约重写
Counter
equals()
hashCode()

那么,
计数器的
equals
逻辑不会自行编写和提供;)下次试着用谷歌吧。这么多的答案显然是一个超级基本的东西,几秒钟内就可以找到。。。悲哀的
public class Counter {

    String s1;

    Counter(String s) {
        this.s1 = s;
    }

    @Override
    public boolean equals(Counter counter) {
        return this.s1.equals(counter.s1);
    }

    ...
    ...
}
class Counter {
       private int count;
       public boolean equals(Object another){
           return another instanceof Counter && ((Counter)another).count == this.count;
       }
}