测试对象的等价性的关系操作符 “==”和”!=”
关系操作符 == 和 != 适用于所有object对象,但这两个操作符对于刚接触java不久的人经常会感到困惑,先看下面这个例子
public class Equals {
public static void main(String[] args){
String aString=new String("ss");
String bString=new String("ss");
System.out.println(aString == bString);
System.out.println(aString != bString);
}
}
System.out.println结果:
false
true
或许你会感到疑惑,为什么aString和bString创建的都是同一个字符串,为什么不相等呢?
这是因为 == 和 != 比较的是对象的引用,所以尽管aString和bString的内容相同,但是结果仍是false;
如果想比较内容是否相同,必须调用所有对象适用的特殊方法equals()。
equals()方法的使用
public class Equals {
public static void main(String[] args){
String aString=new String("ss");
String bString=new String("ss");
System.out.println(aString.equals(bString));
}
}
输出结果为:true
到这里如果你觉得结束的话,那么以后你还会对这个问题产生困惑,如下例
public class Equals {
public static void main(String[] args){
Tsts ts1=new Tsts();
Tsts ts2=new Tsts();
ts1.mv=ts2.mv=10;
System.out.println(ts1.equals(ts2));
}
}
class Tsts{
int mv;
}
输出结果为:false
看到上面结果你是不是更疑惑了,结果又是 false,这是由于 equals()的默认默认行为是比较引用。所以除非在新类中覆盖重写 equals() 的方法,否则不可能出现我们想要的结果。
而String的equals()的方法本身已经被覆盖重写了,所以equals()后得到 true
下面是覆盖重写了 Tsts 的 equals() 方法,得到了我们期望的结果
public class Equals {
public static void main(String[] args){
Tsts ts1=new Tsts();
Tsts ts2=new Tsts();
ts1.mv=ts2.mv=10;
System.out.println(ts1.equals(ts2));
}
}
class Tsts{
int mv;
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Tsts tsts = (Tsts) obj;
if (tsts.mv== this.mv) {
return true;
} else {
return false;
}
}
}
输出结果:true