【面試題集】hashcode相等的兩個(gè)類一定相等么锋勺,反之呢

hashcode和equals

首先,我們打開(kāi)Object類芽狗,找到public native int hashCode();方法绢掰,看下它的注釋是什么,翻譯后大概是這樣的:

  • 在 Java 應(yīng)用程序執(zhí)行期間童擎,在對(duì)同一對(duì)象多次調(diào)用 hashCode 方法時(shí)滴劲,必須一致地返回相同的整數(shù),前提是將對(duì)象進(jìn)行 equals 比較時(shí)所用的信息沒(méi)有被修改顾复。從某一應(yīng)用程序的一次執(zhí)行到同一應(yīng)用程序的另一次執(zhí)行班挖,該整數(shù)無(wú)需保持一致芯砸。
  • 如果根據(jù) equals(Object) 方法焰扳,兩個(gè)對(duì)象是相等的霜浴,那么對(duì)這兩個(gè)對(duì)象中的每個(gè)對(duì)象調(diào)用 hashCode 方法都必須生成相同的整數(shù)結(jié)果磁奖。
  • 如果根據(jù) equals(java.lang.Object) 方法超营,兩個(gè)對(duì)象不相等今妄,那么對(duì)這兩個(gè)對(duì)象中的任一對(duì)象上調(diào)用 hashCode 方法不要求一定生成不同的整數(shù)結(jié)果届囚。但是脏嚷,程序員應(yīng)該意識(shí)到婴噩,為不相等的對(duì)象生成不同整數(shù)結(jié)果可以提高哈希表的性能擎场。
  • 在合理可行的范圍內(nèi),Object類定義的hashCode方法的確為不同對(duì)象返回不同的整數(shù)几莽。 (這通常通過(guò)將對(duì)象的內(nèi)部地址轉(zhuǎn)換為整數(shù)來(lái)實(shí)現(xiàn)迅办,但是Java?編程語(yǔ)言不強(qiáng)制要求此實(shí)現(xiàn)技術(shù)。)

所以章蚣,結(jié)論就很明顯了:

  • hashCode相等的類站欺,equals不一定相等;
  • equals相等的類纤垂,hashCode必然相等矾策;
  • hashCode一般是內(nèi)存地址,但也不一定峭沦。

品茗IT-面試題集-首發(fā)

如果大家正在尋找一個(gè)java的學(xué)習(xí)環(huán)境贾虽,或者在開(kāi)發(fā)中遇到困難,可以加入我們的java學(xué)習(xí)圈吼鱼,點(diǎn)擊即可加入蓬豁,共同學(xué)習(xí),節(jié)約學(xué)習(xí)時(shí)間菇肃,減少很多在學(xué)習(xí)中遇到的難題地粪。

hashcode的生成規(guī)則。

jdk8的openjdk源碼地址:http://hg.openjdk.java.net/jdk8琐谤,其他版本也可以在這個(gè)網(wǎng)站查到蟆技。

openjdk:

  • corba:不流行的多語(yǔ)言、分布式通訊接口
  • hotspot:Java 虛擬機(jī)
  • jaxp:XML 處理
  • jaxws:一組 XML web services 的 Java API
  • jdk:java 開(kāi)發(fā)工具包
  • langtools:Java 語(yǔ)言工具
  • nashorn:JVM 上的 JavaScript 運(yùn)行時(shí)笑跛。
在這里插入圖片描述

在hotspot下的src/share/vm/runtime/synchronizer.cpp文件中付魔,能看到hashcode生成源碼:

