この記事では、Java コレクション クラス Hashmap について詳しく説明します (コード例)。必要な方は参考にしてください。助けてくれた。
1. HashMap の概要
HashMap は、プログラマーの開発プロセスで非常に一般的に使用されるコレクション クラスであり、キーと値のペアの形式で存在します。
#開発では、キーが存在する場合にキーを置き換える機能を利用して、更新された重複排除操作を実装できます。 もう 1 つの便利な方法として、map と fastJson を使用して、必要な json データ形式をすばやく形成できます。 jdk1.8以前では、HashMapは配列連結リストの形式で存在しており、putキーのhashCodeを摂動関数で計算してハッシュ値を求め、その値を(n-)で計算していました。 1)&hash。対応する位置に移動します (n は配列の長さを表します)。ハッシュの競合が発生した場合は、まずキーが存在するかどうかを確認し、存在する場合は上書きします。そうでない場合は、「」を使用します。ジッパー メソッド」を使用して競合を解決し、リンク リストを作成します。 しかし、jdk1.8 以降、HashMap は変更されました。現在のリンク リストの長さがしきい値 (デフォルトは 8) より大きい場合、リンク リストは赤黒ツリーに変換されます。検索を高速化します。2. HashMap 属性
//HashMap のデフォルトの初期容量は 2^4=16 static Final int DEFAULT_INITIAL_CAPACITY = 1 << // 別名 16
の最大容量 = 1 <<
の場合です static Final float DEFAULT_LOAD_FACTOR = 0.75f;
static Final int TREEIFY_THRESHOLD = 8;
staticfinal int UTREEIFY_THRESHOLD = 6;
staticfinal int MIN_TREEIFY_CAPACITY = 64;
transient Node
transient Set
transient int size;
transient int modCount;
size が
threshold 以上の場合、拡張メカニズムは必ずしもトリガーされませんが、ほとんどの場合、拡張メカニズムはトリガーされます)新しく作成された
Entry でハッシュの競合が発生した場合は、直ちに
resize)
int Threshold;
Final floatloadFactor;
public HashMap(int initialCapacity, float loadFactor) { if (initialCapacity < 0) throw new IllegalArgumentException("Illegal initial capacity: " + initialCapacity); if (initialCapacity > MAXIMUM_CAPACITY) initialCapacity = MAXIMUM_CAPACITY; if (loadFactor <= 0 || Float.isNaN(loadFactor)) throw new IllegalArgumentException("Illegal load factor: " + loadFactor); this.loadFactor = loadFactor; this.threshold = tableSizeFor(initialCapacity); }
static final int tableSizeFor(int cap) { int n = cap - 1; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16; return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1; }
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) // -1 for 1st treeifyBin(tab, hash); break; } if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) break; p = e; } } if (e != null) { // existing mapping for key V oldValue = e.value; if (!onlyIfAbsent || oldValue == null) e.value = value; afterNodeAccess(e); return oldValue; } } ++modCount; if (++size > threshold) resize(); afterNodeInsertion(evict); return null; }
学生 ID | |
1 | |
2 | |
3 | |
4 |