equals方法

1.equals的本意——即在Object對象中定義的equals()方法有什麼樣的意義。

(此處先附上==的做用,後面仍有敘述。由於==和equals()方法的關係是很密切的,後面有我本身的見解。java

    ==用於比較引用和比較基本數據類型時具備不一樣的功能:
     比較基本數據類型,若是兩個值相同,則結果爲true
     而在比較引用時,若是引用指向內存中的同一對象,結果爲true)ide

   public  boolean equals(Object obj)函數

   其比較規則爲:當參數obj引用的對象與當前對象爲同一個對象時,就返回true,不然返回false.this

public class Fish {
    private int weight;
    private String color;

 

    public Fish(int weight, String color) {
        this.color = color;
        this.weight = weight;
    }

    public int getWeight() {
        return weight;
    }

    public void setWeight(int weight) {
        this.weight = weight;
    }

 

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

}

public class EqualsTest {
    public static void main(String[] args) {
        Fish f1 = new Fish(1, "blue");
        Fish f2 = new Fish(1, "blue");

 

        System.out.println(f1 == f2);
        System.out.println(f1.equals(f2));
    }
}

——————運行結果爲——————

false
false

 

因而可知,equals()方法的本意爲肯定兩個對象的引用是否相同。spa

2.而JDK類中有一些類覆蓋了oject類的equals()方法,比較規則爲:若是兩個對象的類型一致,而且內容一致,則返回true,這些類有:
java.io.file,java.util.Date,java.lang.string,包裝類(Integer,Double等)

public class EqualsTest {
    public static void main(String[] args) {
        String s1=new String("sss");
        String s2=new String("sss");
        
        System.out.println(s1==s2);
        System.out.println(s1.equals(s2));
    }
}

————————運行結果爲——————

false
true

由此知道,在String中equals()方法被進行了覆蓋,使其意義變爲比較兩個對象的內容是否一致code

3.若是咱們要本身覆蓋equals()方法,讓其比較內容或者有別的使用方法(固然咱們通常都是用於比較內容的,可是覆蓋的方法中真正的實現到底是什麼樣的,誰知道呢O(∩_∩)O~)

public class Fish {
    private int weight;
    private String color;

 

    public Fish(int weight, String color) {
        this.color = color;
        this.weight = weight;
    }
    
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((color == null) ? 0 : color.hashCode());
        result = prime * result + weight;
        return result;
    }
    
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Fish other = (Fish) obj;
        if (color == null) {
            if (other.color != null)
                return false;
        } else if (!color.equals(other.color))
            return false;
        if (weight != other.weight)
            return false;
        return true;
    }
    public int getWeight() {
        return weight;
    }

    public void setWeight(int weight) {
        this.weight = weight;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

}

public class EqualsTest {
    public static void main(String[] args) {
        Fish f1 = new Fish(1, "blue");
        Fish f2 = new Fish(1, "blue");

 

        System.out.println(f1 == f2);
        System.out.println(f1.equals(f2));
    }
}

——————運行結果爲——————

false
true

此例子中我複寫了equals()方法和hashcode()方法,使得equals()方法脫離的本意,再也不是比較兩個對象的引用是否相同,而是比較其內容是否相同。對象

以上內容爲通常書上的總結,下面是我本身想到的一些東西。blog

咱們能夠知道計算機歸根到底進行的只是一些二進制數的與或非運算,加法乘法運算。由此有了些基本的運算符,全部的函數本質上其實現都是使用基本運算符來實現的。而==是基本運算符中的一個,它的做用:用於比較引用和比較基本數據類型時具備不一樣的功能:
     比較基本數據類型,若是兩個值相同,則結果爲true
     而在比較引用時,若是引用指向內存中的同一對象,結果爲true內存

而equals()做爲方法,咱們能夠推測知道,它其中的實現所使用的確定是==運算符。再進一步的思考,equals()本意不正是==運算符進行對象比較時候的做用嗎。那麼,既然是二者有一樣的做用,爲何還要弄出一個equals()方法來呢。由於==運算符不容許咱們進行覆蓋,也就是說它限制了咱們的表達。在上面的第三個例子中,咱們複寫equals()方法,達到比較對象內容是否相同的目的。而這些經過==運算符是作不到的。get

相關文章
相關標籤/搜索