static inline intptr_t get_next_hash(Thread * Self, oop obj) {
  intptr_t value = 0 ;
  if (hashCode == 0) {
     // This form uses an unguarded global Park-Miller RNG,
     // so it's possible for two threads to race and generate the same RNG.
     // On MP system we'll have lots of RW access to a global, so the
     // mechanism induces lots of coherency traffic.
     value = os::random() ;
  } else
  if (hashCode == 1) {
     // This variation has the property of being stable (idempotent)
     // between STW operations.  This can be useful in some of the 1-0
     // synchronization schemes.
     intptr_t addrBits = cast_from_oop<intptr_t>(obj) >> 3 ;
     value = addrBits ^ (addrBits >> 5) ^ GVars.stwRandom ;
  } else
  if (hashCode == 2) {
     value = 1 ;            // for sensitivity testing
  } else
  if (hashCode == 3) {
     value = ++GVars.hcSequence ;
  } else
  if (hashCode == 4) {
     value = cast_from_oop<intptr_t>(obj) ;
  } else {
     // Marsaglia's xor-shift scheme with thread-specific state
     // This is probably the best overall implementation -- we'll
     // likely make this the default in future releases.
     unsigned t = Self->_hashStateX ;
     t ^= (t << 11) ;
     Self->_hashStateX = Self->_hashStateY ;
     Self->_hashStateY = Self->_hashStateZ ;
     Self->_hashStateZ = Self->_hashStateW ;
     unsigned v = Self->_hashStateW ;
     v = (v ^ (v >> 19)) ^ (t ^ (t >> 8)) ;
     Self->_hashStateW = v ;
     value = v ;
  }

  value &= markOopDesc::hash_mask;
  if (value == 0) value = 0xBAD ;
  assert (value != markOopDesc::no_hash, "invariant") ;
  TEVENT (hashCode: GENERATE) ;
  return value;
}
  • hashCode == 0,此類方案返回一個(gè)Park-Miller偽隨機(jī)數(shù)生成器生成的隨機(jī)數(shù)飞蹂;OpenJdk 6 &7的默認(rèn)實(shí)現(xiàn)几苍;
  • hashCode == 1,此類方案將對(duì)象的內(nèi)存地址陈哑,做移位運(yùn)算后與一個(gè)隨機(jī)數(shù)進(jìn)行異或得到結(jié)果妻坝;
  • hashCode == 2伸眶,此類方案返回固定的1;
  • hashCode == 3刽宪,此類方案返回一個(gè)自增序列的當(dāng)前值厘贼;
  • hashCode == 4,此類方案返回當(dāng)前對(duì)象的內(nèi)存地址圣拄;
  • hashcode >= 5嘴秸,Marsaglia XORshift隨機(jī)數(shù)算法,使用位移和異或運(yùn)算生成隨機(jī)數(shù)的方法岳掐;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末饭耳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子寞肖,更是在濱河造成了極大的恐慌纲酗,老刑警劉巖新蟆,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件琼稻,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡欣簇,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門莫鸭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)横殴,“玉大人,你說(shuō)我怎么就攤上這事衫仑。” “怎么了粥鞋?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)瞄崇。 經(jīng)常有香客問(wèn)我呻粹,道長(zhǎng)壕曼,這世上最難降的妖魔是什么腮郊? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任筹燕,我火速辦了婚禮,結(jié)果婚禮上踪少,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好兼犯,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布切黔。 她就那樣靜靜地躺著,像睡著了一般纬霞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上诗芜,一...
    開(kāi)封第一講書(shū)人閱讀 49,760評(píng)論 1 289
  • 那天伏恐,我揣著相機(jī)與錄音,去河邊找鬼翠桦。 笑死横蜒,一個(gè)胖子當(dāng)著我的面吹牛销凑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播澎蛛,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蜕窿,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼督勺!你這毒婦竟也來(lái)了斤贰?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤瓷叫,失蹤者是張志新(化名)和其女友劉穎送巡,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體骗爆,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年煮寡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了幸撕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坐儿,死狀恐怖宋光,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情罪佳,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布尽楔,位于F島的核電站第练,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏娇掏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一下梢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧孽江,春花似錦、人聲如沸岗屏。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至似袁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間昙衅,已是汗流浹背所宰。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工仔粥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人躯泰。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓华糖,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親客叉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容