HashMapの解決の共通のインタビューの質問

データ構造の基礎となるHashMapの?

赤黒木のアレイ+リスト、リスト+ +配列

HashMapのアクセス原則?

ハッシュの衝突が発生した場合、バケットの位置を与えるために、ハッシュ値と配列の長さから1を引いたビットAND演算(N-1&ハッシュ)を変更することにより、オブジェクトのキーオブジェクトハッシュコードのハッシュ値を求めることにより算出し、場合に古いキー値の値としては、リストの長さは、次に赤黒木に変換以上8、でない場合、同じ値が新しいリストノードは、格納され、置き換えられます。

Java7とJava8違いは?

jdk1.8の前にオブジェクトを作成し、それは鍵データを記憶するためのエントリ16 []テーブルの長さを作成します。ないときは、コンストラクタでjdk1.8を作成した後、しかし、場合にのみ、ノード[]テーブルを作成する方法を置くために最初の呼び出しを作成し、リストのjava7に追加

転送の拡張後リストの順序反転、転送プロセス内のノードの元のリストとの関係への参照を変更するためにマルチスレッド動作ハッシュマップは、無限ループを引き起こす可能性がJava7。

なぜ、スレッドセーフではないのだろうか?

転送の拡張後リストの順序反転、転送プロセス内のノードの元のリストとの関係への参照を変更するためにマルチスレッド動作ハッシュマップは、無限ループを引き起こす可能性がJava7。

Java8は同じ前提で無限ループ原因、理由は、基準ノードの関係は前に維持し、リストの転送順序の拡大前後で同じであることはありません。

しかし、たとえそうでない場合は、無限ループが、プットを参照するにはソースコードを/メソッドは同期ロックは、マルチスレッドの状況が最も可能性が高いが発生することです追加していない取得:最後の二プットの値は、次の二時間を保証するか、元の値を取得できませんそのスレッドの安全性は保証されません。

HashMapのは、リサイズ(拡大)操作でハッシュ値を再計算します、サイズ変更操作時間は、スレッドが安全ではない原因になります。次のような場所では、2つのスレッドが安全ではない表示される場合があります提供します。

1、生じたマルチスレッドデータの不整合の時間を置きます。
この問題は、より良好な、例えば二つのスレッドA及びBは、最初のインデックスは、バケットに分類するために、第1の記録算出ハッシュマップのキーと値のペアを挿入することが望ましい座標、次いで浴槽接合内部リストヘッドを得ることがあり、想像されますポイントは、このタイムスライスのスレッドで、スレッドBはスレッド挿入された記録計算浴槽を仮定すると、実行される予定の、スレッドAとして実行、正常槽の内部に記録されたスレッド以外Bされ、その時点で、なくなっインデックスとスレッドBのレコードが挿入されるバケットインデックスは、それはまだ期限切れのリストの頭を保持しているが、それについて何も知らなかった、再び実行するようにスケジュールされたスレッド、同じ、そして成功したスレッドBの後に挿入から計算されますスレッドBは、一貫性のないデータの挙動が得られ、突然消えるためにレコードを挿入するので、それはそれはそうすべきと考えていることを、この方法は、それは、スレッドB挿入されたレコードをカバーしています。

2、別の明白な疑問は、リサイズ(CPU100%)、現象リンクリスト循環参照(JDK7)であるため、get操作が無限ループを引き起こす可能性があり、スレッドセーフのHashMapであります

代わりのスレッドセーフなクラスとは何ですか?

currentHashMap以及ハッシュテーブル

デフォルトの初期サイズ?なぜそんなに多くはありますか?なぜサイズが2のべき乗でありますか?

デフォルトのサイズは、バケットバケット配列の初期設定は、あまりにも、メモリ空間の無駄になる場合の理由は、これである初期化16で、16は妥協の大きさではありません、どちらも、このような1,2,3-拡張など、いくつかの要素の上に置きました廃棄物の多くを引き起こすように、また、数万人のようなあなただけのスペースを少し使用することができませんでした。

サイズは、バケット位置のバケットを計算するとき、式((N-1)・ハッシュ)であり、2進数で2マイナス1の電源の終了は、ハッシュ値の計算と、1である2のべき乗であります、あなたは数の残りの部分を取得します。ビット単位のAND演算の結果であれば、オブジェクトの我々ハッシュハッシュ値として十分に生成するために、いくつかのハッシュ値の最後にあるオブジェクトの残りの値となるよう

メモリ効率は、衝突を最小限に抑える、より均一を求め((N-1)・ハッシュ)インデックス

配列の長さは2 n個の電力であります

配列の長さは2の累乗でない場合、nは

HashMapの拡張モード?負荷率はどのくらいですか?なぜそんなに多くはありますか?

負荷係数は、0.75の代わりに1に設定された設定が大きすぎるため、より大きなバケット位置との衝突バケットの可能性の鍵となる時間を検索増加する、いくつかの値の値を格納することができる、パフォーマンスの低下、それが0.1であれば10バレル、しきい値1その後、小さすぎず、適切な設定は、次の2つのキーと値のペアの拡大、スペースの無駄を置く必要があります。

HashMapのの主なパラメータは何ですか?

    //默认的map大小,为2的n次幂
    static final int DEFAULT_INITIAL_CAPACITY(默认初始容量) = 1 << 4; // aka 16

   // 最大容量,指定的值超过 2的30次幂,默认使用这个值
    static final int MAXIMUM_CAPACITY (最大容量)= 1 << 30;

   //在构造函数中没有指定时使用的负载因子
    static final float DEFAULT_LOAD_FACTOR = 0.75f;

   //当链表长度为8时,使用以红黑树代替链表,红黑树的结点是链表长度的两倍,当比较短的时候,使用红黑树的效率其实并不高,根据泊松分布公式的统计结果,在结点数达到8时,适合使用红黑树
    static final int TREEIFY_THRESHOLD(恐吓的阈值) = 8;
  
// 红黑树转为链表的阈值
    static final int UNTREEIFY_THRESHOLD (非恐吓的阈值)= 6;

//链表转红黑树时数组的大小的阈值,即数组大小大于这个数字时且链表长度大于8才会转为红黑树,
//在数组长度小于64,不会转,而是进行扩容
    static final int MIN_TREEIFY_CAPACITY = 64(小的恐吓容量);

HashMapのは、ハッシュ衝突に対処する方法ですか?

同じキーであれば、ほとんどの最小値に対応するコンテンツ鍵を交換する、しない同じキー、リストの後ろに、8の鎖長の長さであれば、アレイが64よりも大きい達し、次いで、リンクされたリスト赤黒木に、アレイもし以下64以上、膨張が行われます

ハッシュ計算ルール?

オブジェクトのハッシュコード()メソッドは、ハッシュ値、16ビットの符号なし右シフトを返し、XOR演算ビット単位元のハッシュ値と、目的は、低及び高の16ビットの16ビットは、ハッシュに排他的OR行われ、十分なハッシュに値を返します

以下のように取得プロセスに入れ、指数計算は、まず、ハッシュ演算ハッシュコードを実行し、さらに標準によってハッシュ値を計算します。

2のn乗を入力しない、初期値を解決する方法

    /**
     * Returns a power of two size for the given target capacity.
     */
    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;
    }

目的:バイナリ値、左から右に、開始の最初の発生は、右側のすべての値は、一年生のほとんど番号2の電流値よりもn乗を見つけることが可能になって、1となっています

N >>> 16、32ビットはビット単位を行うOR有することどの手段を実行、A

おすすめ

転載: www.cnblogs.com/chenhanhao/p/12469796.html