HashSet下地実装原理
1367 ワード
HashSetの下位層ではハッシュテーブルを用いてサポートされているが,早くHasetに要素を追加した場合,HashSetはまず要素のhashCodeメソッドを呼び出して要素のハッシュ値を得,その後要素のハッシュ値がシフトなどの演算を経てハッシュテーブルにおけるその要素の格納位置を算出することができるという特徴がある.1.算出された要素の格納場所に現在の要素の格納がない場合、その要素はその場所に直接格納することができる.算出された要素の格納場所に他の要素が既に存在する場合は、その要素のequalsメソッドを呼び出してその位置の要素ともう一度比較し、equalsメソッドがtrueを返す場合は、その位置の要素は重複要素とみなされ、追加は許されず、falseを返す場合は追加、
class Person {
String name;
int age;
private void Peron() {
// TODO Auto-generated method stub
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public int hashCode() {
System.out.println("--------");
// TODO Auto-generated method stub
return this.age;
}
@Override
public boolean equals(Object obj) {
System.out.println("---****----");
Person p = (Person)obj;
return this.age == p.age;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "{ :"+name+" :"+age+"}";
}
}
public class Demo2 {
public static void main(String[] args) {
HashSet set = new HashSet();
set.add(new Person("yy",18));
set.add(new Person("xx",19));
set.add(new Person("zz",20));
set.add(new Person("jj",25));
System.out.println(" ?"+set.add(new Person("zhangsan",18)));
System.out.println(" :"+set);
}
}