为什么在重写了equals方法之后也必须重写hashcode方法 为什么在重写了equals方法之后也必须重写hashcode...

\u4e3a\u4ec0\u4e48\u5728\u91cd\u5199\u4e86equals()\u65b9\u6cd5\u4e4b\u540e\u4e5f\u5fc5\u987b\u91cd\u5199hashCode()\u65b9\u6cd5

\u6211\u4eec\u90fd\u77e5\u9053Java\u8bed\u8a00\u662f\u5b8c\u5168\u9762\u5411\u5bf9\u8c61\u7684\uff0c\u5728java\u4e2d\uff0c\u6240\u6709\u7684\u5bf9\u8c61\u90fd\u662f\u7ee7\u627f\u4e8eObject\u7c7b\u3002
Ojbect\u7c7b\u4e2d\u6709\u4e24\u4e2a\u65b9\u6cd5equals\u3001hashCode\uff0c\u8fd9\u4e24\u4e2a\u65b9\u6cd5\u90fd\u662f\u7528\u6765\u6bd4\u8f83\u4e24\u4e2a\u5bf9\u8c61\u662f\u5426\u76f8\u7b49\u7684\u3002
\u5728\u672a\u91cd\u5199equals\u65b9\u6cd5\u6211\u4eec\u662f\u7ee7\u627f\u4e86object\u7684equals\u65b9\u6cd5\uff0c
\u90a3\u91cc\u7684 equals\u662f\u6bd4\u8f83\u4e24\u4e2a\u5bf9\u8c61\u7684\u5185\u5b58\u5730\u5740
\uff0c\u663e\u7136\u6211\u4eecnew\u4e862\u4e2a\u5bf9\u8c61\u5185\u5b58\u5730\u5740\u80af\u5b9a\u4e0d\u4e00\u6837
\u5bf9\u4e8e\u503c\u5bf9\u8c61\uff0c==\u6bd4\u8f83\u7684\u662f\u4e24\u4e2a\u5bf9\u8c61\u7684\u503c
\u5bf9\u4e8e\u5f15\u7528\u5bf9\u8c61\uff0c\u6bd4\u8f83\u7684\u662f\u4e24\u4e2a\u5bf9\u8c61\u7684\u5730\u5740
\u9ed8\u8ba4\u7684equals\u65b9\u6cd5\u540c==\uff0c\u4e00\u822c\u6765\u8bf4\u6211\u4eec\u7684\u5bf9\u8c61\u90fd\u662f\u5f15\u7528\u5bf9\u8c61\uff0c\u8981\u91cd\u5199equals\u65b9\u6cd5\u3002
\u73b0\u5728\u6709\u4e00\u4e2a\u5b66\u751f\u5bf9\u8c61\uff0c\u6709\u5c5e\u6027\u5b66\u53f7\u8ddf\u59d3\u540d\uff0c\u73b0\u5728\u6211\u65b0\u5efa\u4e86\u4e00\u4e2a\u5b66\u751f\u5bf9\u8c61\uff0c\u53c8\u4ece\u6570\u636e\u91cc\u67e5\u51fa\u4e00\u4e2a\u5b66\u751f\u5bf9\u8c61\uff0c\u8fd9\u4e24\u4e2a\u5bf9\u8c61\u7684\u5b66\u53f7\u8ddf\u59d3\u540d\u90fd\u4e00\u6837\uff0c\u90a3\u8fd9\u4e24\u4e2a\u5bf9\u8c61\u662f\u4e0d\u662f\u76f8\u7b49\u5462\uff1f\u4e00\u822c\u60c5\u51b5\u4e0b\uff0c\u9664\u975e\u4f60\u6709\u7279\u6b8a\u9700\u6c42\u8981\u5904\u7406\uff0c\u8fd9\u4e24\u4e2a\u5bf9\u8c61\u662f\u76f8\u7b49\u7684\uff0c\u53ef\u5982\u679c\u7528==\u53bb\u6bd4\u8f83\uff0c\u8fd4\u56de\u7684\u7ed3\u679c\u662f\u9519\u8bef\u7684\u3002
\u8fd9\u65f6\u5019\u6211\u4eec\u5c31\u5fc5\u987b\u91cd\u5199equlas\u65b9\u6cd5\u4e86\u3002
\u5982\u679c\u5b66\u53f7\u662f\u4e3b\u952e\uff0c\u5728equals\u65b9\u6cd5\u91cc\uff0c\u6211\u4eec\u8ba4\u4e3a\u53ea\u8981\u5b66\u53f7\u76f8\u540c\uff0c\u5c31\u53ef\u4ee5\u8fd4\u56detrue\u3002
hashCode\u65b9\u6cd5\u4e5f\u662f\u53ef\u4ee5\u7528\u6765\u6bd4\u8f83\u4e24\u4e2a\u5bf9\u8c61\u662f\u5426\u76f8\u7b49\u7684\u3002\u4f46\u662f\u6211\u4eec\u5f88\u5c11\u4f7f\u7528\uff0c\u5e94\u8be5\u8bf4\u662f\u5f88\u5c11\u76f4\u63a5\u4f7f\u7528\u3002
hashCode\u65b9\u6cd5\u8fd4\u56de\u7684\u662f\u4e00\u4e2aint\u503c\uff0c\u53ef\u4ee5\u770b\u505a\u662f\u4e00\u4e2a\u5bf9\u8c61\u7684\u552f\u4e00\u7f16\u7801\uff0c\u5982\u679c\u4e24\u4e2a\u5bf9\u8c61\u7684hashCode\u503c\u76f8\u540c\uff0c\u6211\u4eec\u5e94\u8be5\u8ba4\u4e3a\u8fd9\u4e24\u4e2a\u5bf9\u8c61\u662f\u540c\u4e00\u4e2a\u5bf9\u8c61\u3002
02\u4e00\u822c\u5982\u679c\u4f7f\u7528java\u4e2d\u7684Map\u5bf9\u8c61\u8fdb\u884c\u5b58\u50a8\u65f6\uff0c\u4ed6\u4f1a\u81ea\u52a8\u8c03\u7528hashCode\u65b9\u6cd5\u6765\u6bd4\u8f83\u4e24\u4e2a\u5bf9\u8c61\u662f\u5426\u76f8\u7b49\u3002
\u6240\u4ee5\u5982\u679c\u6211\u4eec\u5bf9equals\u65b9\u6cd5\u8fdb\u884c\u4e86\u91cd\u5199\uff0c\u5efa\u8bae\u4e00\u5b9a\u8981\u5bf9hashCode\u65b9\u6cd5\u91cd\u5199\uff0c\u4ee5\u4fdd\u8bc1\u76f8\u540c\u7684\u5bf9\u8c61\u8fd4\u56de\u76f8\u540c\u7684hash\u503c\uff0c\u4e0d\u540c\u7684\u5bf9\u8c61\u8fd4\u56de\u4e0d\u540c\u7684hash\u503c\u3002
\u5982\u4e0a\u9762\u7684\u5b66\u751f\u4f8b\u5b50\uff0c\u5982\u679c\u5b66\u53f7\u76f8\u540c\uff0c\u4e0d\u7ba1\u59d3\u540d\u76f8\u4e0d\u76f8\u540c\uff0c\u8fd4\u56de\u7684hash\u503c\u4e00\u5b9a\u8981\u662f\u4e00\u6837\u7684\uff0c\u8fd9\u65f6\u6211\u4eec\u7684hash\u503c\u53ea\u4e0e\u5b66\u53f7\u6709\u5173\u3002
public class Test{public static void main(String[] args){HashMap hm = new HashMap();
hm.put(new key(1),new value(2));
if(hm.containsKey(new key(1)))
System.out.println(hm.get(new key(1)));elseSystem.out.println("dont have such a key");}}02\u4f60\u6bcf\u6b21new \u4e00\u4e2a\u65b0\u5bf9\u8c61\u51fa\u6765hashcode\u80af\u5b9a\u4e0d\u4e00\u6837\uff0c\u6240\u4ee5\u4f60\u62ff\u4e0d\u5230\u4f60\u8981\u7684key\u3002
class key{int i ;public key(int i){this.i = i;}@Overridepublic boolean equals(Object obj){if(obj instanceof key){if(((key)obj).i == i)
return true;}return false;}@Overridepublic int hashCode(){return i;}}021\u3001\u91cd\u5199equals\u65b9\u6cd5\u65f6\u9700\u8981\u91cd\u5199hashCode\u65b9\u6cd5\uff0c\u4e3b\u8981\u662f\u9488\u5bf9Map\u3001Set\u7b49\u96c6\u5408\u7c7b\u578b\u7684\u4f7f\u7528\uff1b
a: Map\u3001Set\u7b49\u96c6\u5408\u7c7b\u578b\u5b58\u653e\u7684\u5bf9\u8c61\u5fc5\u987b\u662f\u552f\u4e00\u7684\uff1b
b: \u96c6\u5408\u7c7b\u5224\u65ad\u4e24\u4e2a\u5bf9\u8c61\u662f\u5426\u76f8\u7b49\uff0c\u662f\u5148\u5224\u65adequals\u662f\u5426\u76f8\u7b49\uff0c\u5982\u679cequals\u8fd4\u56deTRUE\uff0c\u8fd8\u8981\u518d\u5224\u65adHashCode\u8fd4\u56de\u503c\u662f\u5426ture,\u53ea\u6709\u4e24\u8005\u90fd\u8fd4\u56deture,\u624d\u8ba4\u4e3a\u8be5\u4e24\u4e2a\u5bf9\u8c61\u662f\u76f8\u7b49\u7684\u3002

