| ¥N
¦Ò Áp ¨t |
|
Mail: |
| PassBiBle |
 |
PassBiBle.Com |
| Msn
: |
| PassBiBle |
 |
HotMail.Com |
| QQ
: 6411019 |
|
 |
| |
|
¦³®Ä©M¥¿ÚÌ©w¸qhashCode()©Mequals()
|
| |
¦³®Ä©M¥¿ÚÌ©w¸qhashCode()©Mequals()
¡@¡@ ¯Å§O¡G¤Jªù¯Å
¡@¡@ Brian Goetz (brian@quiotix.com) ¡@¡@ Quiotix Corpº®uÅU°Ý ¡@¡@ 2003 ¦~ 8 ¤ë
¡@¡@ ¨CÓJava¹ï¶H³£¦³hashCode()©M equals()¤èªk¡C³\¦hÃþ©¿²¤¡]Override)³o¨Ç¤èªkªº¯Ê¬Ù¹ê¬I,¥H¦b¹ï¶H¹ê¨Ò¤§¶¡´£¨Ñ§ó²`¼h¦¸ªº»y¸q¥i¤ñ©Ê¡C¦bJava²z©À©M¹ê½î³o¤@³¡¤À¡AJava¶}µo¤HûBrian Goetz¦V±z¤¶²Ð¦b³Ð«ØJavaÃþ¥H¦³®Ä©MãÚÌ©w¸qhashCode()©Mequals()®ÉÀ³¿í´`ªº³W«h©M«ü«n¡C±z¥i¥H¦b°Q½×½×¾ÂÉO§@ªÌ©M¨ä¥¦ÅªªÌ¤@¦P±´°Q±z¹ï¥»¤åªº¬Ýªk¡C(±zÁÙ¥i¥HÂIÀ»¥»¤å³»³¡©Î©³³¡ªº°Q½×¶i¤J½×¾Â¡C)
¡@¡@ ÁöµMJava»y¨¥¤£ª½±µ¤ä«ùÃöÁp¼Æ²Õ -- ¥i¥H¨Ï¥Î¥ô¦ó¹ï¶H§@¬°¤@Ó¯Á¤Þªº¼Æ²Õ -- ¦ý¦b®ÚObjectÃþ¤¤¨Ï¥ÎhashCode()¤èªk©úÚ̪í¥Ü´Á±æ¼sªx¨Ï¥ÎHashMap(¤Î¨ä«e½úHashtable)¡C²z·Q±¡ªp¤U°ò¤_´²¦Cªº®e¾¹´£¨Ñ¦³®Ä´¡¤J©M¦³®ÄÀ˯Á¡Fª½±µ¦b¹ï¶H¼Ò¦¡¤¤¤ä«ù´²¦C¥i¥H«P¶i°ò¤_´²¦Cªº®e¾¹ªº¶}µo©M¨Ï¥Î¡C
©w¸q¹ï¶Hªº¬Ûµ¥©Ê
¡@¡@ ObjectÃþ¦³¨âÏú¤èªk¨Ó±ÀÂ_¹ï¶Hªº¼ÐÃÑ¡Gequals()©MhashCode()
¡C¤@¯ë¨Ó»¡¡A¦pªG±z©¿²¤¤F¨ä¤¤¤@Ïú¡A±z¥²¶·¦P®É©¿²¤³o¨âÏú¡A¦]¬°¨âªÌ¤§¶¡¦³¥²¶·ºû«ùªº¦ÜÃö«nªºÃö¨t¡C¯S®í±¡ªp¬O®ÚÕuequals() ¤èªk¡A¦pªG¨âÓ¹ï¶H¬O¬Ûµ¥ªº¡A¥¦Ì¥²¶·¦³¬Û¦PªºhashCode()È(ºÉºÞ³o³q±`¤£¬O¯uªº)¡C
¡@¡@ ¯S©wÃþªºequals()ªº»y¸q¦bImplementerªº¥ª°¼©w¸q¡F©w¸q¹ï¯S©wÃþ¨Ó»¡equals()·N¨ýµÛ¤°¤\¬O¨ä³]p¤u§@ªº¤@³¡¤À¡CObject´£¨Ñªº¯Ê¬Ù¹ê¬I²³æ¤Þ¥Î¤U±µ¥¦¡¡G
¡@¡@ public boolean equals(Object obj) { return (this == obj); }
¡@¡@ ¦b³oÏú¯Ê¬Ù¹ê¬I±¡ªp¤U¡A¥u¦³¥¦Ì¤Þ¥Î¯u¥¿¦P¤@Ó¹ï¶H®É³o¨âӤޥΤ~¬O¬Ûµ¥ªº¡C¦P¼Ë¡AObject´£¨ÑªºhashCode()ªº¯Ê¬Ù¹ê¬I³q¹L±N¹ï¶Hªº¤º¦s¦a§}¹ï¬M¤_¤@Ó¾ã¼ÆÈ¨Ó¥Í¦¨¡C¥Ñ¤_¦b¬Y¨Ç¬[ÌÛ¤W¡A¦a§}ªÅ¶¡¤j¤_intȪºS³ò¡A¨âÓ¤£¦Pªº¹ï¶H¦³¬Û¦PªºhashCode()¬O¥i¯àªº¡C¦pªG±z©¿²¤¤FhashCode()¡A±z¤´ÂÂ¥i¥H¨Ï¥ÎSystem.identityHashCode()¤èªk¨Ó±µ¤J³oÃþ¯Ê¬ÙÈ¡C
©¿²¤ equals() -- ²³æ¹ê¨Ò
¡@¡@ ¯Ê¬Ù±¡ªp¤U¡Aequals()©MhashCode()°ò¤_¼ÐÃѪº¹ê¬I¬O¦X²zªº¡A¦ý¹ï¤_¬Y¨ÇÃþ¨Ó»¡¡A¥¦Ì§Æ±æ©ñ¼eµ¥¦¡ªº©w¸q¡C¨Ò¦p¡AIntegerÃþ©w¸qequals() ÉO¤U±Ãþ¦ü¡G
¡@¡@ public boolean equals(Object obj) { ¡@¡@
return (obj instanceof Integer ¡@¡@ && intValue() == ((Integer) obj).intValue()); ¡@¡@ }
¡@¡@ ¦b³oÓ©w¸q¤¤¡A¥u¦³¦b¥]§t¬Û¦Pªº¾ã¼ÆÈªº±¡ªp¤U³o¨âÓInteger¹ï¶H¬O¬Ûµ¥ªº¡Cµ²¦X±N¤£¥iק諸Integer¡A³o¨Ï±o¨Ï¥ÎInteger§@¬°HashMap¤¤ªºÃöÁä¦r¬O¤Á¹ê¥i¦æªº¡C³oÏú°ò¤_ȪºEqual¤èªk¥i¥H¥ÑJavaÃþ®w¤¤ªº©Ò¦³ì©l«Ê¸ËÃþ¨Ï¥Î¡A¦pInteger¡BFloat¡BCharacter©MBoolean¥H¤ÎString(¦pªG¨âÓString¹ï¶H¥]§t¬Û¦P¶¶§Çªº¦r²Å¡A¨º¥¦Ì¬O¬Ûµ¥ªº)¡C¥Ñ¤_³o¨ÇÃþ³£¬O¤£¥iק諸¦}¥B¥i¥H¹ê¬IhashCode()©Mequals()¡A¥¦Ì³£¥i¥H°µ¬°«Ü¦nªº´²¦CÃöÁä¦r¡C
¬°¤°¤\©¿²¤ equals()©MhashCode()?
¡@¡@ ¦pªGInteger¤£©¿²¤equals() ©M hashCode()±¡ªp¤S±N¦p¦ó?¦pªG§Ú̱q¥¼¦bHashMap©Î¨ä¥¦°ò¤_´²¦Cªº¶°¦X¤¤¨Ï¥ÎInteger§@¬°ÃöÁä¦rªº¸Ü¡A¤°¤\¤]¤£·|µo¥Í¡C¦ý¬O¡A¦pªG§Ú̦bHashMap¤¤¨Ï¥Î³oÃþInteger¹ï¶H§@¬°ÃöÁä¦r¡A§Ú̱N¤£¯à°÷¥i¾a¦aÀ˯Á¬ÛÃöªºÈ¡A°£«D§Ú̦bget()½Õ¥Î¤¤¨Ï¥ÎÉOput()½Õ¥Î¤¤Ìå¨äÃþ¦üªºInteger¹ê¨Ò¡C³on¨DÚÌ«O¦b§Ú̪º¾ãÓµ{§Ç¤¤¡A¥u¯à¨Ï¥Î¹ïÀ³¤_¯S©w¾ã¼ÆÈªºInteger¹ï¶Hªº¤@Ó¹ê¨Ò¡C¤£¥Î»¡¡A³oÏú¤èªkÌ夣¤è«K¦Ó¥B¿ù»~ÀWÀW¡C
¡@¡@ Objectªºinterface
contractn¨D¦pªG®ÚÕu equals()¨âÓ¹ï¶H¬O¬Ûµ¥ªº¡A¨º¤\¥¦Ì¥²¶·¦³¬Û¦PªºhashCode()È¡C·í¨äÃѧO¯à¤O¾ãÓ¥]§t¦bequals()¤¤®É¡A¬°¤°¤\§Ú̪º®Ú¹ï¶HÃþ»ÝnhashCode()¡HhashCode()¤èªk¯Âºé¥Î¤_´£°ª®Ä²v¡CJava¥¥x³]p¤Hû¹wp¨ì¤F¨å«¬JavaÀ³¥Îµ{§Ç¤¤°ò¤_´²¦Cªº¶°¦XÃþ¡]Collection Class)ªº«n©Ê--¦pHashtable¡BHashMap©MHashSet¡A¦}¥B¨Ï¥Îequals()ÉO³\¦h¹ï¶H¶i¦æ¤ñ¸û¦bpºâ¤è±«D±`©ù¶Q¡C¨Ï©Ò¦³Java¹ï¶H³£¯à°÷¤ä«ù hashCode()¦}µ²¦X¨Ï¥Î°ò¤_´²¦Cªº¶°¦X¡A¥i¥H¹ê²{¦³®Äªº¦sÀx©MÀ˯Á¡C
¹ê¬Iequals()©MhashCode()ªº»Ý¨D
¡@¡@ ¹ê¬Iequals()©M hashCode()¦³¤@¨Ç¨î¡AObject¤å¥ó¤¤¦CÁ|¥X¤F³o¨Ç¨î¡C¯S§O¬Oequals()¤èªk¥²¶·Åã¥Ü¥H¤UÄݩʡG
¡@¡@ Symmetry¡G¨âӤޥΡAa©M b,a.equals(b) if and only if b.equals(a) ¡@¡@ Reflexivity¡G©Ò¦³«DªÅ¤Þ¥Î¡A a.equals(a) ¡@¡@ Transitivity¡GIf a.equals(b) and b.equals(c), then a.equals(c) ¡@¡@ Consistency with hashCode()¡G¨âÓ¬Ûµ¥ªº¹ï¶H¥²¶·¦³¬Û¦PªºhashCode()È
¡@¡@ Objectªº³WS¤¤¦}¨S¦³©úÚÌn¨Dequals()©M hashCode() ¥²¶·¤@P -- ¥¦Ìªºµ²ªG¦bÀH¦Zªº½Õ¥Î¤¤±N¬O¬Û¦Pªº¡A°²³]¡§¤£§ïÅܹï¶H¬Ûµ¥
©Ê¤ñ¸û¤¤¨Ï¥Îªº¥ô¦ó«H®§¡C¡¨³o§v°_¨Ó¶H¡§pºâªºµ²ªG±N¤£§ïÅÜ¡A°£«D¹ê»Ú±¡ªp¦p¦¹¡C¡¨³o¤@¼Ò½kÁn©ú³q±`¸ÑÄÀ¬°¬Ûµ¥©Ê©M´²¦CÈpºâÀ³¬O¹ï¶Hªº¥iÚÌ©w©Ê¥\¯à¡A¦Ó¤£¬O¨ä¥¦¡C
¹ï¶H¬Ûµ¥©Ê·N¨ýµÛ¤°¤\¡H
¡@¡@ ¤H̫ܮe©öº¡¨¬ObjectÃþ³WS¹ïequals() ©M hashCode() ªºn¨D¡C¨M©w¬O§_©M¦p¦ó©¿²¤equals()°£¤F§PÂ_¥H¥~¡AÁÙn¨D¨ä¥¦¡C¦b²³æªº¤£¥i×ÈÃþ¤¤¡A¦pInteger(¨Æ¹ê¤W¬O¤L¥G©Ò¦³¤£¥iק諸Ãþ)¡A¿ï¾Ü¬Û·í©úÅã -- ¬Ûµ¥©ÊÀ³°ò¤_°ò¥»¹ï¶Hª¬ºAªº¬Ûµ¥©Ê¡C¦bInteger±¡ªp¤U¡A¹ï¶Hªº°ß¤@ª¬ºA¬O°ò¥»ªº¾ã¼ÆÈ¡C
¡@¡@ ¹ï¤_¥i×§ï¹ï¶H¨Ó»¡¡Aµª®×¦}¤£Á`¬O¦p¦¹²M·¡¡Cequals() ©MhashCode() ¬O§_À³°ò¤_¹ï¶Hªº¼ÐÃÑ(¶H¯Ê¬Ù¹ê¬I)©Î¹ï¶Hªºª¬ºA(¶HInteger©MString)¡H¨S¦³Â²³æªºµª®× -- ¥¦¨ú¨M¤_Ãþªºp¦E¨Ï¥Î¡C¹ï¤_¶HList©MMap³o¼Ëªº®e¾¹¨Ó»¡¡A¤H̹惡ª§½×¤£¤w¡CJavaÃþ®w¤¤ªº¤j¦h¼ÆÃþ¡A¥]¬A®e¾¹Ãþ¡A¿ù»~¥X²{¦b®ÚÕu¹ï¶Hª¬ºA¨Ó´£¨Ñequals()©MhashCode()¹ê¬I¡C
¡@¡@ ¦pªG¹ï¶HªºhashCode()È¥i¥H°ò¤_¨äª¬ºA¶i¦æ§ó§ï¡A¨º¤\·í¨Ï¥Î³oÃþ¹ï¶H§@¬°°ò¤_´²¦Cªº¶°¦X¤¤ªºÃöÁä¦r®É§ÚÌ¥²¶·ª`·N¡AÚÌ«O·í¥¦Ì¥Î¤_§@¬°´²¦CÃöÁä¦r®É¡A§Ú̦}¤£¤¹³\§ó§ï¥¦Ìªºª¬ºA¡C©Ò¦³°ò¤_´²¦Cªº¶°¦X°²³]¡A·í¹ï¶Hªº´²
¦CȥΤ_§@¬°¶°¦X¤¤ªºÃöÁä¦r®É¥¦¤£·|§ïÅÜ¡C¦pªG·íÃöÁä¦r¦b¶°¦X¤¤®É¥¦ªº´²¦C¥N½X³Q§ó§ï¡A¨º¤\±N²£¥Í¤@¨Ç¤£¥i¹w´ú©M®e©ö²V²cªºµ²ªG¡C¹ê½î¹Lµ{¤¤³o³q±`¤£¬O°ÝÃD -- §Ú̦}¤£¸g±`¨Ï¥Î¶HList³o¼Ëªº¥i×§ï¹ï¶H°µ¬°HashMap¤¤ªºÃöÁä¦r¡C
¡@¡@ ¤@Ó²³æªº¥i×§ïÃþªº¨Ò¤l¬OPoint¡A¥¦®ÚÕuª¬ºA¨Ó©w¸qequals()©MhashCode()¡C¦pªG¨âÓPoint ¹ï¶H¤Þ¥Î¬Û¦Pªº(x, y)®y¼Ð¡APointªº´²¦CȨӷ½¤_x©My®y¼ÐȪºIEEE 754-bitªí¥Ü¡A¨º¤\¥¦Ì¬O¬Ûµ¥ªº¡C
¡@¡@ ¹ï¤_¤ñ¸ûÎ`ÂøªºÃþ¨Ó»¡¡Aequals()©MhashCode()ªº¦æ¬°¥i¯à¬Æ¦Ü¨ü¨ìsuperclass©Îinterfaceªº¼vÅT¡C¨Ò¦p¡AList±µ¤fn¨D¦pªG¦}¥B¥u¦³¥t¤@Ó¹ï¶H¬OList¡A¦Ó¥B¥¦Ì¦³¬Û¦P¶¶§Çªº¬Û¦PªºElements(¥ÑElement¤WªºObject.equals() ©w¸q)¡AList¹ï¶Hµ¥¤_¥t¤@Ó¹ï¶H¡ChashCode()ªº»Ý¨D§ó¯S®í--listªºhashCode()È¥²¶·²Å¦X¥H¤Upºâ¡G
¡@¡@ hashCode = 1; ¡@¡@ Iterator i = list.iterator(); ¡@¡@ while (i.hasNext()) { ¡@¡@ Object obj = i.next(); ¡@¡@ hashCode = 31*hashCode + (obj==null ? 0 : obj.hashCode()); ¡@¡@ }
¡@¡@ ¤£¶È¶È´²¦CȨú¨M¤_listªº¤º®e¡A¦Ó¥BÁÙ³W©w¤Fµ²¦X¦UÓElementªº´²¦CȪº¯S®íºâªk¡C(StringÃþ³W©wÃþ¦ü
ªººâªk¥Î¤_pºâStringªº´²¦CÈ¡C)
½s¼g¦Û¤vªºequals()©MhashCode()¤èªk
¡@¡@ ©¿²¤¯Ê¬Ùªºequals()¤èªk¤ñ¸û²³æ¡A¦ý¦pªG¤£¹H¤Ï¹ïºÙ¡]Symmetry¡^©Î¶Ç»¼©Ê¡]Transitivity¡^»Ý¨D¡A©¿²¤¤w¸g©¿²¤ªºequals() ¤èªkÌå¨ä´Æ¤â¡C·í©¿²¤equals()®É¡A±zÀ³¸ÓÁ`¬O¦bequals()¤¤¥]¬A¤@¨ÇJavadocª`ÄÀ¡A¥HÀ°§U¨º¨Ç§Æ±æ¯à°÷¥¿ÚÌÂX®i±zªºÃþªº¥Î¤á¡C
¡@¡@ §@¬°¤@Ó²³æªº¨Ò¤l¡A¦Ò¼{¥H¤UÃþ¡G
¡@¡@ class A { ¡@¡@ final B someNonNullField; ¡@¡@ C someOtherField; ¡@¡@ int someNonStateField; ¡@¡@ }
¡@¡@ §ÚÌÀ³¦p¦ó½s¼g¸ÓÃþªºequals()ªº¤èªk¡H³oÏú¤èªkÓì¥Î¤_³\¦h±¡ªp¡G
¡@¡@ public boolean equals(Object other) { ¡@¡@ // Not strictly necessary, but often a good optimization ¡@¡@ if (this == other) ¡@¡@ return true; ¡@¡@ if (!(other instanceof A)) ¡@¡@ return false; ¡@¡@ A otherA = (A) other; ¡@¡@ return ¡@¡@ (someNonNullField.equals(otherA.someNonNullField)) ¡@¡@ && ((someOtherField == null) ¡@¡@ ? otherA.someOtherField == null ¡@¡@ : someOtherFie
ld.equals(otherA.someOtherField))); ¡@¡@ }
¡@¡@ ²{¦b§ÚÌ©w¸q¤Fequals()¡A§ÚÌ¥²¶·¥H²Î¤@ªº¤èªk¨Ó©w¸qhashCode()¡C¤@Ïú²Î¤@¦ý¦}¤£Á`¬O¦³®Äªº©w¸qhashCode()ªº¤èªk¦p¤U¡G
¡@¡@ public int hashCode() { return 0; }
¡@¡@ ³oÏú¤èªk±N¥Í¦¨¤j¶qªº±ø¥Ø¦}ÅãµÛ°§CHashMapsªº©Ê¯à¡A¦ý¥¦²Å¦X³WS¡C¤@Ó§ó¦X²zªºhashCode()¹ê¬IÀ³¸Ó¬O³o¼Ë¡G
¡@¡@ public int hashCode() { ¡@¡@ int hash = 1; ¡@¡@ hash = hash * 31 + someNonNullField.hashCode(); ¡@¡@ hash = hash * 31 ¡@¡@ + (someOtherField == null ? 0 : someOtherField.hashCode()); ¡@¡@ return hash; ¡@¡@ }
¡@¡@ ª`·N¡G³o¨âÏú¹ê¬I³£°§C¤FÃþª¬ºA¦r¬qªºequals()©ÎhashCode()¤èªk¤@©w¤ñ¨Òªºpºâ¯à¤O¡C®ÚÕu±z¨Ï¥ÎªºÃþ¡A±z¥i¯à§Æ±æ°§Csuperclassªºequals()©ÎhashCode()¥\¯à¤@³¡¤Àpºâ¯à¤O¡C¹ï¤_ì©l¦r¬q¨Ó»¡¡A¦b¬ÛÃöªº«Ê¸ËÃþ¤¤¦³helper¥\¯à¡A¥i¥HÀ°§U³Ð«Ø´²¦CÈ¡A¦pFloat.floatToIntBits¡C
¡@¡@ ½s¼g¤@Ó§¹¬üªºequals()¤èªk¬O¤£²{¹êªº¡C³q±`¡A·íÂX®i¤@Ó¦Û¨©¿²¤¤Fequals()ªºinstantiableÃþ®É¡A©¿²¤equals()¬O¤£¤Á¹ê»Úªº¡A¦Ó¥B½s¼g±N³Q©¿²¤ªºequals()¤èªk(¦p¦b©â¶HÃþ¤¤
)¤£¦P¤_¬°¨ãÊ^Ãþ½s¼gequals()¤èªk¡CÃö¤_¹ê¨Ò¥H¤Î»¡©úªº§ó¸Ô²Ó«H®§½Ð°Ñ¾\Effective Java Programming Language Guide, Item 7 (°Ñ¦Ò¸ê®Æ) ¡C
¦³«Ý§ï¶i?
¡@¡@ ±N´²¦CªkÌ۫بìJavaÃþ®wªº®Ú¹ï¶HÃþ¤¤¬O¤@Ïú«D±`©ú´¼ªº³]p§é°J¤èªk -- ¥¦¨Ï¨Ï¥Î°ò¤_´²¦Cªº®e¾¹Åܱo¦p¦¹Â²³æ©M°ª®Ä¡C¦ý¬O¡A¤H̹ïJavaÃþ®w¤¤ªº´²¦Cºâªk©M¹ï¶H¬Ûµ¥©Êªº¤èªk©M¹ê¬I´£¥X¤F³\¦h§åµû¡Cjava.util¤¤°ò¤_´²¦Cªº®e¾¹«D±`¤è«K©M²«K©ö¥Î¡A¦ý¥i¯à¤£Óì¥Î¤_»Ýn«D±`°ª©Ê¯àªºÀ³¥Îµ{§Ç¡CÁöµM¨ä¤¤¤j³¡¤À±N¤£·|§ïÅÜ¡A¦ý·í±z³]pÄY«¨Ì¿à¤_°ò¤_´²¦Cªº®e¾¹®Ä²vªºÀ³¥Îµ{§Ç®É¥²¶·¦Ò¼{³o¨Ç¦]¯À¡A¥¦Ì¥]¬A¡G
¡@¡@ ¤Ó¤pªº´²¦CS³ò¡C¨Ï¥Îint¦Ó¤£¬Olong§@¬°hashCode()ªºªð¦^Ãþ«¬¼W¥[¤F´²¦C½Ä¬ðªº¤L²v¡C
¡@¡@ ÁV¿|ªº´²¦CȤÀ°t¡Cµustrings©M¤p«¬integersªº´²¦CȬO¥¦Ì¦Û¤vªº¤p¾ã¼Æ¡A±µªñ¤_¨ä¥¦¡§¾Fªñ¡¨¹ï¶Hªº´²¦CÈ¡C¤@Ó´`³W¾É¯x¡]Well-behaved¡^ªº´²¦C¨ç¼Æ±N¦b¸Ó´²¦CS³ò¤º§ó§¡¤Ã¦a¤À°t´²¦CÈ¡C
¡@¡@ µL©w¸qªº´²¦C¾Þ§@¡CÁöµM¬Y¨ÇÃþ¡A¦pString©MList¡A©w¸q¤F±N¨äElementªº´²¦Cȵ²¦X¨ì¤@Ó´²¦CȤ¤¨Ï¥Îªº´²¦Cºâªk¡A¦ý»y¨¥³WS¤£©w¸q±N¦hÓ¹ï¶Hªº´²¦Cȵ²¦X¨ì·s´²¦CȤ¤ªº¥ô¦ó§å㪺¤èªk¡C§Ú̦b
«e±½s¼g¦Û¤vªºequals()©MhashCode()¤èªk¤¤°Q½×ªºList¡BString©Î¹ê¨ÒÃþA¨Ï¥Îªº³Z¬³£«Ü²³æ¡A¦ýºâ³N¤WÁÙ»·»·¤£°÷§¹¬ü¡CÃþ®w¤£´£¨Ñ¥ô¦ó´²¦Cºâªkªº¤è«K¹ê¬I¡A¥¦¥i¥H²¤Æ§ó¥ý¶iªºhashCode()¹ê¬Iªº³Ð«Ø¡C
¡@¡@ ·íÂX®i¤w¸g©¿²¤¤Fequals()ªº instantiableÃþ®É«ÜÃø½s¼gequals()¡C·íÂX®i¤w¸g©¿²¤¤Fequals()ªº instantiableÃþ®É¡A©w¸qequals()ªº¡§Åã¦Ó©ö¨£ªº¡¨¤è¦¡³£¤£¯àº¡¨¬equals()¤èªkªº¹ïºÙ©Î¶Ç»¼©Ê»Ý¨D¡C³o·N¨ýµÛ·í©¿²¤equals()®É¡A±z¥²¶·¤F¸Ñ±z¥¿¦bÂX®iªºÃþªºµ²ÌÛ©M¹ê¬I¸Ô²Ó«H®§¡A¬Æ¦Ü»Ýn¼ÉÅS°ò¥»Ãþ¤¤ªºÉó±K¦r¬q¡A¥¦¹H¤Ï¤F±¦V¹ï¶Hªº³]pªºì«h¡C
µ²§ô»y
¡@¡@ ³q¹L²Î¤@©w¸qequals()©MhashCode()¡A±z¥i¥H´£¤ÉÃþ§@¬°°ò¤_´²¦Cªº¶°¦X¤¤ªºÃöÁä¦rªº¨Ï¥Î©Ê¡C¦³¨âÏú¤èªk¨Ó©w¸q¹ï¶Hªº¬Ûµ¥©Ê©M´²¦CÈ¡G°ò¤_¼ÐÃÑ¡A¥¦¬OObject´£¨Ñªº¯Ê¬Ù¤èªk¡F°ò¤_ª¬ºA¡A¥¦n¨D©¿²¤equals()©MhashCode()¡C·í¹ï¶Hªºª¬ºA§ó§ï®É¦pªG¹ï¶Hªº´²¦Cȵo¥ÍÅܤơAÚÌ«H·íª¬ºA§@¬°´²¦CÃöÁä¦r¨Ï¥Î®É±z¤£¤¹³\§ó§ó§ï¨äª¬ºA¡C
|
|
|