網頁

2019/6/5

Java 比較物件是否相等的Identity與Equality

當比較Java中的物件是否相同時,就要了解物件的Identity與Equality是什麼,兩者有何區別。

Identity是參照上的相同。也就是用==來比較,如果是物件的話比較的是指向的參照位置。

Equality是內容上的相同。也就是用equals()hashCode()來比較。

例如下面分別用==equals()來比較兩個物件,
因為兩個物件是個別new出來的,所以參照的記憶體位置不同,因此==結果為false;
但因為內容相同,所以用equals()比較結果為true。

public class Main {

    public static void main(String[] args) {

        People p1 = new People();
        p1.setName("Goku");
        p1.setPower(3000000);
        
        People p2 = new People();
        p2.setName("Goku");
        p2.setPower(3000000);

        System.out.println(p1 == p2); // false

        System.out.println(p1.equals(p2)); // true
        
    }

}

class People {
    private String name;
    private int power;

    @Override
    public boolean equals(Object o) {
        if (o == this) return true;
        if (!(o instanceof People)) {
            return false;
        }
        People p = (People) o;
        return p.name.equals(name) && p.power == power;
    }

    @Override
    public int hashCode() {
        int result = 17;
        result = 31 * result + name.hashCode();
        result = 31 * result + power;
        return result;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public int getPower() {
        return power;
    }
    public void setPower(int power) {
        this.power = power;
    }
  
}

參考:

沒有留言:

張貼留言