equals
我們知道equals()方法是定義在Object類中的,在沒有被覆寫時該方法與運算符==的作用是一樣的。因為在 Object 類中equals()直接使用= =來實作。
值得注意的是 == 比較時用的是正真的位址。
那是不是我們要用時都需要覆寫呢?其實也不是這樣的,在一些标準類庫中有的已經覆寫好了可以直接使用,常見的有 file , integer , data , String類。
下面我們一起來學習吧!
訓示其他某個對象是否與此對象“相等”。
equals 方法在非空對象引用上實作相等關系:
· 自反性:對于任何非空引用值
x,x.equals(x) 都應傳回 true。
· 對稱性:對于任何非空引用值
x 和 y,當且僅當 y.equals(x) 傳回 true 時,x.equals(y) 才應傳回 true。
· 傳遞性:對于任何非空引用值
x、y 和 z,如果 x.equals(y) 傳回 true,并且 y.equals(z) 傳回 true,那麼 x.equals(z) 應傳回 true。
· 一緻性:對于任何非空引用值
x 和 y,多次調用 x.equals(y) 始終傳回 true 或始終傳回 false,前提是對象上 equals 比較中所用的資訊沒有被修改。
· 對于任何非空引用值 x,x.equals(null) 都應傳回 false。
Object 類的 equals 方法實作對象上差别可能性最大的相等關系;即,對于任何非空引用值 x 和 y,當且僅當 x 和 y 引用同一個對象時,此方法才傳回 true(x == y 具有值 true)。
注意:當此方法被重寫時,通常有必要重寫
hashCode 方法,以維護 hashCode 方法的正常協定,該協定聲明相等對象必須具有相等的哈希碼。
參數:
obj
- 要與之比較的引用對象。
傳回:
如果此對象與 obj 參數相同,則傳回 true;否則傳回 false。
此處隻是為了實作equals方法的重寫,就不對hashcode方法的重寫。
那怎樣實作呢?
Students類
package it.itcost;
public class Students {
//學生的姓名
private String name;
//學生的學号
private int id;
//學生的成績
private double grade;
Students(String name,int id,double grade){//三個參數的構造函數,用于給屬性初始化
this.name = name;
this.id = id;
this.grade = grade;
}
//重寫object的equals方法
//形參用object類型,有利于在繼承了同一個父類的子類對象可以使用該方法
public boolean equals(Object obj){//顯示參數名為obj
//檢測this與obj是否引用同一個對象
if(this == obj)
return true;
//檢測odj是否為null,如果為空則傳回false
if(obj == null)
return false;
//比較this與odj是否屬于同一個類如果equals的語義在每一個類中有所改變,就使用getClass檢測
if(this.getClass().getName() != obj.getClass().getName())
return false;
// //如果所有的子類都有統一的語義,就使用instanceof檢測
// //instanceof是Java中的二進制運算符,左邊是對象,右邊是類;當對象是右邊類或子類所建立對象時,傳回true;否則,傳回false。
// if(!(obj instanceof Students))
// return false;
//通過以上的判斷我們知道了Students的對象以及傳給obj的對象不為null
//對obj向下造型
Students other = (Students)obj;
//測試對象的各屬性的值是否相等
return name.equals(other.name) //name是String類型是引用類型并且覆寫了equals方法,可以通過調用String類的equals來比較
&&this.id==other.id //id是基本類型直接使用==比較值是否相等
&&this.grade==other.grade; //grade是基本類型直接使用==比較值是否相等
}
}
下面是測試代碼
package it.itcost;
public class StudentsTest {
public static void main(String[] args) {
Students Stu0 = new Students("柒間",20182206,90.00);
Students Stu1 = new Students("柒間",20182206,90.00);
Students Stu = new Students("Tom",20180000,80.00);
//Stu1---Stu0
System.out.println((Stu1.equals(Stu0)));
//Stu---Stu0
System.out.println((Stu.equals(Stu0)));
}
}
上面代碼自己手寫的如有改進的地方歡迎留言一起學習!