原文: http://www.php.cn/
前回のブログ記事 (Java 改善編 (23)-----HashMap) では、HashMap について説明しました。詳細 HashSet の実装プロセスは HashMap に基づいており、最下層は HashMap を使用して要素を保存します。 HashMap に慣れている人であれば、HashSet はとても簡単です!!
public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable
HashSet は AbstractSet クラスを継承し、Set、Cloneable、および Serializable インターフェイスを実装します。その中で、AbstractSet は Set インターフェイスのバックボーン実装を提供するため、このインターフェイスの実装に必要な作業が最小限に抑えられます。 Set インターフェイスは、重複する要素を含まないコレクションであるため、独自の内部順序を維持するため、ランダム アクセスは意味がありません。所属本 基本属性
//基于HashMap实现,底层使用HashMap保存所有元素
private transient HashMap<E,Object> map;
//定义一个Object对象作为HashMap的value
private static final Object PRESENT = new Object();
コンストラクター
りー
見えるねコンストラクターから、HashSet のすべての構造が新しい HashMap を構築します。最後のコンストラクターは、パッケージのアクセス許可に対して公開されず、LinkedHashSet を使用する場合にのみ有効になります。
2. メソッド
/** * 默认构造函数 * 初始化一个空的HashMap,并使用默认初始容量为16和加载因子0.75。 */ public HashSet() { map = new HashMap<>(); } /** * 构造一个包含指定 collection 中的元素的新 set。 */ public HashSet(Collection<? extends E> c) { map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16)); addAll(c); } /** * 构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和指定的加载因子 */ public HashSet(int initialCapacity, float loadFactor) { map = new HashMap<>(initialCapacity, loadFactor); } /** * 构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和默认的加载因子(0.75)。 */ public HashSet(int initialCapacity) { map = new HashMap<>(initialCapacity); } /** * 在API中我没有看到这个构造函数,今天看源码才发现(原来访问权限为包权限,不对外公开的) * 以指定的initialCapacity和loadFactor构造一个新的空链接哈希集合。 * dummy 为标识 该构造函数主要作用是对LinkedHashSet起到一个支持作用 */ HashSet(int initialCapacity, float loadFactor, boolean dummy) { map = new LinkedHashMap<>(initialCapacity, loadFactor); }
iterator() メソッドは、このセット内の要素を反復する反復子を返します。要素が返される順序は特定ではありません。 HashMap の keySet への基礎的な呼び出しはすべてのキーを返します。これは、HashSet 内のすべての要素が HashMap のキーに格納され、値が使用される PRESENT オブジェクト (静的 Final) であることを反映しています。
public Iterator<E> iterator() { return map.keySet().iterator(); }
size() は、このセット内の要素の数 (セットの容量) を返します。最下層は HashMap の size メソッドを呼び出し、HashMap コンテナのサイズを返します。
public int size() { return map.size(); }
isEmpty() は、HashSet() セットが空かどうかを判断し、空の場合は true を返し、そうでない場合は false
を返します。public boolean isEmpty() {
return map.isEmpty();
}
Contains() は、HashSet() に要素が存在するかどうかを判断し、存在する場合は true を返し、存在しない場合は false を返します。より正確には、true を返すにはこの関係が満たされる必要があります: (o==null ? e==null : o.equals(e))。最下層は containsKey を呼び出して、HashMap のキー値が空かどうかを判断します。
public boolean contains(Object o) {
return map.containsKey(o);
}
add() このセットに指定された要素がまだ含まれていない場合は、指定された要素を追加します。この Set に (e==null ? e2==null : e.equals(e2)) を満たす e2 が含まれていない場合、e2 が Set に追加されます。それ以外の場合は追加されず、false が返されます。最下層は HashMap の put メソッドを使用して key = e、value = PRESENT をキーと値のペアに構築するため、HashMap のキーに e が存在する場合、値は元の値を上書きしますが、キーは変更されません。既存の e 要素が HashSet に追加された場合、新しく追加された要素は HashMap に保存されないため、HashSet 内の要素が繰り返されないという機能が満たされます。
public boolean add(E e) { return map.put(e, PRESENT)==null; }
mRemove 指定された要素がこのセットに存在する場合、それが削除されます。最下層は、HashMap の Remove メソッドを使用して、指定された Entry を削除します。 clear从此 set 中移除所有元素。底层调用HashMap的clear方法清除所有的Entry。 clone返回此 HashSet 实例的浅表副本:并没有复制这些元素本身。 后记: 由于HashSet底层使用了HashMap实现,使其的实现过程变得非常简单,如果你对HashMap比较了解,那么HashSet简直是小菜一碟。有两个方法对HashMap和HashSet而言是非常重要的,下篇将详细讲解hashcode和equals。 ---------------------------------------------------------------------------------------------------------
以上就是java提高篇(二四)-----HashSet的内容,更多相关内容请关注PHP中文网(www.php.cn)!public void clear() {
map.clear();
}
public Object clone() {
try {
HashSet<E> newSet = (HashSet<E>) super.clone();
newSet.map = (HashMap<E, Object>) map.clone();
return newSet;
} catch (CloneNotSupportedException e) {
throw new InternalError();
}
}