<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時需要做哪些動作!

          共 2847字,需瀏覽 6分鐘

           ·

          2021-08-20 07:20

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

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

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

          自定義類中的equals() 和 hashCode()都繼承自Object類。


          END


          順便給大家推薦一個GitHub項目,這個 GitHub 整理了上千本常用技術(shù)PDF,絕大部分核心的技術(shù)書籍都可以在這里找到,

          GitHub地址:https://github.com/javadevbooks/books

          Gitee地址:https://gitee.com/javadevbooks/books

          電子書已經(jīng)更新好了,你們需要的可以自行下載了,記得點一個star,持續(xù)更新中..



          瀏覽 44
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <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>
                  欧美在线成人网站 | 人人干人人模 | 国产精品51麻豆cm传媒 | a∨中文字幕 | www,俺也去婷婷官网 |