1. 程式人生 > 其它 >java中equals

java中equals

技術標籤:java學習java

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)