hashCode\u65b9\u6cd5\u4e5f\u662f\u53ef\u4ee5\u7528\u6765\u6bd4\u8f83\u4e24\u4e2a\u5bf9\u8c61\u662f\u5426\u76f8\u7b49\u7684\u3002\u4f46\u662f\u6211\u4eec\u5f88\u5c11\u4f7f\u7528\uff0c\u5e94\u8be5\u8bf4\u662f\u5f88\u5c11\u76f4\u63a5\u4f7f\u7528\u3002hashCode\u65b9\u6cd5\u8fd4\u56de\u7684\u662f\u4e00\u4e2aint\u503c\uff0c\u53ef\u4ee5\u770b\u505a\u662f\u4e00\u4e2a\u5bf9\u8c61\u7684\u552f\u4e00\u7f16\u7801\uff0c\u5982\u679c\u4e24\u4e2a\u5bf9\u8c61\u7684hashCode\u503c\u76f8\u540c\uff0c\u6211\u4eec\u5e94\u8be5\u8ba4\u4e3a\u8fd9\u4e24\u4e2a\u5bf9\u8c61\u662f\u540c\u4e00\u4e2a\u5bf9\u8c61\u3002\u4e00\u822c\u5982\u679c\u4f7f\u7528java\u4e2d\u7684Map\u5bf9\u8c61\u8fdb\u884c\u5b58\u50a8\u65f6\uff0c\u4ed6\u4f1a\u81ea\u52a8\u8c03\u7528hashCode\u65b9\u6cd5\u6765\u6bd4\u8f83\u4e24\u4e2a\u5bf9\u8c61\u662f\u5426\u76f8\u7b49\u3002\u6240\u4ee5\u5982\u679c\u6211\u4eec\u5bf9equals\u65b9\u6cd5\u8fdb\u884c\u4e86\u91cd\u5199\uff0c\u5efa\u8bae\u4e00\u5b9a\u8981\u5bf9hashCode\u65b9\u6cd5\u91cd\u5199\uff0c\u4ee5\u4fdd\u8bc1\u76f8\u540c\u7684\u5bf9\u8c61\u8fd4\u56de\u76f8\u540c\u7684hash\u503c\uff0c\u4e0d\u540c\u7684\u5bf9\u8c61\u8fd4\u56de\u4e0d\u540c\u7684hash\u503c\u3002\u5982\u4e0a\u9762\u7684\u5b66\u751f\u4f8b\u5b50\uff0c\u5982\u679c\u5b66\u53f7\u76f8\u540c\uff0c\u4e0d\u7ba1\u59d3\u540d\u76f8\u4e0d\u76f8\u540c\uff0c\u8fd4\u56de\u7684hash\u503c\u4e00\u5b9a\u8981\u662f\u4e00\u6837\u7684\uff0c\u8fd9\u65f6\u6211\u4eec\u7684hash\u503c\u53ea\u4e0e\u5b66\u53f7\u6709\u5173\u3002

