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 因?yàn)橛胣ew創(chuàng)建了2個(gè)對(duì)象,所以是兩個(gè)不同的內(nèi)存地址
string3.equals(string4);//true 而String類的是不可改變的,所以會(huì)指向同一個(gè)內(nèi)存地址,所以返回為true
equals()是object的方法,所以只是適合對(duì)象,不適合于基本類型,equals()默認(rèn)是用"=="比較兩個(gè)對(duì)象的內(nèi)存地址,如果想要比較兩個(gè)對(duì)象的內(nèi)容,要重寫equals()方法才可...而==可以比較兩個(gè)基本類型,也可以是對(duì)象...
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;
}
總而言之:在類對(duì)象中 equals()方法比較的是對(duì)象的值,==比較的是對(duì)象.即為對(duì)象的引用(即為內(nèi)存地址)一些特殊情況下equals()是重寫了方法咯..
equal:是用來比較兩個(gè)對(duì)象內(nèi)部的內(nèi)容是否相等的,由于所有的類都是繼承
自java.lang.Object類的,所以如果沒有對(duì)該方法進(jìn)行覆蓋的話,調(diào)用
的仍然是Object類中的方法,而Object中的equal方法返回的卻是==
的判斷,因此,如果在沒有進(jìn)行該方法的覆蓋后,調(diào)用該方法是沒有
任何意義的。
==:是用來判斷兩個(gè)對(duì)象的地址是否相同,即是否是指相同一個(gè)對(duì)象。比較的
是真正意義上的指針操作。
1、聲明格式
public boolean equals(Object obj)
其比較規(guī)則為:當(dāng)參數(shù)obj引用的對(duì)象與當(dāng)前對(duì)象為同一個(gè)對(duì)象時(shí),就返回true,否則返回false.
比如以下兩個(gè)對(duì)象animal1和animal2,引用不同的對(duì)象,因此用==或equals()方法比較的結(jié)果為false;而animal1和animal3變量引用同一個(gè)DOg對(duì)象,因此用= =或者equals()方法比較的結(jié)果為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()方法,比較規(guī)則為:如果兩個(gè)對(duì)象的類型一致,并且內(nèi)容一致,則返回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,因?yàn)椴煌瑢?duì)象
int1.equals(int2) 輸出:TRUE
str1==str2 (false)
str1.equals(str2) (true)
當(dāng)然,可以自定義覆蓋object類的equals()方法,重新定義比較規(guī)則。比如,下面Person類的equals()比較規(guī)則為:只要兩個(gè)對(duì)象都是Person類,并且他們的屬性name都相同,則比較結(jié)果為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方法時(shí),要注意滿足離散數(shù)學(xué)上的特性
1、自反性 :對(duì)任意引用值X,x.equals(x)的返回值一定為true.
2 對(duì)稱性: 對(duì)于任何引用值x,y,當(dāng)且僅當(dāng)y.equals(x)返回值為true時(shí),x.equals(y)的返回值一定為true;
3 傳遞性:如果x.equals(y)=true, y.equals(z)=true,則x.equals(z)=true
4 一致性:如果參與比較的對(duì)象沒任何改變,則對(duì)象比較的結(jié)果也不應(yīng)該有任何改變
5 非空性:任何非空的引用值X,x.equals(null)的返回值一定為false
轉(zhuǎn)載于:https://www.cnblogs.com/air5/archive/2011/11/22/2258972.html
總結(jié)
以上是生活随笔為你收集整理的Java中关于==和equal的区别 以及equals()方法重写的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: watir添加新标签
- 下一篇: Drupal的高速缓存配置APC