java中的equals,hashcode的区别和联系 java中equals,hashcode和==的区别

java\u4e2dequals\uff0chashcode\u548c==\u7684\u533a\u522b

==\u662f\u6307\u5bf9\u5185\u5b58\u5730\u5740\u8fdb\u884c\u6bd4\u8f83 \uff0cequals()\u662f\u5bf9\u5b57\u7b26\u4e32\u7684\u5185\u5bb9\u8fdb\u884c\u6bd4\u8f83\uff1b
Java\u4e2d\u4efb\u4f55\u4e00\u4e2a\u5bf9\u8c61\u90fd\u5177\u5907equals(Object obj)\u548chashcode()\u8fd9\u4e24\u4e2a\u65b9\u6cd5\uff0cequals(Object obj)\u65b9\u6cd5\u7528\u6765\u5224\u65ad\u4e24\u4e2a\u5bf9\u8c61\u662f\u5426\u201c\u76f8\u540c\u201d\uff0c\u5982\u679c\u201c\u76f8\u540c\u201d\u5219\u8fd4\u56detrue\uff0c\u5426\u5219\u8fd4\u56defalse\u3002
hashcode()\u65b9\u6cd5\u8fd4\u56de\u4e00\u4e2aint\u6570\uff0c\u5728Object\u7c7b\u4e2d\u7684\u9ed8\u8ba4\u5b9e\u73b0\u662f\u201c\u5c06\u8be5\u5bf9\u8c61\u7684\u5185\u90e8\u5730\u5740\u8f6c\u6362\u6210\u4e00\u4e2a\u6574\u6570\u8fd4\u56de\u201d\u3002\u82e5\u91cd\u5199equals(Object obj)\u65b9\u6cd5\uff0c\u6709\u5fc5\u8981\u91cd\u5199hashcode()\u65b9\u6cd5\uff0c\u786e\u4fdd\u901a\u8fc7equals(Object obj)\u65b9\u6cd5\u5224\u65ad\u7ed3\u679c\u4e3atrue\u7684\u4e24\u4e2a\u5bf9\u8c61\u5177\u5907\u76f8\u7b49\u7684hashcode()\u8fd4\u56de\u503c\u3002
\u5f97\u5230\u5982\u4e0b\u63a8\u8bba\uff1a
1\u3001\u5982\u679c\u4e24\u4e2a\u5bf9\u8c61equals\uff0cJava\u8fd0\u884c\u65f6\u73af\u5883\u4f1a\u8ba4\u4e3a\u4ed6\u4eec\u7684hashcode\u4e00\u5b9a\u76f8\u7b49\u3002
2\u3001\u5982\u679c\u4e24\u4e2a\u5bf9\u8c61\u4e0dequals\uff0c\u4ed6\u4eec\u7684hashcode\u6709\u53ef\u80fd\u76f8\u7b49\u3002
3\u3001\u5982\u679c\u4e24\u4e2a\u5bf9\u8c61hashcode\u76f8\u7b49\uff0c\u4ed6\u4eec\u4e0d\u4e00\u5b9aequals\u3002
4\u3001\u5982\u679c\u4e24\u4e2a\u5bf9\u8c61hashcode\u4e0d\u76f8\u7b49\uff0c\u4ed6\u4eec\u4e00\u5b9a\u4e0dequals\u3002

