==,equals區別和equals方法重寫


java中的數據類型,可分為兩類: 

1.基本數據類型,也稱原始數據類型。byte,short,char,int,long,float,double,boolean 
  他們之間的比較,應用雙等號(==),比較的是他們的值。 
2.復合數據類型(類) 
  當他們用(==)進行比較的時候,比較的是他們在內存中的存放地址,所以,除非是同一個new出來的對象,他們的比較后的結果為true,否則比較后結果為false。 JAVA當中所有的類都是繼承於Object這個基類的,在Object中的基類中定義了一個equals的方法,這個方法的初始行為是比較對象的內存地址,

如下圖

但在一些類庫當中這個方法被重寫了,如String,ArrayList在這些類當中equals有其自身的實現,而不再是比較類在堆內存中的存放地址了。

如下圖

ArrayList中的equals

 

String 中的equals


  對於復合數據類型之間進行equals比較,在沒有重寫equals方法的情況下,他們之間的比較還是基於他們在內存中的存放位置的地址值的,因為Object的equals方法也是用雙等號(==)進行比較的,所以比較的結果跟雙等號(==)的結果相同。

舉幾個例子

    String a = "bbb";
       String b = "bbb";
       String c = new String("bbb");
       String d = new String("bbb");
System.out.println(a==b); System.out.println(a==c); System.out.println(c==d); System.out.println(); System.out.println(a.equals(b)); System.out.println(a.equals(b)); System.out.println(c.equals(d));

運行結果是

true

false

false

 

true

true

true

在使用==比較時

a==b返回true 說明 a b 引用同一個String對象(使用 a = "bbb" 這樣的表達是創建字符串的時候,程序首先會在這個String緩沖池中尋找相同值的對象)

a==c返回false說明 c創建了一個新的對象  (而不引用同一個”bbb”對象,新建了一個)

c==f返回 false說明d也是創建了一個新的對象。

使用equals比較時

由於比較的是內容不是地址  所以都為true

而由於復合數據類型之間進行equals比較,在沒有重寫equals方法的情況下,他們之間的比較還是基於他們在內存中的存放位置的地址值的,因為Object的equals方法也是用雙等號(==)進行比較的,所以比較的結果跟雙等號(==)的結果相同。

如下

public class EqualsDemo {

 
    String b;
    public EqualsDemo(String i){
       this.b=i;
    }
    public static void main(String[] args) {

      
       EqualsDemo a = new EqualsDemo("1");
       EqualsDemo b = new EqualsDemo("1");
       EqualsDemo d = new EqualsDemo("2");
       EqualsDemo c = a;

       System.out.println(a==c);
       System.out.println(a==d);
       System.out.println(b==c);
       System.out.println(b==a);

       System.out.println(a.equals(c));
       System.out.println(a.equals(d));
       System.out.println(b.equals(c));
       System.out.println(b.equals(a));
    }
}

運行結果

true

false

false

false

true

false

false

false

== 和equals結果相同

但是在實際的使用過程中我們需要比較兩個對象的內容是否相等,就如上例中對象a和對象b

所以我們要重寫equals方法。

1.自反性:對於任何非空引用x,x.equals(x)應該返回true。
2.對稱性:對於任何引用x和y,如果x.equals(y)返回true,那么y.equals(x)也應該返回true。
3.傳遞性:對於任何引用x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也應該返回true。
4.一致性:如果x和y引用的對象沒有發生變化,那么反復調用x.equals(y)應該返回同樣的結果。
5.非空性:對於任意非空引用x,x.equals(null)應該返回false。

下面為對應的重寫代碼格式

  @Override
    public boolean equals(Object obj) {
       if(this == obj)
           return true;
       if(obj == null)
           return false;
       if(!(obj instanceof EqualsDemo))
           return false;
       EqualsDemo other = (EqualsDemo)obj;
       if(b == null){
           if(other.b !=null)
              return false;
       }else if(!b.equals(other.b))
           return true;
       return true;
    }

  

重寫代碼后,運行程序,結果如下

true

false

false

false

 

true

true

true

true

本人知識有限,如有錯誤,望指出

此文系原創,轉載請聲明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM