主要有以下幾個(gè)方面需要注意:
1.重寫(xiě)equals()和hashCode()
當(dāng)真正需要了解兩個(gè)引用是否完全相同時(shí),使用==。但是,當(dāng)需要了解對(duì)象本身是否相等時(shí),使用equals()。實(shí)際上是要比較兩個(gè)不同對(duì)象的內(nèi)容在意義上是否等價(jià),除了String類(lèi)和封裝器類(lèi)(已重寫(xiě)了equals()),需要重寫(xiě)equals().Object內(nèi)的equals()的方法只使用==運(yùn)算符進(jìn)行比較,因此,除非重寫(xiě)equals(),否則只有當(dāng)兩個(gè)引用引用相同的對(duì)象時(shí),這兩個(gè)對(duì)象才被看做是相等的。另外,如果要使類(lèi)對(duì)象能夠用作散列表的鍵(或者任何數(shù)據(jù)結(jié)構(gòu)中用于搜索和/或檢索對(duì)象的元素),則必須重寫(xiě)equals(),使兩個(gè)不同實(shí)例能夠被看做是相同的。
我們一般這樣重寫(xiě):
public boolean equals(Object o) {
if(o instanceof Moof) && ((Moof)o).getMoofValue() == this.moofValue)) {
return true;
} else {
return false;
}
}
上面執(zhí)行了兩個(gè)操作:
1)確保所測(cè)試對(duì)象的類(lèi)型是正確的!用instanceof
2)比較我們關(guān)心的屬性
注意: equals()、hashCode()和toString()方法都是公有的。下面這種重寫(xiě)是無(wú)效的,
class Foo {
boolean equals(Object o) { }
}
一定還要注意參數(shù)類(lèi)型。下面方法是對(duì)equals()方法的重載,而不是重寫(xiě)。
class Foo {
public boolean equals(Foo b) { }
}
一定要非常熟悉重寫(xiě)規(guī)則,要能夠識(shí)別類(lèi)中對(duì)Object方法的重寫(xiě)、重載還是非法重新聲明。在Foo類(lèi)中,equals()方法把參數(shù)從Object修改為Foo,因此,它是一個(gè)重載方法,除非從你自己的代碼(它知道這個(gè)新的不同方法,而且碰巧被命名為equals)中調(diào)用,否則,它不會(huì)被調(diào)用。
java API中,在equals()方法內(nèi)定義了一種約定。java約定是一套應(yīng)該遵守的規(guī)則,或者說(shuō)是想提供其他人所期望的“正確”設(shè)計(jì)時(shí)必須要遵守的內(nèi)容。有5點(diǎn):
1.自反性: x.equals(x)應(yīng)該返回true;
2.對(duì)稱性:當(dāng)且僅當(dāng)y.equals(x)返回true時(shí),x.equals(y)才返回true。
3.可傳遞性
4.一致性
5.任何非空引用值x,x.equals(null)應(yīng)該返回false.
如果使用equals()方法,兩個(gè)對(duì)象被認(rèn)為是相等的,則它們必須具有相同的散列碼值。因?yàn)镺bject類(lèi)的默認(rèn)散列碼總是為每個(gè)對(duì)象產(chǎn)生一個(gè)唯一號(hào),即使重寫(xiě)的equals()方法認(rèn)為兩個(gè)或多個(gè)對(duì)象是相等的,也是這樣。所以,為了安全起見(jiàn),如果重寫(xiě)equals(),一定也要重寫(xiě)
hashCode().
1.重寫(xiě)equals()和hashCode()
當(dāng)真正需要了解兩個(gè)引用是否完全相同時(shí),使用==。但是,當(dāng)需要了解對(duì)象本身是否相等時(shí),使用equals()。實(shí)際上是要比較兩個(gè)不同對(duì)象的內(nèi)容在意義上是否等價(jià),除了String類(lèi)和封裝器類(lèi)(已重寫(xiě)了equals()),需要重寫(xiě)equals().Object內(nèi)的equals()的方法只使用==運(yùn)算符進(jìn)行比較,因此,除非重寫(xiě)equals(),否則只有當(dāng)兩個(gè)引用引用相同的對(duì)象時(shí),這兩個(gè)對(duì)象才被看做是相等的。另外,如果要使類(lèi)對(duì)象能夠用作散列表的鍵(或者任何數(shù)據(jù)結(jié)構(gòu)中用于搜索和/或檢索對(duì)象的元素),則必須重寫(xiě)equals(),使兩個(gè)不同實(shí)例能夠被看做是相同的。
我們一般這樣重寫(xiě):
public boolean equals(Object o) {
if(o instanceof Moof) && ((Moof)o).getMoofValue() == this.moofValue)) {
return true;
} else {
return false;
}
}
上面執(zhí)行了兩個(gè)操作:
1)確保所測(cè)試對(duì)象的類(lèi)型是正確的!用instanceof
2)比較我們關(guān)心的屬性
注意: equals()、hashCode()和toString()方法都是公有的。下面這種重寫(xiě)是無(wú)效的,
class Foo {
boolean equals(Object o) { }
}
一定還要注意參數(shù)類(lèi)型。下面方法是對(duì)equals()方法的重載,而不是重寫(xiě)。
class Foo {
public boolean equals(Foo b) { }
}
一定要非常熟悉重寫(xiě)規(guī)則,要能夠識(shí)別類(lèi)中對(duì)Object方法的重寫(xiě)、重載還是非法重新聲明。在Foo類(lèi)中,equals()方法把參數(shù)從Object修改為Foo,因此,它是一個(gè)重載方法,除非從你自己的代碼(它知道這個(gè)新的不同方法,而且碰巧被命名為equals)中調(diào)用,否則,它不會(huì)被調(diào)用。
java API中,在equals()方法內(nèi)定義了一種約定。java約定是一套應(yīng)該遵守的規(guī)則,或者說(shuō)是想提供其他人所期望的“正確”設(shè)計(jì)時(shí)必須要遵守的內(nèi)容。有5點(diǎn):
1.自反性: x.equals(x)應(yīng)該返回true;
2.對(duì)稱性:當(dāng)且僅當(dāng)y.equals(x)返回true時(shí),x.equals(y)才返回true。
3.可傳遞性
4.一致性
5.任何非空引用值x,x.equals(null)應(yīng)該返回false.
如果使用equals()方法,兩個(gè)對(duì)象被認(rèn)為是相等的,則它們必須具有相同的散列碼值。因?yàn)镺bject類(lèi)的默認(rèn)散列碼總是為每個(gè)對(duì)象產(chǎn)生一個(gè)唯一號(hào),即使重寫(xiě)的equals()方法認(rèn)為兩個(gè)或多個(gè)對(duì)象是相等的,也是這樣。所以,為了安全起見(jiàn),如果重寫(xiě)equals(),一定也要重寫(xiě)
hashCode().