\u5047\u8bbe\u6709\u4e00\u4e2a\u73ed\u7ea7\uff0c\u6709\u4f60\u548c\u4f60\u7684\u5c0f\u4f19\u4f34
\u4f60\u548c\u4f60\u7684\u5c0f\u4f19\u4f34\u90fd\u662f\u4eba\u7684\u5b9e\u4f8b \u3002
\u90a3\u4e48\u5148\u8bf4==\uff1a\u4f60==\u4f60\u7684\u5c0f\u4f19\u4f34\uff0c\u80af\u5b9a\u662ffalse\u3002==\u7528\u4e8e\u6bd4\u8f83\u5bf9\u8c61\u6307\u5411\u7684\u5185\u5b58\u5730\u5740\u3002
\u8bdd\u8bf4equals\uff1a\u4f60.equals\uff08\u4f60\u7684\u5c0f\u4f19\u4f34\uff09\u3002equals\u662f\u7528\u4e8e\u6bd4\u8f83\u5c5e\u6027\u7684\uff0c\u6bd4\u4f8b\u4f60\u4eec\u540d\u5b57\u90fd\u53eb\u9ad8\u5bcc\u5e05\u3001\u6027\u522b\u90fd\u662f\u7537\u3001\u8eab\u9ad8\u4e00\u6837\u3002\u90a3\u4e48\u4f60\u4fe9\u6bd4\u8f83\u6765\u8bf4\u5c31\u662ftrue\u3002equals\u7528\u4e8e\u6bd4\u8f83\u5c5e\u6027\uff0c\u8fd9\u4e5f\u5c31\u662f\u4e3a\u4ec0\u4e48\u4f60\u751f\u6210\u4e00\u4e2ajavabean\uff0coverride\u4e00\u4e2aequals\u7684\u65f6\u5019\uff0c\u4ee3\u7801\u90fd\u662f\u6bd4\u8f83\u5c5e\u6027\u3002
\u4e09\u8bf4hashCode\uff1a\u627f\u63a5\u4e0a\u4f8b\uff0c\u4f60\u548c\u4f60\u7684\u5c0f\u4f19\u4f34\u59d3\u540d\u3001\u6027\u522b\u3001\u8eab\u9ad8\u90fd\u662f\u4e00\u6837\u7684\uff0cequals\u662f\u4e00\u6837\u7684\uff0c\u5916\u4eba\u5f88\u5bb9\u6613\u6df7\u6dc6\u3002\u4f46\u662f\u4f60\u4fe9\u8eab\u4efd\u8bc1\u4e0d\u4e00\u6837\uff0chashCode\u5c31\u662f\u8eab\u4efd\u8bc1\u3002\u6240\u4ee5\u4f60\u4fe9\u7684hashCode\u503c\u4e0d\u540c\u3002hashCode\u662fhash\u5b58\u50a8\u8fd4\u56de\u7684\u4e00\u4e2a\u5e8f\u5217\u53f7\u3002
\u6545\u4e8b\u8bb2\u5b8c\u4e86\uff0c\u4e0d\u77e5\u9053\u4f60\u61c2\u4e86\u6ca1\uff1f
\u5230\u8fd9\u91cc\uff0c\u4f60\u53ef\u80fd\u8fd8\u6709\u4e00\u70b9\u51fb\u4e0d\u660e\u767d\u3002hashCode\u548c==\u597d\u50cf\u4e00\u6837\u554a\u3002
\u4ed6\u4fe9\u5c31\u50cf\u5361\u5df4\u65af\u57fa\u548c\u5df4\u57fa\u65af\u5766\u7684\u5173\u7cfb\u4e00\u6837\uff0c\u57fa\u5df4\u5173\u7cfb\u3002\u5475\u5475~~
\u4f8b\u5982\uff1a\u4f60\u548c\u4f60\u7684\u5c0f\u4f19\u4f34\uff0c\u8eab\u9ad8\u3001\u6027\u522b\u3001\u59d3\u540d\u90fd\u4e00\u6837\uff0c\u6240\u4ee5\u4f60\u4eec\u7684equals\u4e3atrue\u3002\u5982\u679c\u4f60\u4eec\u7684\u8eab\u4efd\u8bc1\u53f7\u4e5f\u4e00\u6837,\u90a3\u4e48hashCode\u4e5f\u4e00\u6837\uff0c\u8fd9\u65f6\u5019\u628a\u4f60\u4eec\u505a\u4e3akey\u653e\u5230hashMap\u4e2d\uff0c\u5c31\u6709\u4e00\u4e2a\u4eba\u5457\u66ff\u4ee3\u4e86\u3002\u4f46\u662f\u4f60\u4fe9\u7684==\u8fd8\u662ffalse

equals
public boolean equals(Object obj)
指示其他某个对象是否与此对象“相等”。
equals 方法在非空对象引用上实现相等关系:
自反性:对于任何非空引用值 x,x.equals(x) 都应返回 
true。
对称性:对于任何非空引用值 x 和 y,当且仅当 
y.equals(x) 返回 true 时,x.equals(y) 才应返回 
true。
传递性:对于任何非空引用值 x、y 和 z,如果 
x.equals(y) 返回 true,并且 y.equals(z) 返回 
true,那么 x.equals(z) 应返回 true。
一致性:对于任何非空引用值 x 和 y,多次调用 
x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 
equals 比较中所用的信息没有被修改。
对于任何非空引用值 x,x.equals(null) 都应返回 
false。
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 
x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。
注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

参数:
obj - 要与之比较的引用对象。
返回:
如果此对象与 obj 参数相同,则返回 true;否则返回 false。
另请参见:
hashCode(), Hashtable
hashCode
public int hashCode()
返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。
hashCode 的常规协定是:
在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 
equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 
hashCode 方法都必须生成相同的整数结果。
如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。
实际上,由 Object 类定义的 hashCode 
方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)

