1. 程式人生 > 程式設計 >Java中equals()知識點總結

Java中equals()知識點總結

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

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

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

==用於比較引用和比較基本資料型別時具有不同的功能:
比較基本資料型別,如果兩個值相同,則結果為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
false

由此可見,equals()方法的本意為確定兩個物件的引用是否相同。

2.而JDK類中有一些類覆蓋了oject類的equals()方法,比較規則為:如果兩個物件的型別一致,並且內容一致,則返回true,這些類有:

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

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

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

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

到此這篇關於Java中equals()知識點總結的文章就介紹到這了,更多相關Java中的equals()內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!