Java中equals()方法實(shí)例詳解_第1頁(yè)
Java中equals()方法實(shí)例詳解_第2頁(yè)
Java中equals()方法實(shí)例詳解_第3頁(yè)
Java中equals()方法實(shí)例詳解_第4頁(yè)
Java中equals()方法實(shí)例詳解_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第Java中equals()方法實(shí)例詳解目錄equals()在哪里Java中重寫的equals()在Java中比較的推薦方法為什么要在我們自己的類中重寫equals()重寫equals()的規(guī)范重寫equals()可能的誤區(qū)一般的equals()寫法附:java中equals()方法的正確使用總結(jié)

equals()在哪里

首先我們知道Java中Object類是所有類的父類,它里面定義了equals()方法:

publicbooleanequals(Objectobj){

return(this==obj);

}

可以看到是使用==來(lái)進(jìn)行比較的,那么==是什么意思呢?其實(shí)是比較兩個(gè)對(duì)象的的內(nèi)存地址。(這里順便提一下,可以去了解一下Java的堆棧。)

=》若object1.equals(object2)為true,則表示equals1和equals2實(shí)際上是引用同一個(gè)對(duì)象。

Java中重寫的equals()

這里我們看一下java的一些自帶的包裝類怎么重寫equals()的:

String.java

