基本的な研究ノートのコレクション
リストインターフェース
保存されたオブジェクトは順番に並べられ、繰り返し可能です
配列リスト
配列のようなオブジェクトを格納します。オブジェクトを追加または削除するたびに新しい配列を作成する必要があります。これは、複数のクエリに適しています。
根底にある原則
構築方法:空の配列を構築し、パラメーターを渡した後、デフォルトサイズが10のオブジェクト配列を構築します
追加:配列のサイズを超えない場合は、追加します
以上、拡張拡張メソッドを入力します
public boolean add(E e) {
//ensureCapacityInternal在新版本不再使用
ensureCapacityInternal(size + 1);
elementData[size++] = e;
return true;
}
まず、1.5倍アレイサイズ(ビット単位操作)と受信サイズを比較する両者の大きな値を取得し、
その後、設定された最大配列長(Integer.MAX_VALUEの-8)と大きな値を比較する。
それは超えていない場合、より大きな値で配列を作成し、元の配列をコピーします
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
を超える場合は、大容量の処理を実行します。
着信サイズを最大配列長と比較し、大きい場合はINTEGER.MAX_VALUE長の配列を作成し、小さい場合は最大配列長の配列を作成します。
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0)
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
削除:データを削除し、次の番号を前方に移動します
LinkedList
複数の追加と削除に適した、リンクリストのようなオブジェクトを保存します
ベクター
リストの古代の実装クラス、スレッドセーフ
コレクションコレクショントラバーサル
1.イテレータ。
2.使用するforeachはコレクションをトラバースします。あなたがデータを変更することはできません。あなたが唯一のクエリ。できる
3. forEachのメソッド。
。イテレータのforEachRemainingメソッドを使用して
、コレクションのforEachのメソッドを使用します。
両方とも持っています機能インターフェイスであり、Lambda式で使用されます。
RandomAccessインターフェース
インターフェイスには属性やメソッドはなく、ロゴだけがあります
接続されている場合、このタイプはランダムアクセスをサポートし、配列のようにデータを検索できることを意味します。
接続されていない場合、このタイプのデータはランダムアクセスをサポートしておらず、データを検索できるのはリンクリスト。
インターフェースの設定
保存されたオブジェクトは無秩序であり、繰り返すことはできません
HashSet
保存にはハッシュアルゴリズムを使用します。入力オブジェクトのアドレスが計算された後、空の場合は直接保存され、空でない場合は保存できません。
TreeSet
赤黒木を使用して保管し、
並べ替えができるようにします。並べ替えは、自然並べ替え、カスタム並べ替えに分けられます。
仕分けの原則
自然順
ストレージオブジェクトクラスを構築するときは、Comparableインターフェイスを実装し、compareToメソッドを書き直し、コレクション内のaddメソッドを使用して自動的に並べ替えます
ソートを選択
コレクションオブジェクトを定義するときは、カスタムコンパレータCompartorを渡し、コンパレータにcompareメソッドを実装し、コレクションでaddメソッドを使用して自動的に並べ替える必要があります。
マップインターフェイス
キーと値のペアを格納する
HashMap
保存にはハッシュアルゴリズムを使用します。入力オブジェクトがアドレスを計算した後、空の場合は直接保存されます。空でない場合は、ハッシュの競合と見なされます。
LinkedHashSet
リンクリストを使用してデータを保存する
根底にある原則
基本属性
しきい値:8、リンクリストの長さが8を超えている場合、拡張するには、配列の長さが64以上の場合、リンクリストは赤黒木に変換されます。
最大容量:2の30乗
フィルファクター:0.75、ストレージノードがアレイサイズにフィルファクターを掛けた値を超えると拡張が開始されます。
デフォルトサイズ:16、初めて構築されるアレイのサイズ
ハッシュテーブルに保存されているもの
ストアノードノード、ノードはエントリインターフェイスを実装するため、ハッシュテーブルはキーと値のペアを返すことができます。
ハッシュテーブルはノードノードを格納するための連続メモリスペースを開きます。つまり、Node []
はノードとTreeNodeのリンクリストを格納できます。と赤黒の木
ハッシュの競合を解決する方法
1.リンクリスト方式
2.開発アドレス方式、線形アドレス指定、二次アドレス指定
3、再ハッシュ
4、ドメイン構築方式
ソースコード
ハッシュ:ハッシュコードとハッシュコードのバイナリは右に16ビットシフトします
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
put:putValメソッドを呼び出す
putVal:
サイズが空または0の場合、resizeメソッドを呼び出して展開します
ハッシュを呼び出してハッシュ値を計算し、アドレスが空の場合は挿入します
キー値が同じ場合は交換してください
リンクリストまたは赤黒木を検索し、キー値が同じである場合は置き換えます
リンクリストの長さが8より大きい場合は、最後まで挿入して、赤黒木に変換してみてください
配列の長さと曲線因子によって容量をサイズ変更または拡張する必要があるかどうかを判断します
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
boolean evict) {
Node<K,V>[] tab; Node<K,V> p; int n, i;
if ((tab = table) == null || (n = tab.length) == 0)
n = (tab = resize()).length;
if ((p = tab[i = (n - 1) & hash]) == null)
tab[i] = newNode(hash, key, value, null);
else {
Node<K,V> e; K k;
if (p.hash == hash &&
((k = p.key) == key || (key != null && key.equals(k))))
e = p;
else if (p instanceof TreeNode)
e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
else {
for (int binCount = 0; ; ++binCount) {
if ((e = p.next) == null) {
p.next = newNode(hash, key, value, null);
if (binCount >= TREEIFY_THRESHOLD - 1)
treeifyBin(tab, hash);
break;
}
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
break;
p = e;
}
}
if (e != null) {
V oldValue = e.value;
if (!onlyIfAbsent || oldValue == null)
e.value = value;
afterNodeAccess(e);
return oldValue;
}
}
++modCount;
if (++size > threshold)
resize();
afterNodeInsertion(evict);
return null;
}
サイズ変更:拡張メカニズム
treeifyBin:赤黒木へのリンクリスト
赤黒木
赤黒木は、次の特性を満たす高度にバランスの取れた二分探索木です。
1.ルートノードとリーフノードは両方とも黒です
。2 。赤ノードの子ノードはすべて黒です
。3 。各ノードからリーフノードへのパスには、同じ数の黒ノードが含まれています。
赤黒木は、追加および削除するときに赤黒木の性質を維持するために、左利き、右利き、および変色に依存しています。
TreeMap
赤黒木を使用してキーと値のペアを格納します
ハッシュ表
スレッドセーフを確保するためにsynchronizedキーワードを使用する
ConcurrentHashMap
以前:スレッドセーフを確保するためにセグメント化されたロック+同期を使用する
現在:配列+リンクリスト/赤黒バイナリツリー、CASを使用し、スレッドセーフを確保するために同期
マップコレクションの走査
1.コレクション自体のforEachメソッド
2.マップには、セットコレクションを返す独自のメソッドがあります。これは、コレクションコレクショントラバーサル
keySet、valueSet、entrySet
3、forループトラバーサル
4、イテレーターのメソッドでトラバースできます。