java中equals
阿新 • • 發佈:2021-01-27
java語言中equals方法具有 對稱性 即對於任何引用的x和y, x.equals(y)返回值應該與y.equals(x)返回值一致
import java.util.Objects; /** * java語言中equals方法具有對稱性 *即對於任何引用的x和y, x.equals(y)返回值應該與y.equals(x)返回值一致 * */ public class Employee { private int id; private int salary; private String name; public Employee(int id, int salary, String name) { this.id = id; this.salary = salary; this.name = name; } @Override public boolean equals(Object obj) { //檢測this 與 obj 是否引用同一個物件 if(this==obj) return true; //檢測obj 是否為 null 若為 null 則返回false if(obj==null) return false; //如果equals的語義在每個子類中有所改變 就用getClass檢測 //如果所有子類都擁有統一的語義 就用instanceof檢測 //比較this 與 obj 是否屬於同一個類 //if(getClass()!=obj.getClass()) return false; if(!(obj instanceof Employee)) return false; Employee e= (Employee) obj; //對所需要比較的域進行比較 使用==比較基本型別域 使用equals比較物件與 //java中除了基本型別外 都為物件 return id==e.id&&salary==e.salary&& Objects.equals(name,e.name); } }
public class Manager extends Employee { private int bonus; public Manager(int id, int salary, String name,int bonus) { super(id, salary, name); this.bonus=bonus; } @Override public boolean equals(Object obj) { //在子類中重新定義equals 要先呼叫super.equals(obj) if(!(super.equals(obj))) return false; Manager m= (Manager) obj; //進行自己特有域比較 return bonus==m.bonus; } }
public class Test { public static void main(String[] args){ Employee e1=new Employee(1,100,"jack"); Manager m1=new Manager(1,100,"jack",100); System.out.println("e1.equals(m1): "+e1.equals(m1)); System.out.println("m1.equals(e1): "+m1.equals(e1)); } }
輸出結果:
將Employee類中 if(getClass()!=obj.getClass()) return false; 註釋去掉 則輸出:
a b 都為null時,將返回true; 如果其中之一為null,返回false;否則返回a.equals(b)
Objects.equals( , )原始碼
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
對於陣列型別的域,可以使用靜態的Arrays.equals方法檢測
當兩個陣列長度相同 並且在對應位置上資料元素也均相同 將返回true
type可以是Object、int、long、short、char、byte、boolean、float、double
public static boolean equals(type[] a, type[] a2)