Java中的equals()

來源:互聯網
上載者:User

經過幾天的學習,終於對equals的用法有了比較全面的認識,並做一個總結。

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

(此處先附上==的作用,後面仍有敘述。因為==和equals()方法的關係是很密切的,後面有我自己的看法。

    ==用於比較引用和比較基礎資料型別 (Elementary Data Type)時具有不同的功能:
     比較基礎資料型別 (Elementary Data Type),如果兩個值相同,則結果為true
     而在比較引用時,如果引用指向記憶體中的同一對象,結果為true)

 

   public  boolean equals(Object obj)

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

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()方法的本意為確定兩個對象的引用是否相同。

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()方法被進行了覆蓋,使其意義變為比較兩個對象的內容是否一致

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()方法脫離的本意,不再是比較兩個對象的引用是否相同,而是比較其內容是否相同。

以上內容為一般書上的總結,下面是我自己想到的一些東西。

我們可以知道電腦歸根到底進行的只是一些位元的與或非運算,加法乘法運算。由此有了些基本的運算子,所有的函數本質上其實現都是使用基本運算子來實現的。而==是基本運算子中的一個,它的作用:用於比較引用和比較基礎資料型別 (Elementary Data Type)時具有不同的功能:
     比較基礎資料型別 (Elementary Data Type),如果兩個值相同,則結果為true
     而在比較引用時,如果引用指向記憶體中的同一對象,結果為true

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.