




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 安全生產(chǎn)考核全景展示試題及答案
- 助力通過(guò)2025年一級(jí)建造師試題及答案
- 2025年入團(tuán)考試亮點(diǎn)與試題及答案
- 初級(jí)審計(jì)師道德規(guī)范應(yīng)掌握的試題及答案
- 二級(jí)消防工程師必看試題及答案剖析
- 初級(jí)審計(jì)的學(xué)習(xí)心得與知識(shí)應(yīng)用試題及答案
- 護(hù)理質(zhì)量管理與評(píng)估試題及答案
- 消防安全隱患治理對(duì)策與實(shí)施方案試題及答案
- ??谱o(hù)士在康復(fù)醫(yī)學(xué)中的安全實(shí)踐策略
- 醫(yī)療實(shí)踐與教學(xué)質(zhì)量提升的緊密結(jié)合
- 桌面推演應(yīng)急演練方案腳本
- 3.4沉淀溶解平衡及影響因素的探究課件高二上學(xué)期化學(xué)人教版選擇性必修1
- 總體取值規(guī)律的估計(jì)教學(xué)設(shè)計(jì) 高一下學(xué)期數(shù)學(xué)人教A版(2019)必修第二冊(cè)
- 城市軌道交通車輛制動(dòng)系統(tǒng)(高職)教學(xué)課件
- 公共基礎(chǔ)知識(shí)1000題題庫(kù)
- 生豬屠宰獸醫(yī)衛(wèi)生檢驗(yàn)人員理論考試題庫(kù)及答案
- 低空經(jīng)濟(jì)解決方案
- 2019年浙江省初中畢業(yè)升學(xué)考試說(shuō)明(科學(xué))
- ISO9001-ISO14001-ISO45001三體系內(nèi)部審核檢查表
- 熱力管網(wǎng)技術(shù)標(biāo)
- JT-T-1094-2016營(yíng)運(yùn)客車安全技術(shù)條件
評(píng)論
0/150
提交評(píng)論