默认的equals方法同==,一般来说我们的对象都是引用对象,要重写equals方法。
现在有一个学生对象,有属性学号跟姓名,现在我新建了一个学生对象,又从数据里查出一个学生对象,这两个对象的学号跟姓名都一样,那这两个对象是不是相等呢?一般情况下,除非你有特殊需求要处理,这两个对象是相等的,可如果用==去比较,返回的结果是错误的。
这时候我们就必须重写equlas方法了。如果学号是主键,在equals方法里,我们认为只要学号相同,就可以返回true。
hashCode方法也是可以用来比较两个对象是否相等的。但是我们很少使用,应该说是很少直接使用。hashCode方法返回的是一个int值,可以看做是一个对象的唯一编码,如果两个对象的hashCode值相同,我们应该认为这两个对象是同一个对象。

一般如果使用java中的Map对象进行存储时,他会自动调用hashCode方法来比较两个对象是否相等。
所以如果我们对equals方法进行了重写,建议一定要对hashCode方法重写,以保证相同的对象返回相同的hash值,不同的对象返回不同的hash值。

  • JAVA涓equals鐨勫畾涔,鐢ㄦ硶,鏂规硶閲嶅啓鏄庝箞鍥炰簨
    绛旓細濡傛灉鎴戠悊瑙f病閿欑殑璇濅綘璇寸殑搴旇鏄渶鍒濆嚭鐜板湪Object绫婚噷鐨equals鏂规硶鍚с傚湪杩欓噷鎴戣涓涓嬫垜瀵硅繖涓柟娉曠殑鐞嗚В锛屼粎渚涘弬鑰冦傝繖涓嚱鏁扮殑鐢ㄦ硶鏄細姣旇緝[璋冪敤杩欎釜鏂规硶鐨勫璞鍜孾鏂规硶浼犻掕繘鍘荤殑鍙傛暟瀵硅薄]鏄惁鐩哥瓑銆閲嶅啓杩欎釜鏂规硶锛屾剰鎬濇槸璁╀綘瀹氫箟涓や釜瀵硅薄濡備綍鎵嶇畻鏄浉绛夈傝繖鏍风粰浜嗕綘鏋佸ぇ鐨勭伒娲绘с傚洜涓烘瘮杈冧袱涓璞...
  • 閲嶅啓hashcode 涓轰粈涔闇瑕閲嶅啓equals
    绛旓細鎴戠殑鐞嗚В鍝堬紝涓嶅悓鐨刱ey鏈夊彲鑳芥槸涓鏍风殑code锛屾墍浠ラ渶瑕佸啀鐢╡quals鏉ュ鐞唄ash鍐茬獊锛屽叾瀹炲彧瑕佹嬁涓猠quals涔熻锛屼絾鏄晥鐜囦細闄嶄綆 鍦╨ist瀵硅薄涓篃瀛樺湪鍚屾牱鐨勯棶棰橈紝涔熼渶瑕閲嶅啓equals鏂规硶 杩欎簺閮芥槸鎴戠殑鑰佸笀鍛婅瘔鎴戠殑锛屽叾瀹炴垜鍦ㄧ敤arraylist鐨勬椂鍊欏瓨鍌ㄧ殑姣旇緝绠鍗曪紝浣嗘槸鑰佸笀璁╂垜鍔犱竴浜涢檮鍔犱俊鎭紝涓嶉噸鍐欑殑璇濓紝姣旇緝鐨勬槸鍐呭瓨...
  • string绫閲嶅啓equal鏂规硶浜嗗悧
    绛旓細鍥炴槸锛孞ava涓殑String绫閲嶅啓浜唀quals鏂规硶銆傚湪Java涓紝姣忎竴涓璞¢兘缁ф壙鑷狾bject绫伙紝Object绫讳腑鎻愪緵浜嗕竴涓粯璁ょ殑equals鏂规硶銆傝繖涓粯璁ゆ柟娉曚娇鐢ㄢ==鈥濇瘮杈冧袱涓璞$殑寮曠敤锛屼篃灏辨槸璇达紝褰撲笖浠呭綋涓や釜寮曠敤鎸囧悜鍚屼竴涓璞℃椂锛岃繑鍥瀟rue銆傜劧鑰岋紝瀵逛簬璁稿绫绘潵璇达紝杩欑姣旇緝鏂瑰紡骞朵笉鍚堥傘備緥濡傦紝瀵逛簬String绫伙紝鎴戜滑鏇...
  • java涓殑equals()鏂规硶
    绛旓細浜屻equals()鏂规硶鐨閲嶅啓涓庡簲鐢</ 褰撹皥鍒拌嚜瀹氫箟绫荤殑equals()鏂规硶锛屽User绫伙紝濡傛灉娌℃湁鐗瑰埆閲嶅啓锛岄偅涔堥粯璁ょ殑equals()浼氫笌Object鐨勫簳灞傚疄鐜颁竴鑷达紝鍗虫瘮杈冨璞$殑鍐呭瓨鍦板潃銆備絾濡傛灉鎴戜滑甯屾湜姣旇緝瀵硅薄鐨勫睘鎬у硷紝閭d箞灏遍渶瑕佹樉寮忓湴瑕嗙洊鐖剁被鐨別quals()鏂规硶銆傚湪User绫讳腑锛屽main鏂规硶鎵绀猴紝鍗充娇涓や釜瀵硅薄灞炴т竴鑷达紝鐢变簬...
  • java鏂板缓绫讳腑涓轰粈涔瑕閲嶅啓equals,toString,hashCode鏂规硶?鍐欎粬浠湁浠涔...
    绛旓細涓嶄竴瀹氳閲嶅啓锛屾湁鑷繁鐨勯渶瑕佹墠閲嶅啓銆涓轰粈涔堥噸鍐鍏堝紕鏄庣櫧瀹冧滑鐨勭敤閫旓紝equals鏄负浜嗘瘮杈冩槸鍚︾浉绛夈傛瘮濡備綘鏈変袱涓猆ser锛岀幇鍦ㄦ煇涓蒋浠剁殑瑕佹眰鏄彧瑕佸畠浠琲d灞炴х浉鍚屽氨鏄浉绛夌殑锛岄偅灏卞彲浠ラ噸鍐檈qauls锛屽彧瀵筰d杩涜瀵规瘮銆倀oString鏄负浜嗚浣犳洿瀹规槗鐪嬫噦涓涓璞★紝褰撳璞″湪鎺у埗鍙版墦鍗板嚭鏉ユ椂浣犳兂鐪嬪埌涓鍫嗘棤鎰忎箟鐨勪唬鐮佸悧锛
  • ...閬搄ava鐨閲嶅啓equals鍜岄噸鍐檋ashcode鏂规硶鍐呴儴鏄浠涔鎰忔濆憖?
    绛旓細3.equals()鐨勯噸鍐欒鍒欏墠闈㈡垜浠凡缁忕煡閬撳浣曞幓閲嶅啓equals鏂规硶鏉ュ疄鐜版垜浠嚜宸辩殑闇姹備簡,浣嗘槸鎴戜滑鍦ㄩ噸鍐檈quals鏂规硶鏃,杩樻槸闇瑕佹敞鎰忓涓嬪嚑鐐硅鍒欑殑銆傝嚜鍙嶆с傚浜庝换浣曢潪null鐨勫紩鐢ㄥ紉,x.equals(x)搴旇繑鍥瀟rue銆傚绉版с傚浜庝换浣曢潪null鐨勫紩鐢ㄥ紉涓巠,褰撲笖浠呭綋:y.equals(x)杩斿洖true鏃,x.equals(y)鎵嶈繑鍥瀟rue銆備紶閫掓с
  • 涓轰粈涔堥噸鍐檈quals鏃跺繀椤婚噸鍐檋ashCode鏂规硶
    绛旓細equals()鏂规硶鍒欐槸鍦℉ashMap涓彃鍏ュ兼垨鏌ヨ鏃朵細浣跨敤鍒般傚綋HashMap涓彃鍏ュ兼垨鏌ヨ鍊煎搴旂殑鏁e垪鐮佷笌鏁扮粍涓殑鏁e垪鐮佺浉绛夋椂锛屽垯浼氶氳繃equals鏂规硶姣旇緝key鍊兼槸鍚︾浉绛夛紝鎵浠ユ兂浠ヨ嚜寤哄璞′綔涓篐ashMap鐨刱ey锛屽繀椤閲嶅啓璇ュ璞$户鎵縪bject鐨刪ashCode鍜宔quals鏂规硶銆 2.鏈潵涓嶅氨鏈塰ashcode()鍜宔quals()浜嗕箞锛熷共鍢涜閲嶅啓锛岀洿...
  • 涓轰粈涔堥噸鍐檈quals()鏃朵篃瑕侀噸鍐檋ashCode()?涓よ呬粈涔堝叧绯
    绛旓細娌℃湁纭ц瀹氳蹇呴』涓や釜涓璧烽噸鍐 杩欏彧鏄竴涓粡楠屼箣璋堬紝寤鸿杩欎箞鍋 鍥犱负杩欎袱涓嚱鏁伴兘鍙互閲嶅啓 鎵浠ユ湁鍐欏緱濂藉潖涔嬪垎 瀹屽叏鍙互hashcode鐩哥瓑鐨勫璞¤宔quals纭繑鍥瀎alse 姣斿涓涓鐢熺被鐨勪袱涓璞锛宐 瀹冧滑鐨勫睘鎬 濮撳悕 閮芥槸 寮犱笁 浣犲畬鍏ㄥ彲浠ヨ涓篴锛宐鏄浉绛夌殑 鎵浠鍦ㄩ噸鍐檈quals鐨勬椂鍊欏彲浠ュ啓鎴愬彧瑕佸璞$殑灞炴у...
  • equals()鏂规硶閲嶅啓
    绛旓細String鐨別quals()鏂规硶鐨閲嶅啓鏄啓鍦╦ava.lang.String閲岄潰鐨勶紝涓嶆槸鍦ㄨ繖閲岋紝杩欓噷鍙槸涓ず鎰忎緥瀛愶紝璁╀綘姣旇緝 == 鍜 equals鏂规硶鐨勪笉鍚 ===杩欐槸String涓噸鍐欏悗鐨別quals()鏂规硶 / Compares this string to the specified object. The result is {@code true} if and only if the argument is not {@co...
  • java涓閲嶅啓浜唀quals鏂规硶鍚,HashSet琛ㄤ腑鐨刢ontains鏂规硶涓轰粈涔杩斿洖鐨勮繕 ...
    绛旓細2涓湴鍧涓嶅悓锛宧ashCode涔熶笉鍚岋紝杩斿洖褰撶劧鏄痜alse銆傚姞涓妏ublic int hashCode(){ return this.value;} 涓鑸琱ashCode锛堬級鍜equals锛堬級閮芥槸鍚屾椂閲嶅啓鐨勶紝涓嶅緢濂界殑瑕嗙洊hashCode()鍜宔quals() 浼氶犳垚闆嗗悎绫诲伐浣滄晠闅!鑰孉rrayList鏄湁搴忓彲閲嶅瀛樺偍鐨勶紝2涓狥oo瀵硅薄鍙鍊肩浉鍚屽氨浼氳繑鍥瀟rue銆
  • 扩展阅读:oppo不小心进入恢复模式 ... equals重写需要注意什么 ... 什么时候重写equals方法 ... java怎么重写equals方法 ... oppo无限重启恢复模式 ... 面试 和equals的区别 ... equals方法和 的区别 ... equals方法使用与继承 ... java中正确重写equals方法 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网