返回:
此对象的一个哈希码值。
另请参见:
equals(java.lang.Object), 
Hashtable

也就是说equals和hashCode的关系只是在于一个协定,equals默认判断依据是对象是否相等,hashCode()得到对象的内存地址的一个特殊计算得到的值,协定内容是:equals相等的对象的hashCode值相等,所以要求重写了equals之后重写hashCode。

equals是判断对象是否相等的方法。hashCode是得到对象hash值的方法,对象hash值默认是根据内存地址计算得到。equals默认表的是对象内存地址。



HashSet和HashMap一直都是JDK中最常用的两个类,HashSet要求不能存储相同的对象,HashMap要求不能存储相同的键。
那么Java运行时环境是如何判断HashSet中相同对象、HashMap中相同键的呢?当存储了“相同的东西”之后Java运行时环境又将如何来维护呢?
在研究这个问题之前,首先说明一下JDK对equals(Object obj)和hashcode()这两个方法的定义和规范:
在Java中任何一个对象都具备equals(Object obj)和hashcode()这两个方法,因为他们是在Object类中定义的。
equals(Object obj)方法用来判断两个对象是否“相同”,如果“相同”则返回true,否则返回false。
hashcode()方法返回一个int数,在Object类中的默认实现是“将该对象的内部地址转换成一个整数返回”。
接下来有两个个关于这两个方法的重要规范(我只是抽取了最重要的两个,其实不止两个): 规范1:若重写equals(Object
obj)方法,有必要重写hashcode()方法,确保通过equals(Object
obj)方法判断结果为true的两个对象具备相等的hashcode()返回值。说得简单点就是:“如果两个对象相同,那么他们的hashcode应该
相等”。不过请注意:这个只是规范,如果你非要写一个类让equals(Object
obj)返回true而hashcode()返回两个不相等的值,编译和运行都是不会报错的。不过这样违反了Java规范,程序也就埋下了BUG。
规范2:如果equals(Object
obj)返回false,即两个对象“不相同”,并不要求对这两个对象调用hashcode()方法得到两个不相同的数。说的简单点就是:“如果两个对象不相同,他们的hashcode可能相同”。
根据这两个规范,可以得到如下推论: 1、如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。
2、如果两个对象不equals,他们的hashcode有可能相等。 3、如果两个对象hashcode相等,他们不一定equals。
4、如果两个对象hashcode不相等,他们一定不equals。
这样我们就可以推断Java运行时环境是怎样判断HashSet和HastMap中的两个对象相同或不同了。我的推断是:先判断hashcode是否相等,再判断是否equals。
测试程序如下:首先我们定义一个类,重写hashCode()和equals(Object obj)方法

  • java閲宔quals鍜宧ashCode涔嬮棿浠涔堝叧绯
    绛旓細equals涓巋ashcode鐨勫叧绯绘槸锛氫袱涓璞″湪equals鐩哥瓑鐨勬儏鍐典笅锛宧ashcode鏈夊彲鑳界浉绛変篃鏈夊彲鑳戒笉鐩哥瓑锛岃屼袱涓璞″湪hashcode涓嶇浉绛夌殑鎯呭喌涓嬶紝equals涔熷繀瀹氫笉鐩哥瓑銆傜悊瑙quals鐨勫簲鐢細瀹冩槸鐢ㄤ簬鐢ㄦ埛鍦ㄨ繘琛屽姣旂殑鏃跺欙紝杩欎釜鏃跺欏姣旂殑鏄唴瀹规槸鍚︾浉绛夌悊瑙ashcode鐨勫簲鐢細渚嬪set闆嗗悎锛屽畠鐨勪笉鍙噸澶嶏紝杩涜瀵规瘮鐨勪究鏄痟ashcode...
  • java,equals()鍜宧ashCode()杩欎袱涓柟娉曟槸璋鐨,涓轰粈涔堝繀椤昏鐩?
    绛旓細鏄疧bject绫荤殑銆java涓鎵鏈夌被閮芥槸Object鐨勫瓙绫汇傛病鏈夎蹇呴』瑕佽鐩栬繖涓や釜鏂规硶銆備絾鏄鏋滆鐩栦簡equals()鏂规硶鐨勮瘽锛屽垯蹇呴』瑕佽鐩杊ashCode()鏂规硶銆傦紙杩欐墠鏄叧閿級鍦∣bject绫讳腑瀹氫箟浜唄ashCode()鍜宔quals()鏂规硶锛孫bject绫鐨別quals()鏂规硶鎸夌収鍐呭瓨鍦板潃姣旇緝瀵硅薄鏄惁鐩哥瓑锛屽洜姝ゅ鏋 object1.equals(object2)涓簍rue锛岃〃...
  • java涓殑equals()鏂规硶
    绛旓細涓銆佹繁鍏ョ悊瑙==涓嶰bject绫涓殑equals()鏂规硶</ 鍦Java涓紝==杩愮畻绗﹀湪姣旇緝鍩烘湰鏁版嵁绫诲瀷鏃讹紝姣旇緝鐨勬槸鍊硷紱鑰屽湪姣旇緝寮曠敤鏁版嵁绫诲瀷鏃讹紝姣旇緝鐨勬槸瀹冧滑鐨勫唴瀛樺湴鍧銆傝繖鍦ㄦ瘮杈冨熀鏈暟鎹被鍨嬬殑鍊兼椂琛ㄧ幇鏄庢樉锛屽鏁存暟鎴栧瓧绗︺傜劧鑰岋紝褰撴秹鍙婂埌寮曠敤鏁版嵁绫诲瀷锛屽String锛屼簨鎯呭氨鏈夋墍涓嶅悓浜嗐備緥濡傦紝褰撴垜浠瘮杈冧袱涓猄tring瀵硅薄s...
  • java 涓 equals() 鐩哥瓑鐨勪袱涓璞,hashcode() 涓瀹氱浉绛
    绛旓細鍦java涓锛宔quals鍜宧ashcode鏄湁璁捐瑕佹眰鐨勶紝equals鐩哥瓑锛屽垯hashcode涓瀹氱浉绛夛紝鍙嶄箣鍒欎笉鐒躲備负浣曚細鏈夎繖鏍风殑瑕佹眰锛熷湪闆嗗悎涓紝姣斿HashSet涓紝瑕佹眰鏀惧叆鐨勫璞′笉鑳介噸澶嶏紝鎬庝箞鍒ゅ畾鍛紵棣栧厛浼氳皟鐢╤ashcode锛屽鏋渉ashcode鐩哥瓑锛屽垯缁х画璋冪敤equals锛涔熺浉绛夛紝鍒欒涓洪噸澶嶃傚鏋滈噸鍐檈quals鍚庯紝濡傛灉涓嶉噸鍐檋ashcode锛屽垯hashcode灏...
  • Java涓鍏充簬equals()鍜宧ashCode()鐨勯棶棰
    绛旓細姣斿equals鏂规硶, 浠ヤ笅灏辨嫹璐濅簡, 寰堝熀纭鐨勭煡璇.瀵圭О鎬э細濡傛灉x.equals(y)杩斿洖鏄渢rue鈥濓紝閭d箞y.equals(x)涔熷簲璇ヨ繑鍥炴槸鈥渢rue鈥濄傚弽灏勬э細x.equals(x)蹇呴』杩斿洖鏄渢rue鈥濄傜被鎺ㄦэ細濡傛灉x.equals(y)杩斿洖鏄渢rue鈥濓紝鑰屼笖 y.equals(z)杩斿洖鏄渢rue鈥濓紝閭d箞z.equals(x)涔熷簲璇ヨ繑鍥炴槸鈥渢rue鈥濄傝繕鏈...
  • java涓涓轰粈涔堥噸鍐欎簡equals蹇呴』閲嶅啓hashCode 涓轰粈涔堣杩斿洖firstname鐨勫搱甯...
    绛旓細锛2锛塸ublic int hashCode() 杩斿洖璇ュ璞$殑鍝堝笇鐮佸笺傛敮鎸佽鏂规硶鏄负鍝堝笇琛ㄦ彁渚涗竴浜涗紭鐐癸紝渚嬪锛java.util.Hashtable 鎻愪緵鐨勫搱甯岃〃銆傛垜浠煡閬擄紝濡傛灉涓嶉噸鍐equals锛閭d箞姣旇緝鐨勫皢鏄璞$殑寮曠敤鏄惁鎸囧悜鍚屼竴鍧楀唴瀛樺湴鍧锛岄噸鍐欎箣鍚庣洰鐨勬槸涓轰簡姣旇緝涓や釜瀵硅薄鐨剉alue鍊兼槸鍚︾浉绛夈傜壒鍒寚鍑猴紝姝ゆ椂锛屽埄鐢╡quals姣旇緝鍏ぇ鍖呰...
  • java涓鎬庝箞鐞嗚Вequals涓嶇浉绛,hashcode鍙兘鐩哥瓑
    绛旓細涓句釜渚嬪瓙锛屾瘮濡傛湁涓搱甯屽嚱鏁版槸灏嗚緭鍏ュ瓧绗︿覆鐨刟scii鐮佺浉鍔犱綔涓哄叾hashcode锛岃繖鏍风殑璇濇瘮濡傛垜浠粰涓や釜瀛楃涓瞐c鍜宐b锛岄偅浠栦滑鐨刪ashcode灏辨槸鐩哥瓑鐨勶紝浣嗘槸鏄庢樉鐢equals姣旇緝鐨勮瘽鏄笉绛夌殑銆傚疄闄呬腑鎵鐢ㄧ殑鍝堝笇鍑芥暟铏界劧涓嶆槸杩欎箞绠鍗曪紝浣嗗悓鏍蜂笉鍙伩鍏嶄細鍑虹幇杩欑涓や釜涓嶅悓鐨勫瓧绗︿覆鍏秇ashcod鐩哥瓑鐨勬儏鍐 ...
  • java鍏充簬hashcode,equals,==鐨勭枒闂
    绛旓細hashCode()鍜equals(Object o)鏂规硶鏄java鎵鏈夌被鐨勫熀绫籓bject绫涓殑鏂规硶锛屾墍鏈夌被閮界户鎵夸簡Object绫讳互鍙婂叾涓殑鏂规硶銆俥quals涓巋ashCode鐨勫畾涔夊繀椤讳竴鑷达紝鍗筹細濡傛灉x.equals(y)杩斿洖true锛岄偅涔坸.hashCode()灏卞繀椤讳笌y.hashCode()鍏锋湁鐩稿悓鐨勫笺傚綋鐒讹紝瀵逛簬涓や釜涓嶅悓鐨勫璞★紝x.hashCode()涓巠.hashCode()鍩烘湰涓嶄細鐩稿悓...
  • java hashcode鐩稿悓,equals涓瀹氫负鐪?equals涓虹湡,hashcode涓嶄竴瀹氫负鐪...
    绛旓細鑰屽叿鏈夌浉绛夌殑hashcode鐨勪袱涓璞equals涓嶄竴瀹氭垚绔嬨備綘鍙互杩欐牱璁や负涔熻锛宧ashcode鏄綔涓轰竴涓璞″瓨鍌ㄧ殑鍙傝冿紝hash琛ㄦ湰韬槸涓绉嶆暎鍒楄〃锛屽湪鏁版嵁瀛樺偍杩欏潡锛屽姛鏁堟瘮杈冨ぇ锛岃宔quals鏄浉褰撲簬涓ゅ璞′箣闂寸殑灞炴э紙鎴愬憳鍙橀噺锛夆滅浉绛夆濓紝鎰忓嵆鍏锋湁鐩稿悓鐨勮涓猴紙鏂规硶锛夈傛垨璁歌繖鏍疯璧锋潵鐞嗚В姣旇緝鐨勮垂鍔层備妇涓緥瀛愶紝姣斿浣犲畾涔...
  • equal鍦java涓殑鐢ㄦ硶
    绛旓細浠ヤ笅鏄嚑绉嶅父瑙佺殑鐢ㄦ硶锛1銆佸璞$殑鐩哥瓑鎬ф瘮杈冿細Java涓殑equals鏂规硶鐢ㄤ簬妫鏌ヤ袱涓璞℃槸鍚︾浉绛夈傝繖涓柟娉曟槸鍦∣bject绫讳腑瀹氫箟鐨勶紝琚墍鏈夌被缁ф壙銆2銆佸熀鏈暟鎹被鍨嬬殑鐩哥瓑鎬ф瘮杈冿細鍦↗ava涓紝鍩烘湰鏁版嵁绫诲瀷锛堝鏁存暟銆佹诞鐐规暟銆佸瓧绗︾瓑锛変笉鑳界洿鎺ヤ娇鐢╡quals鏂规硶杩涜姣旇緝銆3銆佸瓧绗︿覆鐨勭浉绛夋ф瘮杈冿細Java涓殑瀛楃涓茬被鍨嬪彲浠...
  • 扩展阅读:java.52emu.cn ... java windowbuilder ... www.sony.com.cn ... 黑马java视频 ... javascript免费网站 ... java入门网站 ... javascript高级视频 ... 国产任天堂switch手柄 ... e人e本a2 ...

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