publicbooleanequals(ObjectanObject){

if(this==anObject){

returntrue;

if(anObjectinstanceofString){

StringanotherString=(String)anObject;

intn=value.length;

if(n==anotherString.value.length){

charv1[]=value;

charv2[]=anotherString.value;

inti=0;

while(n--!=0){

if(v1[i]!=v2[i])

returnfalse;

i++;

returntrue;

returnfalse;

我們可以非常清晰的看到String的equals()方法是進(jìn)行內(nèi)容比較,而不是單純的引用比較。

Integer.java

publicbooleanequals(Objectobj){

if(objinstanceofInteger){

returnvalue==((Integer)obj).intValue();

returnfalse;

其他的就不一一舉例了。

在Java中比較的推薦方法

所以我們一般比較基本數(shù)據(jù)類型的時(shí)候,使用"==",例如inti=0;if(i==1){…},比較兩個(gè)Integer包裝類類型的時(shí)候就可以使用equals(),因?yàn)镴ava已經(jīng)重寫了equals()方法了。另外給出幾點(diǎn)建議,在java中進(jìn)行比較,我們需要根據(jù)比較的類型來(lái)選擇合適的比較方式:

對(duì)象域,使用equals方法。

類型安全的枚舉,使用equals或==。

可能為null的對(duì)象域:使用==null和equals。

數(shù)組域:使用Arrays.equals。

除float和double外的原始數(shù)據(jù)類型(int,byte等):使用==。

float類型:使用Float.foatToIntBits轉(zhuǎn)換成int類型,然后使用==。

double類型:使用Double.doubleToLongBit轉(zhuǎn)換成long類型,然后使用==。

其中6,7參考java中的對(duì)應(yīng)的包裝類實(shí)現(xiàn):

publicbooleanequals(Objectobj){

return(objinstanceofFloat)

(floatToIntBits(((Float)obj).value)==floatToIntBits(value));

為什么要在我們自己的類中重寫equals()

但是有時(shí)候我們不滿足于使用基本數(shù)據(jù)類型和Java實(shí)現(xiàn)的一些繼承自O(shè)bject的哪些類,比如我們實(shí)現(xiàn)一個(gè)Person類,它是繼承自O(shè)bject類的,所以它的equals()方法默認(rèn)使用的是文章開頭提到的哪個(gè)equals()方法,當(dāng)我們使用equals()進(jìn)行比較的時(shí)候,比較內(nèi)存地址,那么有可能出現(xiàn)兩個(gè)Person對(duì)象的參數(shù)都相同(比如年齡,身份證號(hào)等,在我們的實(shí)際認(rèn)知中認(rèn)為這兩個(gè)人就是一個(gè)人,應(yīng)該返回true),但是由于他們的內(nèi)存地址是不一樣的,所以equals()方法會(huì)返回false。

那么我們就需要去重寫equals()方法。

重寫equals()的規(guī)范

需要注意的是,在Java規(guī)范中,它對(duì)equals()方法的使用必須要遵循如下幾個(gè)規(guī)則:

自反性:對(duì)于任何非空引用值x,x.equals(x)都應(yīng)返回true。

對(duì)稱性:對(duì)于任何非空引用值x和y,當(dāng)且僅當(dāng)y.equals(x)返回true時(shí),x.equals(y)才應(yīng)返回true。

傳遞性:對(duì)于任何非空引用值x、y和z,如果x.equals(y)返回true,并且y.equals(z)返回true,那么x.equals(z)應(yīng)返回true。

一致性:對(duì)于任何非空引用值x和y,多次調(diào)用x.equals(y)始終返回true或始終返回4、一致性:對(duì)于任何非空引用值x和y,多次調(diào)用x.equals(y)始終返回true或始終返回false,前提是對(duì)象上equals比較中所用的信息沒(méi)有被修改

對(duì)于任何非空引用值x,x.equals(null)都應(yīng)返回false。

重寫equals()可能的誤區(qū)

查看下述代碼:

publicclassTestEquals{

publicstaticvoidmain(String[]args){

Employeeemployee=newEmployee("mily",1);

Employeeemployee2=newEmployee("mily",2);

Personp1=newPerson("mily");

System.out.println(p1.equals(employee));

System.out.println(p1.equals(employee2));

System.out.println(employee.equals(employee2));

classPerson{

privateStringname;

publicStringgetName(){

returnname;

publicvoidsetName(Stringname){

=name;

publicPerson(Stringname){

=name;

@Override

publicbooleanequals(Objectobj){

if(objinstanceofPerson){

Personperson=(Person)obj;

if(person.getName()==null|name==null){

returnfalse;

}else{

returnname.equalsIgnoreCase(person.getName());

returnfalse;

classEmployeeextendsPerson{

privateintid;

publicintgetId(){

returnid;

publicvoidsetId(intid){

this.id=id;

publicEmployee(Stringname,intid){

super(name);

this.id=id;

@Override

publicbooleanequals(Objectobj){

if(objinstanceofEmployee){

Employeeemployee=(Employee)obj;

returnsuper.equals(obj)employee.getId()==id;

returnfalse;

輸出:

true

true

false

上述代碼中,我定義了一個(gè)Person類,有一個(gè)屬性name;還定義了一個(gè)Employee類,它是Person的子類,多出一個(gè)id的屬性;在測(cè)試代碼中“new”出了三個(gè)對(duì)象:

name為mily,id為1的一個(gè)職員——employee

name為mily,id為2的職員——employee2

name為mily的一個(gè)普通人——p1

在大家的認(rèn)知下,應(yīng)該是三者都不是“equal”的,但是在執(zhí)行p1.equals(employee)時(shí)返回的是true,仔細(xì)看了代碼之后你就會(huì)發(fā)現(xiàn)問(wèn)題所在,代碼把employee當(dāng)成一個(gè)Person對(duì)象去執(zhí)行equals方法了,比較了name發(fā)現(xiàn)一樣,就認(rèn)為是“equal”了,這是一種很常見的誤區(qū)。

一般的equals()寫法

下面給出一個(gè)完美的equals方法的建議:

1、顯示參數(shù)命名為otherObject,稍后會(huì)將它轉(zhuǎn)換成另一個(gè)叫做other的變量。

2、判斷比較的兩個(gè)對(duì)象引用是否相等,如果引用相等那么表示是同一個(gè)對(duì)象,那么當(dāng)然相等

3、如果otherObject為null,直接返回false,表示不相等

4、比較this和otherObject是否是同一個(gè)類:如果equals的語(yǔ)義在每個(gè)子類中有所改變,就使用getClass檢測(cè);如果所有的子類都有統(tǒng)一的定義,那么使用instanceof檢測(cè)

5、將otherObject轉(zhuǎn)換成對(duì)應(yīng)的類類型變量

6、最后對(duì)對(duì)象的屬性進(jìn)行比較。使用==比較基本類型,使用equals比較對(duì)象。如果都相等則返回true,否則返回false。注意如果是在子類中定義equals,則要包含super.equals(other)

按照上述的equals()規(guī)范,我的實(shí)現(xiàn)如下:

publicclassTestEquals2{

publicstaticvoidmain(String[]args){

Employeeemployee=newEmployee("mily",1);

Employeeemployee2=newEmployee("mily",1);

Personp1=newPerson("mily");

System.out.println(p1.equals(employee));

System.out.println(p1.equals(employee2));

System.out.println(employee.equals(employee2));

Employeeemployee3=newEmployee(null,1);

Employeeemployee4=newEmployee(null,1);

Personp2=newPerson(null);

System.out.println(p2.equals(employee3));

System.out.println(p2.equals(employee4));

System.out.println(employee3.equals(employee4));

classPerson{

privateStringname;

publicStringgetName(){

returnname;

publicvoidsetName(Stringname){

=name;

publicPerson(Stringname){

=name;

@Override

publicbooleanequals(Objectobj){

if(this==obj){

returntrue;

if(obj==null||getClass()!=obj.getClass()){

returnfalse;

Personperson=(Person)obj;

if(person.getName()==null|name==null){

returnfalse;

}else{

returnname.equalsIgnoreCase(person.getName());

classEmployeeextendsPerson{

privateintid;

publicintgetId(){

returnid;

publicvoidsetId(intid){

this.id=id;

publicEmployee(Stringname,intid){

super(name);

this.id=id;

@Override

publicbooleanequals(Objectobj){

if(this==obj){

returntrue;

if(o

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論