アリ「JAVAインターン最新のエントリ試験問題-2019」(シリアル)を説明するための答えで

そして、(継続的に更新され、徐々に改善)をクリアし、完全かつ正確に努め

1、Stringクラスはなぜ最終的です

まず、文字列のソース:

パブリック最終クラス文字列
    にjava.io.Serializable、同等の<string>を実装し、たCharSequence { 
    / **値は文字格納するために使用されます。* / 
    プライベート最終char値[]。
  • クラスは、それが、何のサブクラスを継承することはできませんことを、最終的にキーワードに限定されています。これは、Stringオブジェクトの参照を保持している、それはStringクラスである必要がありますが、別のクラスではありません。
  • 値を格納するために使用され、最終的なキーワードが変更された値は[]、この説明は、他の配列アレイで置き換えることができない - アレイアドレスが変更されないが、配列の各要素の値を変更することができます

クラス外の民間修飾子保証文字列の文字列配列を変更することはできません。外部露出インターフェイスを変更することができないので、文字列の値は、一度作成するので、それを変更することはできません。

  • スレッドセーフ

文字列は(読み取り専用書き込みは不可することができます)不変であるため、複数のスレッドが同じ文字列のインスタンスを共有することができます。

  • 文字列定数プールが大きく、空間効率を向上させることができます

      文字列定数プール、参照     https://segmentfault.com/a/1190000009888357

2、JDK8のHashMapのソース、実装原理基本構造

  紛争解決のHashMapのハッシュは、後者のみがブログを書きます。

  ConcurrentHashMapのロック・セグメントは、メーカーが(最近はお願いしたいとHuawei社の電話インタビューが私に尋ねた)、単にハッシュマップデータはロックする複数のロックの配列、データのロック部です、と言います。

全アレイを用いた以前のロックとは異なり、データセグメントにアクセスすることができる複数のスレッドは、天然の効率が高くなります。戻るだけでブログを書くために、体系的問題を議論しました。

  • ソースノードを初めて目
    静的クラスノード<K、V>実装のMap.Entry <K、V> { 
        最終INT ハッシュ。
        最後のKキー。
        V値。
        ノード<K、V> 次。
 ノード(INTハッシュ、Kキー、Vの値は、ノード<K、V> 次){  this.hash = ハッシュ。this.key = キー。this.value = 値。this.next = 次回。}

   HashMapの  過渡ノード<K、V> [ ]テーブル 格納された値は、リスト・アレイ(アレイ+ハッシュチェイン+赤黒木)は、図の下に記載されるように本質的にハッシュのハッシュ、即ち、最密充填ではない配列です。

HashMapの構造

                              図01

なぜ次のように(新しい要素)ソースコードの断片を置く見るために赤黒木があります。

  他の場合(P instanceofのツリーノード)
                E =((ツリーノード<K、V>)P).putTreeVal(本、タブ、ハッシュ、キー、値)。

次のように定義されたツリーノードのソース・セグメント:

    静的最終的なクラスツリーノード<K、V>延びLinkedHashMap.Entry <K、V> { 
        ツリーノード<K、V>親。//赤黒木リンク
        ツリーノード<K、V> 左。
        ツリーノード<K、V> 右; 
        ツリーノード<K、V> PREV。//削除時に次のリンクを解除するために必要な
        ブール赤。 ツリーノード(INTハッシュ、Kキー、Vヴァル、ノード<K、V> 次){  スーパー(ハッシュ、キー、ヴァル、NEXT)。}

 

  • そして、動的容量拡張
静的最終INT DEFAULT_INITIAL_CAPACITY = 1 << 4。//別名16

デフォルトの容量-16。サイズ変更は、場合newCap = OLDCAP << 1(バイナリー2、左の、すなわち2 *古い二重容量は、容量が2の累乗でなくてもよいです)

  • 新しい要素
    パブリックVプット(Kキー、V値){ 
        putVal(ハッシュ)(キー、キー、値、falseの場合、trueを返します)。
    }

    1)このキーが値を持って前にした場合、操作は新しい値で古い値を置き換えます置きます。

    2)どのように競合ハッシュを解決するために

 ハッシュ(ハッシュ)は、キーであり、保管場所のマッピング関係fがあり、我々は、ハッシュ関数を呼び出します。ハッシュの衝突は、それは、異なるキーは、計算同じハッシュ関数の格納場所、及び素子に係る元のハッシュコードの競合に追加されるので、格納場所は、特定の規則に従って再計算されます。以下に示すような構造通常のHashMap(「1」、赤黒木などのJava HashMapの構造8)。

java8のHashMapの検索効率を向上させるために、競合が閾値よりも大きい、高すぎるリストは、リストはブラックツリーに変換され

  • 荷重係数
静的最終フロートDEFAULT_LOAD_FACTOR = 0.75F。

デフォルトの負荷係数0.75、に関連した確率と統計、参照  http://en.wikipedia.org/wiki/Poisson_distributionを

競合を低減するために、ハッシュマップ場合配列の長さ>閾値は 、焼き直しのすべての要素は、(ハッシュコードを再計算し、保存された)、次いで、拡張後の容器に膨張をトリガすることは、計算、データ検索、メモリコピー、移動、等を含むので操作は非常に時間がかかります。

臨界値=電流容量*現在の負荷率。デフォルトのしきい値 =  DEFAULT_INITIAL_CAPACITY DEFAULT_LOAD_FACTOR * X = 16 0.75 = 12がトリガ拡張操作です。

 

************************************************** ************************************************** *

エネルギーは、あまりにも多くの願望制限され、行に一つのことをやってに焦点を当て

  • 5年間、すべての単語の技術のブログの精査にコードを書き、ゼロコピー元を主張します
  • 合理的な論理行使ブログを意味することは、体系的な運動を書き、知識の理解を深め、そして他の人に少しだけ助けている場合、それはとても幸せなことです

************************************************** ************************************************** *

おすすめ

転載: www.cnblogs.com/NaughtyCat/p/alibaba-java-interview-serial-1.html