equalsとhashCodeの探査の足を洗うことを書き換える(三)

2254 ワード

次にequalsとhashCodeを書き換えて足を洗う(三)
次のコードの場合:


public class User{   
     static int index = 0;
     public String userName;   
     public String password;   
  
     public User(String userName,String password){   
         this.userName = userName;   
         this.password = password;   
     }   
  
     public static void main(String[] arg){   
         Set<User> users = new HashSet<User>();      //L1   
         User user=new User("lisa","ddd");      //L2   
         users.add(user);              //L3   
         User user1=new User("lisa","ddd");     //L4   
         users.add(user1);                      //L5   
         System.out.println(“size---->"+users.size());      //L6   
     }   
  
     // hashCode equals    
     public int hashCode(){   
           
         system.out.println("fn ----> hashCode");   
         return index++;   
     }   
        
     public boolean equals(){   
         system.out.println("fn ----> equals");   
         return true;   
     }   
  
}   



コードにstatic int index=0を追加しました.とhashCodeメソッドでreturn index++;
実行:


fn ----> hashCode
fn ----> hashCode
2


なぜfn----->equalsが実行されなかったのでしょうか.、他のオブジェクトに加わる前に同じオブジェクトかどうかを判断する必要はありませんか?そしてequals()はtrueを返しますね、門限を明記した方がいいでしょう.では、なぜ数量が2なのでしょうか.
答え:hashCode()メソッドのreturn index++を覚えていますか?すなわち,返すたびにintタイプが異なる.すなわち、setにuserオブジェクトを追加するたびに、setに入力されたuserオブジェクトに別の部屋を開く.
ですから、USERごとに違う部屋に泊まる以上、同じ部屋が存在しないので2人は門限が必要だと判断しました.
したがって,equals()メソッドは決して呼び出されず,fn−−−>equalsは印刷されない.
setは無限に空間を拡大している.だから何人か追加して、私はあなたにいくつかの部屋を割り当てます.ははは(メモリがなくなるまでははは)
そこでここでQ 4:equalsメソッドとhashCodeメソッド呼び出しの順序はどうなっているかを答えた.2つのメソッドが呼び出されるタイミング?2つのメソッドが呼び出されない可能性がありますか?あるいは必ず2者のいずれかが呼び出される必要がありますか?
まとめ:だからあなたが入るかどうかは、私がどのようにreturn intとreturn booleanに頼っています.
いつまでも入っていればreturn falseかreturn int(変化する数字)でOKです.
1つだけ入るとreturn trueとreturn int(固定不変数字)がOkになります.
ゲストの徐先生に感謝します.