第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

hashMap源碼中的一個(gè)細(xì)節(jié)問(wèn)題

標(biāo)簽:
Java

         

public V put(K key, V value) {       if (key == null)          return putForNullKey(value);       int hash = hash(key.hashCode());        int i = indexFor(hash, table.length);       for (Entry<K,V> e = table[i]; e != null; e = e.next) {          Object k;          if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {              V oldValue = e.value;              e.value = value;              e.recordAccess(this);              return oldValue;          }      }      modCount++;      addEntry(hash, key, value, i);      return null;  }

以上代码是hashMap中存储的实现,简单讲下它的原理。hashMap实现自Map接口,他是一个双列集合,以键值

对的形式储存数据,存储方式利用哈希表散列,数据结构是一个可变数组与链表相结合。这个数组中存储的数

据是一个Entry类型的对象,该类里面维护了一个Key、Value以及指向下一个对象的next变量,Entry类也就使

其具备了存储键值对以及数组链表相结合的条件。

当往map中put数据时,首先判断key值是否为空,为空则直接将value放入数组的的第一个位置,不为空,则计算

出key的hashcode值,根据hashcode的二次hash结果以及数组的大小计算出该数据所在的存储位置,该存储位置

的数据未必为空,因此先判断计算出的位置上是否有数据,如果没有,直接将value值存进去,如果有,则开始

遍历该位置所保存的链表,判断有没有key值相同的,如果有相同的,则用value覆盖该位置上的值,如果遍历完

了也没有,则将value值插在这个链表的头部,插入就算完成了。

过程很简单,但有一个细节刚开始很令人费解:

if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {

就是此处的判断语句,此时我们已经找到了新存储数据应该存储的位置,但是在该位置上已经有数据了,而且这些

数据的key有可能和新数据的key相同,也有可能不同,因为我们虽然是使用key的hash进行的位置计算,但位置相同

的key,其内容未必相同,因此上述代码就是判断key值是否相同的,判断方式就是先比较hash值,如果相同再比较

内容。此时又令人费解的是&& 后面没有直接跟equals的比较而是((k = e.key) == key || key.equals(k)),

其实他是等价于key.equals(k),上述的写法其实是一种优化效率的体现,因为我们经常会对某些对象重写其equals

方法来比较内容,倘若(k = e.key) == key都返回true了,那换有必要再调用equals吗?这种情况下就会有效率

的提升。

點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺(jué)得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫(xiě)下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開(kāi)微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專(zhuān)欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消