JAva HashCode()メソッドの理解

1947 ワード

hashcode()メソッドは皆さんがこれがObjectで定義されている方法であることを知っていると信じています.多くの人がそれが何に使われているのか分からないと思います.今日はimageLoaderフレームワークのソースコードで出会ったので、勉強して、フレームワークのソースコードを見ると本当に多くの知識を学ぶことができます.
たとえばSet集合は重複するデータを格納できないことを知っていますが、どうすればいいのでしょうか.hashアルゴリズムに関連します
もし私たちが1つのデータを加えるたびにequals法で判断しなければならない場合、データが数万または数十万になると、このように遍歴して判断すると、効率が低くなります.
JAvaは効率を高めるためにハッシュテーブルのアルゴリズム、つまりハッシュアルゴリズムを導入しました!
hashアルゴリズムの原理:
Setが要素を受信すると、そのオブジェクトのメモリアドレスからhashCodeを算出し、どの区間に属するかを見て、この区間でequealsメソッドを呼び出します.
ハッシュが違うと同じデータではないので、equalsで判断する必要はなく、遍歴を省略してequalsで判断することで効率が上がるのではないでしょうか.
確かに効率が向上しました.しかし、2つのオブジェクトequalsが等しいが、1つの区間ではなく、比較する機会がまったくなく、異なるオブジェクトと見なされるという問題が発見されました.JavaはeqaulsメソッドとhashCodeメソッドについてこのように規定しています.
1 2つのオブジェクトが同じ場合、hashCodeの値は必ず同じになります.equalsメソッドを書き換えるにはhashCodeメソッドを必ず書き換えることも教えてくれます.
2 2つのオブジェクトのhashCodeが同じである場合、それらは必ずしも同じではありません.ここで、オブジェクトはeqaulsメソッドで比較されます.
次に例を挙げて比較します.
public class User {
	private String name;
	private int age;
	
	public User(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	@Override
	public boolean equals(Object obj) {
		if(obj==null){
			return false;
		}
		User user = (User) obj;
		return this.name==user.name&&this.age==user.age;
	}
	@Override
	public int hashCode() {
		return age;
	}
}
Test.JAvaテスト
public class Test {
   public static void main(String[] args) {
	   User user1 = new User("zgz",1);
	   User user2 = new User("zgz",1);
	   System.out.println("user1="+user1);
	   System.out.println("user2="+user2);
	   
	   System.out.println(user1.equals(user2));
   }
}
このときequalsが呼び出すのはObjectメソッドのequalsのメソッドではありません.このとき印刷されるのはtrueで、このuser 1とuser 2が同じオブジェクトであることを示します.
これにより、最初の結論が正しいことが検証されました.
2つのオブジェクトが同じ場合、hashCodeの値は必ず同じになります.equalsメソッドを書き換えるにはhashCodeメソッドを書き直さなければならないことも教えてくれました
では、2つ目の結論が正しいかどうかをどのように検証しますか?簡単ですequalsメソッドを書き直さないでOK