ハッシュアルゴリズム
彼は最初のHashMapのハッシュアルゴリズムの前を見てみましょうと述べました。我々は線形テーブルが最悪の場合の値は、最初から最後までトラバースされてもよい問い合わせることを知って、線形フォームを介してデータ構造における学習、O(n)の平均時間の複雑さであり、ハッシュテーブル缶クエリ、理想的ではありません直接アドレス値、クエリのその数回だけハッシュアルゴリズムハッシュ関数によって計算された時間複雑度は、O(1)に低減されます。
一例として、単純なクエリルックハッシュテーブルに従って、以下はハッシュテーブルは、ハッシュ関数は、最初のn%10は、ハッシュ関数が計算されることが想定されているハッシュテーブル要素アドレスで結果、10、13及び26以下に示すように結果が格納されます。
実際のハッシュ関数はよくアドレスの競合を回避することができるが、このような10及び20のようなアドレスの競合の可能性が依然として存在します。アドレス0にクエリ時間はターン10と20で、探しているものは最終的に見る比較されるように、ハッシュ値の衝突使用の値リストアップを接続するには、以下に示すようにハッシュマップ溶液中のJavaは、「チェーンアドレス方式」です。
HashMapの
のは、HashMapの、あるものを理解してみましょう「無秩序なキーと値の収集と斑点れるHashMapのようハッシュ、すなわち、順不同、ハッシングを追加して設定されているキーと値のコレクションの地図、」これが最初の私があります私は私が個人的に、より良い理解のための説明を参照してください。私たちはオブジェクトのハッシュマップのキーを使用する場合、我々はハッシュコードとeqalsを書き換えする必要がありますとき。
以下のコードを見てください
public class User {
private String name;
private String password;
public User() {
super();
}
public User(String name, String passed) {
super();
this.name = name;
this.passed = passed;
}
public class Demo {
public static void main(String[] args) {
User user1=new User("name", "passed");
User user2=new User("name", "passed");
//定义hashMap
HashMap<User, String> hashmap=new HashMap<User,String>();
//添加
hashmap.put(user1, "value1");
//通过user2获取添加的value
String str=hashmap.get(user2);
System.out.println("输出结果:"+str);
}
}
その2つだけのエンティティクラスユーザー属性名とパスワードのコードに示すを通じて、私たちは今値に対応する値からユーザー1ユーザー2を使用することを、主な機能は、ユーザーの2つの例を宣言し、その2つのプロパティが同じです外観は成功するでしょう。
結果:
输出结果:null
なぜそれの結果を想像しません。我々はハッシュマップにUSER1追加するときなので、この場合は、hashCodeメソッドをオーバーライドしていないため、ハッシュマップは、最初のハッシュマップは、オブジェクトのhashCodeハッシュ値を計算するために、オブジェクトのhashCodeメソッドと呼ばれているので、アドレスとしてハッシュ値を計算するためにユーザーのハッシュコードを呼び出します算出したハッシュ値は、アドレスuser1とuser2のは確かに異なる保存され、実際にオブジェクトのアドレスである次の書き換えユーザーのhashCode
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((passed == null) ? 0 : passed.hashCode());
return result;
}
結果:
输出结果:null
オーバーライドhashCodeメソッドいるので、結果はnullを操作する、理論的には、結果がnullだった理由は、正しいアドレスUSER1ストレージを、見つけるためにuser2の時間を見つけることができますか?ここでは、HashMapのを発見アドレスアクションの世話をしなければなりません。すでに述べたように、HashMapのの解決におけるJavaのハッシュ値は、値USER1 user2の取得することにより、ある紛争、チェーンアドレス法の使用は、直接このアドレスからのhashCode後に書き換えられ、ユーザーによるアドレスはuser2を計算するための時間ではありません適切な値をとり、だけでなく、比較するのequalsメソッドを呼び出すために、エラーがに類似のhashCodeをオーバーライドしない原因の理由、およびequalsメソッドをオーバーライドしていない、我々は、Objectクラスのequalsメソッドを呼び出すことを余儀なくされ、クラスObjectことになりますこの方法は、直接アドレスメモリを2つのオブジェクトを比較するために等しく、出力結果はヌルです。
今equalsメソッドを書き換えます
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (passed == null) {
if (other.passed != null)
return false;
} else if (!passed.equals(other.passed))
return false;
return true;
}
結果:
输出结果:value1
成功。
概要
上記の分析から、及び場合キー・オブジェクトのタイプは、それに等しいとhashCodeメソッドを書き換える必要がある場合。