ホームページ  >  記事  >  Java  >  Java 改良章 (24)-----HashSet

Java 改良章 (24)-----HashSet

黄舟
黄舟オリジナル
2017-02-10 14:23:421152ブラウズ

原文: http://www.php.cn/

前回のブログ記事 (Java 改善編 (23)-----HashMap) では、HashMap について説明しました。詳細 HashSet の実装プロセスは HashMap に基づいており、最下層は HashMap を使用して要素を保存します。 HashMap に慣れている人であれば、HashSet はとても簡単です!!

1. 定義


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();
E



コンストラクター


りー



見えるねコンストラクターから、HashSet のすべての構造が新しい HashMap を構築します。最後のコンストラクターは、パッケージのアクセス許可に対して公開されず、LinkedHashSet を使用する場合にのみ有効になります。

2. メソッド

HashSet は HashMap に基づいているため、HashSet のメソッドの実装プロセスは非常に簡単です。

/**
         * 默认构造函数
         * 初始化一个空的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 を削除します。

public void clear() {
        map.clear();
    }

          clear从此 set 中移除所有元素。底层调用HashMap的clear方法清除所有的Entry。

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();
        }
    }

          clone返回此 HashSet 实例的浅表副本:并没有复制这些元素本身。

          后记:

          由于HashSet底层使用了HashMap实现,使其的实现过程变得非常简单,如果你对HashMap比较了解,那么HashSet简直是小菜一碟。有两个方法对HashMap和HashSet而言是非常重要的,下篇将详细讲解hashcode和equals。

---------------------------------------------------------------------------------------------------------

以上就是java提高篇(二四)-----HashSet的内容,更多相关内容请关注PHP中文网(www.php.cn)!



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。