1. 程式人生 > >Java中關於==和equal的區別以及equals()方法重寫

Java中關於==和equal的區別以及equals()方法重寫

例子i:

string1="aaa";

string2="aaa";

String string3=new String("aaa");

String string4=new String("aaa");

string1==string2 // true; .

string1.equals(string2);//true;

string3==string4;//false 因為用new建立了2個物件,所以是兩個不同的記憶體地址

string3.equals(string4);//true 而String類的是不可改變的,所以會指向同一個記憶體地址,所以返回為true

equals()是object的方法,所以只是適合物件,不適合於基本型別,equals()預設是用"=="比較兩個物件的記憶體地址,如果想要比較兩個物件的內容,要重寫equals()方法才可...而==可以比較兩個基本型別,也可以是物件...

String的equals()方法重寫:

public boolean equals(Object object){

if( this==anObject)

{return true;}

if(anObject instancdOf String)

{String anotherString =(String)anObject;

int n= count;

if(n==anotherString.count)

{ char V1[]=value;

char V2[]=anotherString.value;

int i=offset;

int j=anotherString.offset;

while(n--!=0)

{ if (v1[i++]!=V2[j++]

return false;}

return true;}

}

return false;

}

總而言之:在類物件中 equals()方法比較的是物件的值,==比較的是物件.即為物件的引用(即為記憶體地址)一些特殊情況下equals()是重寫了方法咯..

equal:是用來比較兩個物件內部的內容是否相等的,由於所有的類都是繼承

自java.lang.Object類的,所以如果沒有對該方法進行覆蓋的話,呼叫

的仍然是Object類中的方法,而Object中的equal方法返回的卻是==

的判斷,因此,如果在沒有進行該方法的覆蓋後,呼叫該方法是沒有

任何意義的。

==:是用來判斷兩個物件的地址是否相同,即是否是指相同一個物件。比較的

是真正意義上的指標操作。

1、宣告格式

public boolean equals(Object obj)

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

比如以下兩個物件animal1和animal2,引用不同的物件,因此用==或equals()方法比較的結果為false;而animal1和animal3變數引用同一個DOg物件,因此用= =或者equals()方法比較的結果為true.

Animal animal1=new Dog();

Animal animal2=new Cat();

Animal animal3=animal1;

則animal1==animal2 (FALSE)

animal1.equals(animal2) (false)

animal1==animal3 (true)

animal1.equals(animal3) (true)

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

java.io.file,java.util.Date,java.lang.string,包裝類(Integer,Double等)

比如

Integer int1=new Integer(1);

Integer int2=new Integer(1);

String str1=new String("hello");

String str2=new String("hello");

int1==int2 輸出:false,因為不同物件

int1.equals(int2) 輸出:TRUE

str1==str2 (false)

str1.equals(str2) (true)

當然,可以自定義覆蓋object類的equals()方法,重新定義比較規則。比如,下面Person類的equals()比較規則為:只要兩個物件都是Person類,並且他們的屬性name都相同,則比較結果為true,否則返回false

public class Person{

private String name;

public Person(String name)

{

this.name=name;

}

public boolean equals(Object o)

{

if (this==0) return true;

if (!o instanceof Person) return false;

final Person other=(Person)o;

if (this.name().equals(other.name()))

return true;

else

return false;

}

}

注意,在重寫equals方法時,要注意滿足離散數學上的特性

1、自反性 :對任意引用值X,x.equals(x)的返回值一定為true.

2 對稱性: 對於任何引用值x,y,當且僅當y.equals(x)返回值為true時,x.equals(y)的返回值一定為true;

3 傳遞性:如果x.equals(y)=true, y.equals(z)=true,則x.equals(z)=true

4 一致性:如果參與比較的物件沒任何改變,則物件比較的結果也不應該有任何改變

5 非空性:任何非空的引用值X,x.equals(null)的返回值一定為false