JDK9.0 HashSetソースリードレコード
8296 ワード
Setは同じ要素を含むことを許さず,2つの同じ要素を同じ集合に追加しようとするとaddメソッドはfalseを返す.
以下、HashMapに要素を追加する際の検出である、判定対象が同一であるか否かを判定するhashが等しいか否かを判定し、==またはequalsがtrueである.追加するオブジェクトがequalsを書き換えていない場合、それは依然として==で判断する.
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
public boolean equals(Object obj) {
return (this == obj);
}
HashMapのkeyは重複を許さず、HashSetはこの特性に依存してその要素値が重複しない機能を実現するものであり、HashMapに基づいて実現され、データの操作に対してHashMapを呼び出す関連方法である.具体的なHashMapの実現原理はJava 9を見ることができる.0 HashMapソース読み取り記録.
継承システム
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
プライベート属性
HashSetは2つのプライベート属性しかなく、1つはHashMapタイプである.HashSetはHashMapに基づいて実現されるからである.1つはfinal Objectタイプであり、追加操作を実行する際にvalueはすべてこのオブジェクトであり、keyはユーザが追加するデータである.
private transient HashMap map;
private static final Object PRESENT = new Object();
コンストラクタ
既定のパラメータを使用してHashMapオブジェクトを作成する
public HashSet() {
map = new HashMap<>();
}
初期容量を指定します.ここでは、集合要素の追加時に拡張が発生するのを避けるため、HashMapのデフォルトのロードファクタは0.75です(c.size()/.75f)+1は、最後の要素の追加時に拡張が行われないことを保証します.
public HashSet(Collection extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
初期容量とロードファクタの指定
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
ロードファクタの指定
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
初期容量とロードファクタを指定します.無視できます.ここではLinkedHashMapを作成します.
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
要素の追加
HashMapのput(メソッド、keyはユーザが追加するデータ、valueは同じオブジェクトである.
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
要素の除去
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
その他の方法
取得要素数
public int size() {
return map.size();
}
空かどうかを検出
public boolean isEmpty() {
return map.isEmpty();
}
オブジェクトが含まれているかどうかを検出
public boolean contains(Object o) {
return map.containsKey(o);
}
すべての要素をクリア
public void clear() {
map.clear();
}
反復器
我々はデータをkey方式で追加するので、反復器が得たのもkeyの反復器である.
public Iterator iterator() {
return map.keySet().iterator();
}
≪インスタンス|Instance|emdw≫
クラスを作成
class Student{
private String name;
public Student(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
テスト
HashSet hashSet = new HashSet();
// 1
Student student1 = new Student("LiNing");
hashSet.add(student1);
// 2
Student student2 = new Student("zhanggang");
hashSet.add(student2);
System.out.println("foreach ");
for(Student stu:hashSet) {
System.out.println(stu.getName());
}
System.out.println(" ");
Iterator iterator = hashSet.iterator();
while (iterator.hasNext()) {
System.out.println(((Student)iterator.next()).getName());
}
しゅつりょく
foreach
LiNing
zhanggang
LiNing
zhanggang
関連記事
JDK9.0 ArrayListソースコードリードレコードJDK 9.0 LinkedListソースリードレコードArrayListとLinkedListの性能比較JDK 9.0 Vectorソース読解記録JDK 9.0 Hashtableソース読解記録Java 9.0 HashMapソース読解記録JDK 9.0 HashSetソースリードレコード