<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【面題解析】用Object做hashMap的Key時需要做什么?

          共 2788字,需瀏覽 6分鐘

           ·

          2021-09-20 05:28


          源 /         文/ 


          先來說一下hashcode()和equals方法吧。

          hashcode()

          1. hashCode 的存在主要用于查找的快捷性,如 Hashtable, HashMap 等,hashCode 是用來在三列存儲結(jié)構(gòu)中確定對象的存儲地址的。
          2. 如果兩個對象相同,就是適用于 euqals(java.lang.Object) 方法,那么這兩個對象的 hashCode一定相同。
          3. 如果對象的euqals 方法被重寫,那么對象的 hashCode 也盡量重寫,并且產(chǎn)生 hashCode 使用的對象,一定要和 equals 方法中使用的一致,否則就會違反上面提到的第二點。
          4. 兩個對象的 hashCode 相同,并不一定表示這兩個對象就相同,也就是不一定適用于equals() 方法,只能夠說明這兩個對象在三列存儲結(jié)構(gòu)中,如 Hashtable.,他們存在同一個籃子里。以上話以前摘錄自一篇博客,講的非常好。

          equals(Object obj)

          1. 如果一個類沒有重寫 equals(Object obj)方法,則等價于通過 == 比較兩個對象,即比較的是對象在內(nèi)存中的空間地址是否相等。
          2. 如果重寫了equals(Object ibj)方法,則根據(jù)重寫的方法內(nèi)容去比較相等,返回 true 則相等,false 則不相等。

          我用一個簡單的demo來舉個例子吧.

          public class MyClass {
           public static void main(String[] args) {
               HashSet books=new HashSet();
               books.add(new A());
               books.add(new A());
               books.add(new B());
               books.add(new B());
               books.add(new C());
               books.add(new C());
               System.out.println(books);
           }
          }
          class A{
           //類A的 equals 方法總是返回true,但沒有重寫其hashCode() 方法
           @Override
           public boolean equals(Object o) {
               return true;
           }
          }
          class B{
           //類B 的hashCode() 方法總是返回1,但沒有重寫其equals()方法
           @Override
           public int hashCode() {
               return 1;
           }
          }
          class C{
           public int hashCode(){
               return 2;
           }

           @Override
           public boolean equals(Object o) {
               return true;
           }
          }

          結(jié)果

          1. 即使兩個A 對象通過 equals() 比較返回true,但HashSet 依然把他們當(dāng)成 兩個對象,即使兩個 B 對象 的hashCode() 返回值相同,但HashSet 依然把他們當(dāng)成兩個對象。
          2. 即也就是,當(dāng)把一個對象放入HashSet 中時,如果需要重寫該對象對應(yīng)類的 equals() 方法,則也應(yīng)該重寫其 hashCode() 方法。規(guī)則是:如果兩個對象通過 equals() 方法比較返回true,這兩個對象的 hashCode 值也應(yīng)該相同。
          3. 如果兩個對象通過euqals() 方法比較返回true,但這兩個對象的 hashCode() 方法返回不同的hashCode 值時,這將導(dǎo)致HashSet 會把這兩個對象保存在 Hash 表的不同位置,從而使兩個對象都可以添加成功,這就與 Set 集合的規(guī)則沖突了。
          4. 如果兩個對象的 hashCode() 方法返回的 hasCode 值相同,但他們通過 equals() 方法比較返回false 時將更麻煩:因為兩個對象的hashCode 值相同,HashSet 將試圖 把它們保存在同一個位置,但又不行(否則將只剩下一個對象),所以實際上會在這個位置用鏈?zhǔn)浇Y(jié)構(gòu)來保存多個對象;而HashSet 訪問集合元素時也是根據(jù)元素的 hashCode 值來快速定位的,如果 hashSet 中兩個以上的元素具有相同的 HashCode 值時,將會導(dǎo)致性能下降。

          用Object做hashMap的Key時需要做什么?

          用自定義類作為key,必須重寫equals()和hashCode()方法。

          自定義類中的equals() 和 hashCode()都繼承自O(shè)bject類。

          推薦閱讀


          7輪面試,耗費30天,我真的差點沒挺過去...


          迄今為止程序員寫過的最大Bug:虧損30億、致6人死亡,甚至差點毀滅世界


          某程序員自述:我,三十多歲,逃離北上廣,通過技術(shù)移民到加拿大!




          END


          頂級程序員:topcoding

          做最好的程序員社區(qū):Java后端開發(fā)、Python、大數(shù)據(jù)、AI


          一鍵三連「分享」、「點贊」和「在看」


          瀏覽 54
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  干屄免费看 | 天天看天天干 | 麻W豆W传媒在线看 | 波多野结衣av一区二区全免费观看 | 夜夜嗨av|