set集合のhashsetはなぜ無秩序なのですか?

1760 ワード


ここで私はSetが無秩序だとは言っていません.結局、親setの集合が無秩序だとは言っていません.間違っています.ここではあまり言わないでください.ただ、Setの親の下にはhashSet、TreeSetなどの多くのサブクラスが含まれていますが、treesetは秩序です.
ブログの文章のテーマに戻って、どうしてshはHashSetが無秩序だと言ったのですか?
まずソース解析を見てみましょう.
一、hashsetインスタンス化オブジェクトの作成
Set set = new HashSet();
set.add("hello");
set.add("hello");// 
set.add("java");
set.add("world");
System.out.println(set);//[java, world, hello]

二、ソースコードの表示
1、ソースクラスヘッダ構造
public class HashSet
    extends AbstractSet
    implements Set, Cloneable, java.io.Serializable

2.HashSet集合の主要メンバー変数
    private transient HashMap map;

    // Dummy value to associate with an Object in the backing Map
    private static final Object PRESENT = new Object();

    /**
     * Constructs a new, empty set; the backing HashMap instance has
     * default initial capacity (16) and load factor (0.75).
     */
    public HashSet() {
        map = new HashMap<>();
    }

hashmapソース分析. 
3、HashSetセットにデータを追加する
    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

三、HashMapのput追加データ方式を見る
    public V put(K key, V value) {
        return putVal(hash(key), key, value, false, true);
    }

四、総括分析
以前に分析したhashmapデータに追加されたソースコードにより、次のことがわかります.
1.HashSet集合操作は、データ値をHashMapのkeyに格納する.
2、hsahmapは、データを保存する際、keyのhash値と現在の配列長を計算する&演算の順で、保存データの下付き位置を計算します.だからsetは必要ありません.
3、データを保存するたびに、共通の値が格納されます.
private static final Object PRESENT = new Object();

keyのhashと配列サイズ&計算された値が配列に存在する場合、新しい値の上書きが行われるため、setは重複しない.