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は重複しない.