From 526a90835d4e24b8367e41a9673b430b668858be Mon Sep 17 00:00:00 2001 From: sjsdfg <736777445@qq.com> Date: Wed, 10 Oct 2018 11:20:46 +0800 Subject: [PATCH] =?UTF-8?q?11.=20=E9=87=8D=E5=86=99=20equals=20=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E6=97=B6=E5=90=8C=E6=97=B6=E4=B9=9F=E8=A6=81=E9=87=8D?= =?UTF-8?q?=E5=86=99=20hashcode=20=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...噸鍐檈quals鏂规硶鏃跺悓鏃朵篃瑕侀噸鍐檋ashcode鏂规硶.md | 126 ++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 11. 閲嶅啓equals鏂规硶鏃跺悓鏃朵篃瑕侀噸鍐檋ashcode鏂规硶.md diff --git a/11. 閲嶅啓equals鏂规硶鏃跺悓鏃朵篃瑕侀噸鍐檋ashcode鏂规硶.md b/11. 閲嶅啓equals鏂规硶鏃跺悓鏃朵篃瑕侀噸鍐檋ashcode鏂规硶.md new file mode 100644 index 0000000..b306ab0 --- /dev/null +++ b/11. 閲嶅啓equals鏂规硶鏃跺悓鏃朵篃瑕侀噸鍐檋ashcode鏂规硶.md @@ -0,0 +1,126 @@ +# 11. 閲嶅啓 equals 鏂规硶鏃跺悓鏃朵篃瑕侀噸鍐 hashcode 鏂规硶 + +**鍦ㄦ瘡涓被涓紝鍦ㄩ噸鍐 equals 鏂规硶鐨勬椂渚紝涓瀹氳閲嶅啓 hashcode 鏂规硶銆**濡傛灉涓嶈繖鏍峰仛锛屼綘鐨勭被杩濆弽浜 hashCode 鐨勯氱敤绾﹀畾锛岃繖浼氶樆姝㈠畠鍦 HashMap 鍜 HashSet 杩欐牱鐨勯泦鍚堜腑姝e父宸ヤ綔銆傛牴鎹 Object 瑙勮寖锛屼互涓嬫椂鍏蜂綋绾﹀畾銆 + + 1. 褰撳湪涓涓簲鐢ㄧ▼搴忔墽琛岃繃绋嬩腑锛屽鏋滃湪 equals 鏂规硶姣旇緝涓病鏈変慨鏀逛换浣曚俊鎭紝鍦ㄤ竴涓璞′笂閲嶅璋冪敤 hashCode 鏂规硶鏃讹紝瀹冨繀椤诲缁堣繑鍥炵浉鍚岀殑鍊笺備粠涓涓簲鐢ㄧ▼搴忓埌鍙︿竴涓簲鐢ㄧ▼搴忕殑姣忎竴娆℃墽琛岃繑鍥炵殑鍊煎彲浠ユ槸涓嶄竴鑷寸殑銆 + 2. 濡傛灉涓や釜瀵硅薄鏍规嵁 equals(Object) 鏂规硶姣旇緝鏄浉绛夌殑锛岄偅涔堝湪涓や釜瀵硅薄涓婅皟鐢 hashCode 灏卞繀椤讳骇鐢熺殑缁撴灉鏄浉鍚岀殑鏁存暟銆 + 3. 濡傛灉涓や釜瀵硅薄鏍规嵁 equals(Object) 鏂规硶姣旇緝骞朵笉鐩哥瓑锛屽垯涓嶈姹傚湪姣忎釜瀵硅薄涓婅皟鐢 hashCode 閮藉繀椤讳骇鐢熶笉鍚岀殑缁撴灉銆 浣嗘槸锛岀▼搴忓憳搴旇鎰忚瘑鍒帮紝涓轰笉鐩哥瓑鐨勫璞$敓鎴愪笉鍚岀殑缁撴灉鍙兘浼氭彁楂樻暎鍒楄〃锛坔ash tables锛夌殑鎬ц兘銆 + +**褰撴棤娉曢噸鍐 hashCode 鏃讹紝鎵杩濆弽绗簩涓叧閿潯娆炬槸锛氱浉绛夌殑瀵硅薄蹇呴』鍏锋湁鐩哥瓑鐨勫搱甯岀爜锛 hash codes锛夈**鏍规嵁绫荤殑 equals 鏂规硶锛屼袱涓笉鍚岀殑瀹炰緥鍙兘鍦ㄩ昏緫涓婃槸鐩稿悓鐨勶紝浣嗘槸瀵逛簬 Object 绫荤殑 hashCode 鏂规硶锛屽畠浠彧鏄袱涓病鏈変粈涔堝叡鍚屼箣澶勭殑瀵硅薄銆傚洜姝わ紝 Object 绫荤殑 hashCode 鏂规硶杩斿洖涓や釜鐪嬩技闅忔満鐨勬暟瀛楋紝鑰屼笉鏄寜绾﹀畾瑕佹眰鐨勪袱涓浉绛夌殑鏁板瓧銆 + +涓句緥璇存槑锛屽亣璁句綘浣跨敤鏉$洰 10 涓殑 `PhoneNumber` 绫荤殑瀹炰緥鍋氫负 HashMap 鐨勯敭锛坘ey锛夛細 + +```Java +Map m = new HashMap<>(); + +m.put(new PhoneNumber(707, 867, 5309), "Jenny"); +``` + +浣犲彲鑳芥湡鏈 `m.get(new PhoneNumber(707, 867, 5309))` 鏂规硶杩斿洖 `Jenny` 瀛楃涓诧紝浣嗗疄闄呬笂锛岃繑鍥炰簡 null銆傛敞鎰忥紝杩欓噷娑夊強鍒颁袱涓 `PhoneNumber` 瀹炰緥锛氫竴涓疄渚嬫彃鍏ュ埌 HashMap 涓紝鍙︿竴涓綔涓哄垽鏂浉绛夌殑瀹炰緥鐢ㄦ潵妫绱€俙PhoneNumber` 绫绘病鏈夐噸鍐 hashCode 鏂规硶瀵艰嚧涓や釜鐩哥瓑鐨勫疄渚嬭繑鍥炰簡涓嶅悓鐨勫搱甯岀爜锛岃繚鍙嶄簡 hashCode 绾﹀畾銆俻ut 鏂规硶鎶 `PhoneNumber` 瀹炰緥淇濆瓨鍦ㄤ簡涓涓搱甯屾《锛 hash bucket锛変腑锛屼絾 get 鏂规硶鍗存槸浠庝笉鍚岀殑鍝堝笇妗朵腑鍘绘煡鎵撅紝鍗充娇鎭板ソ涓や釜瀹炰緥鏀惧湪鍚屼竴涓搱甯屾《涓紝get 鏂规硶鍑犱箮鑲畾涔熶細杩斿洖 null銆傚洜涓 HashMap 鍋氫簡浼樺寲锛岀紦瀛樹簡涓庢瘡涓椤癸紙entry锛夌浉鍏崇殑鍝堝笇鐮侊紝濡傛灉鍝堝笇鐮佷笉鍖归厤锛屽垯涓嶄細妫鏌ュ璞℃槸鍚︾浉绛変簡銆 + +瑙e喅杩欎釜闂寰堢畝鍗曪紝鍙渶瑕佷负 `PhoneNumber` 绫婚噸鍐欎竴涓悎閫傜殑 hashCode 鏂规硶銆俬ashCode 鏂规硶鏄粈涔堟牱鐨勶紵鍐欎竴涓笉瑙勮寖鐨勬柟娉曠殑鏄緢绠鍗曠殑銆備互涓嬬ず渚嬶紝铏界劧姘歌繙鏄悎娉曠殑锛屼絾缁濆涓嶈兘杩欐牱浣跨敤锛 + + +```Java +// The worst possible legal hashCode implementation - never use! + +@Override public int hashCode() { return 42; } +``` + +杩欐槸鍚堟硶鐨勶紝鍥犱负瀹冪‘淇濅簡鐩哥瓑鐨勫璞″叿鏈夌浉鍚岀殑鍝堝笇鐮併傝繖寰堢碂绯曪紝鍥犱负瀹冪‘淇濅簡姣忎釜瀵硅薄閮芥湁鐩稿悓鐨勫搱甯岀爜銆傚洜姝わ紝姣忎釜瀵硅薄鍝堝笇鍒板悓涓涓《涓紝鍝堝笇琛ㄩ鍖栦负閾捐〃銆傚簲璇ュ湪绾挎ф椂闂村唴杩愯鐨勭▼搴忥紝杩愯鏃堕棿鍙樻垚浜嗗钩鏂圭骇鍒傚浜庢暟鎹緢澶х殑鍝堝笇琛ㄨ岃█锛屼細褰卞搷鍒拌兘澶熸甯稿伐浣溿 + +涓涓ソ鐨 hash 鏂规硶瓒嬪悜浜庝负涓嶇浉绛夌殑瀹炰緥鐢熸垚涓嶇浉绛夌殑鍝堝笇鐮併傝繖涔熸鏄 hashCode 绾﹀畾涓涓夋潯鐨勮〃杈俱傜悊鎯虫儏鍐典笅锛宧ash 鏂规硶涓洪泦鍚堜腑涓嶇浉绛夌殑瀹炰緥鍧囧寑鍦板垎閰 int 鑼冨洿鍐呯殑鍝堝笇鐮併傚疄鐜拌繖绉嶇悊鎯虫儏鍐靛彲鑳芥槸鍥伴毦鐨勩 骞歌繍鐨勬槸锛岃鑾峰緱涓涓悎鐞嗙殑杩戜技鐨勬柟寮忓苟涓嶉毦銆 浠ヤ笅鏄竴涓畝鍗曠殑閰嶆柟锛 + + 1. 澹版槑涓涓 int 绫诲瀷鐨勫彉閲 result锛屽苟灏嗗叾鍒濆鍖栦负瀵硅薄涓涓涓噸瑕佸睘鎬 `c` 鐨勫搱甯岀爜锛屽涓嬮潰姝ラ 2.a 涓墍璁$畻鐨勯偅鏍枫傦紙鍥為【鏉$洰 10锛岄噸瑕佺殑灞炴ф槸褰卞搷姣旇緝鐩哥瓑鐨勯鍩熴傦級 + 2. 瀵逛簬瀵硅薄涓墿浣欑殑閲嶈灞炴 `f`锛岃鎵ц浠ヤ笅鎿嶄綔锛 + a. 姣旇緝灞炴 `f` 涓庡睘鎬 `c` 鐨 int 绫诲瀷鐨勫搱甯岀爜锛 +     -- i. 濡傛灉杩欎釜灞炴ф槸鍩烘湰绫诲瀷鐨勶紝浣跨敤 `Type.hashCode(f)` 鏂规硶璁$畻锛屽叾涓 `Type` 绫绘槸瀵瑰簲灞炴 `f` 鍩烘湰绫诲瀷鐨勫寘瑁呯被銆 +     -- ii. 濡傛灉璇ュ睘鎬ф槸涓涓璞″紩鐢紝骞朵笖璇ョ被鐨 equals 鏂规硶閫氳繃閫掑綊璋冪敤 equals 鏉ユ瘮杈冭灞炴э紝骞堕掑綊鍦拌皟鐢 hashCode 鏂规硶銆 濡傛灉闇瑕佹洿澶嶆潅鐨勬瘮杈冿紝鍒欒绠楁瀛楁鐨勨滆寖寮忥紙鈥渃anonical representation锛夆濓紝骞跺湪鑼冨紡涓婅皟鐢 hashCode銆 濡傛灉璇ュ瓧娈电殑鍊间负绌猴紝鍒欎娇鐢 0锛堜篃鍙互浣跨敤鍏朵粬甯告暟锛屼絾閫氬父鏉ヤ娇鐢 0 琛ㄧず锛夈 +      -- iii. 濡傛灉灞炴 `f` 鏄竴涓暟缁勶紝鎶婂畠鐪嬩綔姣忎釜閲嶈鐨勫厓绱犻兘鏄竴涓嫭绔嬬殑灞炴с 涔熷氨鏄锛岄氳繃閫掑綊鍦板簲鐢ㄨ繖浜涜鍒欒绠楁瘡涓噸瑕佸厓绱犵殑鍝堝笇鐮侊紝骞朵笖灏嗘瘡涓楠 2.b 鐨勫煎悎骞躲 濡傛灉鏁扮粍娌℃湁閲嶈鐨勫厓绱狅紝鍒欎娇鐢ㄤ竴涓父閲忥紝鏈濂戒笉瑕佷负 0銆傚鏋滄墍鏈夊厓绱犻兘寰堥噸瑕侊紝鍒欎娇鐢 `Arrays.hashCode` 鏂规硶銆 + + b. 灏嗘楠 2.a 涓睘鎬 c 璁$畻鍑虹殑鍝堝笇鐮佸悎骞朵负濡備笅缁撴灉锛歚result = 31 * result + c;` + + 3. 杩斿洖 result 鍊笺 + +褰撲綘鍐欏畬 hashCode 鏂规硶鍚庯紝闂嚜宸辨槸鍚︾浉绛夌殑瀹炰緥鏈夌浉鍚岀殑鍝堝笇鐮併 缂栧啓鍗曞厓娴嬭瘯鏉ラ獙璇佷綘鐨勭洿瑙夛紙闄ら潪浣犱娇鐢 AutoValue 妗嗘灦鏉ョ敓鎴愪綘鐨 equals 鍜 hashCode 鏂规硶锛屽湪杩欑鎯呭喌涓嬶紝浣犲彲浠ユ斁蹇冨湴蹇界暐杩欎簺娴嬭瘯锛夈 濡傛灉鐩稿悓鐨勫疄渚嬫湁涓嶇浉绛夌殑鍝堝笇鐮侊紝鎵惧嚭鍘熷洜骞惰В鍐抽棶棰樸 + +鍙互浠庡搱甯岀爜璁$畻涓帓闄ゆ淳鐢熷睘鎬э紙derived fields锛夈傛崲鍙ヨ瘽璇达紝濡傛灉涓涓睘鎬х殑鍊煎彲浠ユ牴鎹弬涓庤绠楃殑鍏朵粬灞炴у艰绠楀嚭鏉ワ紝閭d箞鍙互蹇界暐杩欐牱鐨勫睘鎬с傛偍蹇呴』鎺掗櫎鍦 equals 姣旇緝涓病鏈変娇鐢ㄧ殑浠讳綍灞炴э紝鍚﹀垯鍙兘浼氳繚鍙 hashCode 绾﹀畾鐨勭浜屾潯銆 + +姝ラ 2.b 涓殑涔樻硶璁$畻缁撴灉鍙栧喅浜庡睘鎬х殑椤哄簭锛屽鏋滅被涓叿鏈夊涓浉浼煎睘鎬э紝鍒欎骇鐢熸洿濂界殑鏁e垪鍑芥暟銆 渚嬪锛屽鏋滀箻娉曡绠椾粠涓涓 String 鏁e垪鍑芥暟涓鐪佺暐锛屽垯鎵鏈夌殑瀛楃灏嗗叿鏈夌浉鍚岀殑鏁e垪鐮併 涔嬫墍浠ラ夋嫨 31锛屽洜涓哄畠鏄竴涓鏁扮殑绱犳暟銆 濡傛灉瀹冩槸鍋舵暟锛屽苟涓斾箻娉曟孩鍑猴紝淇℃伅灏嗕細涓㈠け锛屽洜涓轰箻浠 2 鐩稿綋浜庣Щ浣嶃 浣跨敤绱犳暟鐨勫ソ澶勪笉澶槑鏄撅紝浣嗕範鎯笂閮芥槸杩欎箞鍋氱殑銆 31 鐨勪竴涓緢濂界殑鐗规э紝鏄湪涓浜涗綋绯荤粨鏋勪腑涔樻硶鍙互琚浛鎹负绉讳綅鍜屽噺娉曚互鑾峰緱鏇村ソ鐨勬ц兘锛歚31 * i ==锛坕 << 5锛 - i`銆 鐜颁唬 JVM 鍙互鑷姩杩涜杩欑浼樺寲銆 + +璁╂垜浠妸涓婅堪鍔炴硶搴旂敤鍒 `PhoneNumber` 绫讳腑锛 + +```Java +// Typical hashCode method + +@Override +public int hashCode() { + + int result = Short.hashCode(areaCode); + + result = 31 * result + Short.hashCode(prefix); + + result = 31 * result + Short.hashCode(lineNum); + + return result; + +} +``` + +鍥犱负杩欎釜鏂规硶杩斿洖涓涓畝鍗曠殑纭畾鎬ц绠楃殑缁撴灉锛屽畠鐨勫敮涓鐨勮緭鍏ユ槸 `PhoneNumber` 瀹炰緥涓殑涓変釜閲嶈鐨勫睘鎬э紝鎵浠ユ樉鐒剁浉绛夌殑 `PhoneNumber` 瀹炰緥鍏锋湁鐩稿悓鐨勫搱甯岀爜銆 瀹為檯涓婏紝杩欎釜鏂规硶鏄 `PhoneNumber` 鐨勪竴涓潪甯稿ソ鐨 hashCode 瀹炵幇锛屼笌 Java 骞冲彴绫诲簱涓殑瀹炵幇涓鏍枫 瀹冨緢绠鍗曪紝閫熷害鐩稿綋蹇紝骞朵笖鍚堢悊鍦板皢涓嶇浉鍚岀殑鐢佃瘽鍙风爜鍒嗘暎鍒颁笉鍚岀殑鍝堝笇妗朵腑銆 + +铏界劧鍦ㄨ繖涓」鐩殑鏂规硶浜х敓鐩稿綋濂界殑鍝堝笇鍑芥暟锛屼絾骞朵笉鏄渶鍏堣繘鐨勩 瀹冧滑鐨勮川閲忎笌 Java 骞冲彴绫诲簱鐨勫肩被鍨嬩腑鎵惧埌鐨勫搱甯屽嚱鏁扮浉褰擄紝瀵逛簬澶у鏁扮敤閫旀潵璇撮兘鏄冻澶熺殑銆 濡傛灉鐪熺殑闇瑕佸搱甯屽嚱鏁拌屼笉澶彲鑳戒骇鐢熺鎾烇紝璇峰弬闃 Guava 妗嗘灦鐨勭殑[com.google.common.hash.Hashing][1] [Guava] 鏂规硶銆 + +`Objects` 绫绘湁涓涓潤鎬佹柟娉曪紝瀹冩帴鍙椾换鎰忔暟閲忕殑瀵硅薄骞朵负瀹冧滑杩斿洖涓涓搱甯岀爜銆 杩欎釜鍚嶄负 hash 鐨勬柟娉曞彲浠ヨ浣犵紪鍐欎竴琛 hashCode 鏂规硶锛屽叾璐ㄩ噺涓庢牴鎹繖涓」鐩腑鐨勪笂闈㈢紪鍐欑殑鏂规硶鐩稿綋銆 涓嶅垢鐨勬槸锛屽畠浠殑杩愯閫熷害鏇存參锛屽洜涓哄畠浠渶瑕佸垱寤烘暟缁勪互浼犻掑彲鍙樻暟閲忕殑鍙傛暟锛屼互鍙婂鏋滀换浣曞弬鏁版槸鍩烘湰绫诲瀷锛屽垯杩涜瑁呯鍜屽彇娑堣绠便 杩欑鍝堝笇鍑芥暟鐨勯鏍煎缓璁粎鍦ㄦц兘涓嶉噸瑕佺殑鎯呭喌涓嬩娇鐢ㄣ 浠ヤ笅鏄娇鐢ㄨ繖绉嶆妧鏈紪鍐欑殑 `PhoneNumber` 鐨勫搱甯屽嚱鏁帮細 + + +```Java +// One-line hashCode method - mediocre performance + +@Override +public int hashCode() { + + return Objects.hash(lineNum, prefix, areaCode); + +} +``` + +濡傛灉涓涓被鏄笉鍙彉鐨勶紝骞朵笖璁$畻鍝堝笇鐮佺殑浠d环寰堝ぇ锛岄偅涔堝彲浠ヨ冭檻鍦ㄥ璞′腑缂撳瓨鍝堝笇鐮侊紝鑰屼笉鏄湪姣忔璇锋眰鏃堕噸鏂拌绠楀搱甯岀爜銆 濡傛灉浣犺涓鸿繖绉嶇被鍨嬬殑澶у鏁板璞″皢琚敤浣滃搱甯岄敭锛岄偅涔堝簲璇ュ湪鍒涘缓瀹炰緥鏃惰绠楀搱甯岀爜銆 鍚﹀垯锛屽彲浠ラ夋嫨鍦ㄩ娆¤皟鐢 hashCode 鏃跺欢杩熷垵濮嬪寲锛坙azily initialize锛夊搱甯岀爜銆 闇瑕佹敞鎰忕‘淇濈被鍦ㄥ瓨鍦ㄥ欢杩熷垵濮嬪寲灞炴х殑鎯呭喌涓嬩繚鎸佺嚎绋嬪畨鍏紙椤圭洰 83锛夈 `PhoneNumber` 绫讳笉閫傚悎杩欑鎯呭喌锛屼絾鍙槸涓轰簡灞曠ず瀹冩槸濡備綍瀹屾垚鐨勩 璇锋敞鎰忥紝灞炴 hashCode 鐨勫垵濮嬪硷紙鍦ㄦ湰渚嬩腑涓 0锛変笉搴旇鏄氬父鍒涘缓鐨勫疄渚嬬殑鍝堝笇鐮侊細 + +```Java +// hashCode method with lazily initialized cached hash code + +private int hashCode; // Automatically initialized to 0 + +@Override public int hashCode() { + + int result = hashCode; + + if (result == 0) { + + result = Short.hashCode(areaCode); + + result = 31 * result + Short.hashCode(prefix); + + result = 31 * result + Short.hashCode(lineNum); + + hashCode = result; + + } + + return result; + +} +``` + +**涓嶈璇曞浘浠庡搱甯岀爜璁$畻涓帓闄ら噸瑕佺殑灞炴ф潵鎻愰珮鎬ц兘銆** 鐢辨浜х敓鐨勫搱甯屽嚱鏁板彲鑳借繍琛屽緱鏇村揩锛屼絾鍏惰川閲忚緝宸彲鑳戒細闄嶄綆鍝堝笇琛ㄧ殑鎬ц兘锛屼娇鍏舵棤娉曚娇鐢ㄣ 鍏蜂綋鏉ヨ锛屽搱甯屽嚱鏁板彲鑳戒細閬囧埌澶ч噺涓嶅悓鐨勫疄渚嬶紝杩欎簺瀹炰緥涓昏鍦ㄤ綘蹇界暐鐨勫尯鍩熶腑鏈夋墍涓嶅悓銆 濡傛灉鍙戠敓杩欑鎯呭喌锛屽搱甯屽嚱鏁板皢鎶婃墍鏈夎繖浜涘疄渚嬫槧灏勫埌灏戣鍝堝笇鐮佷笂锛岃屽簲璇ヤ互绾挎ф椂闂磋繍琛岀殑绋嬪簭灏嗕細杩愯骞虫柟绾х殑鏃堕棿銆 + +杩欎笉浠呬粎鏄竴涓悊璁洪棶棰樸 鍦 Java 2 涔嬪墠锛孲tring 绫诲搱甯屽嚱鏁板湪鏁翠釜瀛楃涓蹭腑鏈澶氫娇鐢 16 涓瓧绗︼紝浠庣涓涓瓧绗﹀紑濮嬶紝鍦ㄦ暣涓瓧绗︿覆涓潎鍖鍦伴夊彇銆 瀵逛簬澶ч噺鐨勫甫鏈夊眰娆″悕绉扮殑闆嗗悎锛堝 URL锛夛紝姝ゅ姛鑳芥濂芥樉绀轰簡鍓嶉潰鎻忚堪鐨勭梾鎬佽涓恒 + +**涓嶈涓 hashCode 杩斿洖鐨勫兼彁渚涜缁嗙殑瑙勮寖锛屽洜姝ゅ鎴风涓嶈兘鍚堢悊鍦颁緷璧栧畠锛 浣犲彲浠ユ敼鍙樺畠鐨勭伒娲绘с** Java 绫诲簱涓殑璁稿绫伙紙渚嬪 String 鍜 Integer锛夐兘灏 hashCode 鏂规硶杩斿洖鐨勭‘鍒囧兼寚瀹氫负瀹炰緥鍊肩殑鍑芥暟銆 杩欎笉鏄竴涓ソ涓绘剰锛岃屾槸涓涓垜浠笉寰椾笉蹇嶅彈鐨勯敊璇細瀹冨Θ纰嶄簡鍦ㄦ湭鏉ョ増鏈腑鏀硅繘鍝堝笇鍑芥暟鐨勮兘鍔涖 濡傛灉鏈寚瀹氱粏鑺傚苟鍦ㄦ暎鍒楀嚱鏁颁腑鍙戠幇缂洪櫡锛屾垨鑰呭彂鐜颁簡鏇村ソ鐨勫搱甯屽嚱鏁帮紝鍒欏彲浠ュ湪鍚庣画鐗堟湰涓鍏惰繘琛屾洿鏀广 + +鎬讳箣锛屾瘡娆¢噸鍐 equals 鏂规硶鏃堕兘蹇呴』閲嶅啓 hashCode 鏂规硶锛屽惁鍒欑▼搴忓皢鏃犳硶姝e父杩愯銆備綘鐨 hashCode 鏂规硶蹇呴』閬典粠 Object 绫绘寚瀹氱殑甯歌绾﹀畾锛屽苟涓斿繀椤绘墽琛屽悎鐞嗙殑宸ヤ綔锛屽皢涓嶇浉绛夌殑鍝堝笇鐮佸垎閰嶇粰涓嶇浉绛夌殑瀹炰緥銆傚鏋滀娇鐢ㄧ 51 椤电殑閰嶆柟锛岃繖寰堝鏄撳疄鐜般傚鏉$洰 10 鎵杩帮紝AutoValue 妗嗘灦涓烘墜鍔ㄧ紪鍐 equals 鍜 hashCode 鏂规硶鎻愪緵浜嗕竴涓緢濂界殑閫夋嫨锛孖DE 涔熸彁渚涗簡涓浜涜繖鏍风殑鍔熻兘銆 + + + + [1]: http://com.google.common.hash.hashing/ \ No newline at end of file