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