<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時需要做什么?

          共 2966字,需瀏覽 6分鐘

           ·

          2021-09-05 20:04

          作者 | petterp

          來源 | https://blog.csdn.net/petterp/article/details/89043847

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

          hashcode()

          1. hashCode 的存在主要用于查找的快捷性,如 Hashtable, HashMap 等,hashCode 是用來在三列存儲結(jié)構(gòu)中確定對象的存儲地址的。
          2. 如果兩個對象相同,就是適用于 euqals(java.lang.Object) 方法,那么這兩個對象的 hashCode一定相同。
          3. 如果對象的euqals 方法被重寫,那么對象的 hashCode 也盡量重寫,并且產(chǎn)生 hashCode 使用的對象,一定要和 equals 方法中使用的一致,否則就會違反上面提到的第二點(diǎn)。
          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 時將更麻煩:因?yàn)閮蓚€對象的hashCode 值相同,HashSet 將試圖 把它們保存在同一個位置,但又不行(否則將只剩下一個對象),所以實(shí)際上會在這個位置用鏈?zhǔn)浇Y(jié)構(gòu)來保存多個對象;而HashSet 訪問集合元素時也是根據(jù)元素的 hashCode 值來快速定位的,如果 hashSet 中兩個以上的元素具有相同的 HashCode 值時,將會導(dǎo)致性能下降。

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

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

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

          用好 Java 中的枚舉,讓你的工作效率飛起來!

          4 款 MySQL 調(diào)優(yōu)工具,公司大神都在用!

          面試官問:數(shù)據(jù)庫 delete 表數(shù)據(jù),磁盤空間還是被一直占用,為什么?

          面試官:Redis用過是吧?那你講講Redis都有哪些監(jiān)控指標(biāo)?

          免費(fèi)的XShell替代品,又來一款國產(chǎn)良心工具....

          代碼總是被嫌棄寫的太爛?裝上這個IDEA插件再試試!

          最近面試BAT,整理一份面試資料Java面試BATJ通關(guān)手冊,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫、數(shù)據(jù)結(jié)構(gòu)等等。

          獲取方式:點(diǎn)“在看”,關(guān)注公眾號并回復(fù) Java 領(lǐng)取,更多內(nèi)容陸續(xù)奉上。

          文章有幫助的話,在看,轉(zhuǎn)發(fā)吧。

          謝謝支持喲 (*^

          瀏覽 24
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(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>
                  伊人色色影院 | 淫婷婷| 亚洲天堂v| 国产精品成人久久久久久久 | 国内毛片毛片毛片毛片毛片毛片毛片 |