2年前にJavaでJingdongに行ったとき、私は亡くなりました。私と大きな工場のプログラマーの違いは何ですか?

序文:

BATJなどのインターネット企業の高い給与と福利厚生は、多くのエンジニアの参加を呼び込んでおり、インタビューの難しさも増しています。クラスメートが私に尋ねたのは昨日ではなく、私が先週JDに面接のために行ったとき、私は面接を通過せず、非常にショックを受けたと言った。丁寧に話し合ったところ、まだ技術力が足りておらず、知識も少ないとのことで、今回は損はしておらず、経験も非常に良いとのことでした。彼のインタビューによれば、質疑応答を整理していきたいと思います。

ここに画像の説明を挿入

TreeSet / HashSetの違い

名前が示すように、1つ目は
構造1の違いです。TreeSetの背後にある構造は、自動ソートを実現できる赤黒木であるTreeMapです。equalsメソッドまたはcompareToメソッドを使用してコンテンツを比較します。
2. HashSetの背後にはHashMapがあり、キーは順序付けされておらず、外部でのみソートできます。これはハッシュであるため、オブジェクトのhashCodeメソッドとequalsメソッドを書き換える必要があります。
さらに、bのインストールに使用できる微妙な違いがあり
ます。1。HashSetはnull値を受け入れることができ、1つしかあり
ません。2。TreeSetはデフォルトでnullを受け入れることができません。値は、nullポインタ例外を直接スローします。セットに重複データはなく、TreeSetには何もありません。

さらに、20年以上の企業インタビューのナレッジポイントと、さまざまなJavaコアナレッジポイントをまとめて収集し、無料で共有しています。以下は、ほんの一部のスクリーンショットです。情報が必要な場合は、795983544をクリックてシークレットコードCSDN 受け取ることもできます

ここに画像の説明を挿入

HashMapはどのように競合を解決し、その容量を拡張するのですか?

お粗末な通りでの質問、どんな質問にも答えてください。そんなものが背もたれです。
HashMapの内部構造は、実際には配列+リンクリストです(java8以降、長さが8より大きい場合、赤黒ツリーに変換されます)。HashMapが初期化されると、デフォルトで16個のハッシュスロットがあります。
オブジェクトを保存するときは、まず、オブジェクトのhashCodeからハッシュスロットを見つけます。複数のオブジェクトが同じスロットに同時に入る場合、リンクリストを使用してこのスロットの競合を解決します。
HashMapが作成されると、負荷係数が発生します。各put操作は、現在の容量がしきい値(initailCapacity * loadFactor)を超えるかどうかを確認します。それを超えると、拡張は現在の容量の2倍になります。拡張後、データを再度ハッシュする必要があります。これは転送方法です。

経験:サイズ変更には非常に時間がかかるため、容量を事前に見積もることができる場合は、initailCapacityを事前に修正できます。
ここに画像の説明を挿入

ConcurrentHashMapはどのようにして高い並行性を実現しますか

簡単に言えば、セグメント化されたロック(分離ロック)が使用されます。各ロックは、コンテナー内のデータの一部をロックするために使用され、スレッド間のロックの競合を減らします。
この質問は、奥深く尋ねると致命的です。スペースには制限があり、長続きしません。

スレッドプールの通常の使用方法

通常のシーンは、ファクトリクラスのExecutorを使用して作成できます。一般的に使用されるのは、シングル、固定、キャッシュの3つです。
多くの場合、より細かい制御のために、ThreadPoolExecutorクラスが直接カスタマイズされます。Aliの仕様もこれを必要としています(もちろん、リックです)。私は特に、ブロッキングキューと飽和戦略について心配しています。
もちろん、ブロックキューと拒否戦略に精通している場合にのみ言えるでしょう。そうでなければ、自分で穴を掘るのは賢すぎて、Aliの標準について言及してほしいので、jdkの設計は非常に低いと思います。

複数のスレッドが特定のノードまで待機してから均一に解放する方法はいくつありますか?

最も古典的なのはCountDownLatchで、メインスレッドはawaitメソッドでブロックされ、各スレッドはcountDownを呼び出します。いくつかの古典的な競馬問題を解決できます。
CyclicBarrierと呼ばれるバリアントもあります。各スレッドはawaitメソッドでブロックされ、特定のしきい値に達するとまとめて解放されます。Threadのjoinメソッドなど、より基本的なAPIを使用することもできます。Futureのgetメソッドなど Complexは推奨されません。睡眠に答えることもできます。問題はありますか?whileを使用して変数を待つことができますが、なぜこれを行う必要があるのですか?

データベースのインデックス構造

B +ツリー、遅いディスクに適応するために生まれたインデックス構造。インデックスの左端のプレフィックスに従ってクエリを実行する必要があります。
HashはHashMapに似ており、競合に対処する方法は、リンクリスト
pgのインデックス構造が追加されることです。Mysqlが少ないのになぜ変な感じがするのですか?ストレージエンジンの違いに答える必要がありますか?

select * from t where a =?and b>?order by c limit 0,100インデックスを追加する方法

これが結論であることがわかった場合=> order byフィールドがwhere条件に表示される場合、インデックスはソートせずに使用されます。それ以外の場合、order byはソートされません。
左端の原則に従って、(a、b)のインデックスを作成できます。
クラスタ化インデックスと非クラスタ化インデックスとは
テーブルには、クラスタ化インデックスを 1つだけ含めることができます。メインインデックスファイルとデータファイルは同じファイルであり、デフォルトのInnoDBはクラスター化インデックスをサポートし、B +ツリーのリーフノード上のデータはデータそのものです。MyISAMはクラスター化インデックスをサポートせず、そのリーフノードにはデータ自体ではなく、データが格納されているアドレスが格納されます。ファイル構造では、インデックスファイルとデータファイルに分かれています。プログラミングには役に立たない。

楽観的ロックと悲観的ロックについて説明する

悲観的ロックは常に最悪の状況を想定しています。データを操作するたびに、他の人がデータを変更すると考えているため、データをロックして安全性を確保できます。後ろの訪問者は待つことができるだけです。行ロック、データベースのテーブルロック、Javaの同期キーワードなどはすべて悲観的ロックです。
オプティミスティックロックはその逆であり、データをロックせずに追加の判断操作を行うことで、常に最良の状況を想定します。たとえば、並行パッケージ内の多数のCAS操作、新旧のバージョン番号を判別するメカニズムなど。悲観的ロックは妻であり、あなたは1人だけです;楽観的ロックは友人であり、予約によって計画します...

動的プロキシを実装する方法?CgLibとjdkプロキシの違いは何ですか?

JavaはInvocationHandlerインターフェイスを実装して動的プロキシを実装し、Proxyを使用してそれを初期化します。
CglibはASM自体を使用して、通常のクラスをプロキシできるが最終クラスはプロキシできないフレームワークを生成し、jdkはインターフェースのみをプロキシできます。春には、cglibが勝利します。

分散ロックの主流の実装は何ですか?redisロックとzkロックの違いは何ですか?

大きく2つのカテゴリーに分かれます。
楽観的ロック:バージョン番号メカニズムとCAS実装に基づいて、バージョン番号の格納とは何の関係もありません。
悲観的ロック:

  1. データベースレコードに基づいて、入力時にデータを書き込み、終了時にレコードを削除します
  2. 分散型クォーツなどのデータベース行ロック、それは排他ロックです
  3. Redisに基づくSetnx関数(ほとんどはタイムアウトを設定するため、pxでset atomic関数を使用することをお勧めします)
  4. 飼育係に基づく

違い:
Redisはラウンドロビンメカニズムによってロックを取得します。ロックが解除された後、複数の呼び出し元が競合し、一部のタスクが餓死する可能性があります。
zkは監視メカニズムであり、変更があった場合に通知されます。不当なロックに加えて、公平なロックも実装できます。
エレガントさの点では、redisが勝つことは明らかです

ThreadLocalの機能は何ですか?使用方法について話しましょう

ThreadLocalは、データを分離するために使用されます。
ThreadLocalはスレッド関連のデータを格納し、最下層は実際にはマップであり、データを格納するためのマップはスレッドを介して取得できます。
このメソッドは、サーブレットのリクエストに似ています。一部のスレッド統計など、スレッドにバインドする必要がある一部のデータをここに配置できます。これはスレッド同期方式と言われていますが、明らかにロックフリーです。

スパイクシステムを設計する際に考慮すべき点は何ですか?

  1. データのウォームアップスパイクはすべて瞬時の操作であり、データをロードする前にトラフィックが来るのを待たないでください。データは、キャッシュにロードするなど、事前にウォームアップできます。
  2. キャッシュには、CDNキャッシュとデータキャッシュが含まれます。キャッシュシステムの高可用性を確保すると、データが到着します。
  3. MQを導入して、売られすぎを解消し、オペレーションインベントリをシリアル化し、しきい値に達した後に消費を停止し、購入機能を閉じます。または、キャッシュを直接操作します。
  4. トラフィックのピークカットMQの導入により、時間のかかるサービスがピークカットされ、ユーザーのニーズにスムーズに対応できます。
  5. ヒューズ、電流制限、ヒューズは、主要なビジネスを確保することを優先します。フローを制限し、異常なトラフィックを特定してブロックすると同時に、一部のリクエストが失敗することを許可します。
  6. システムの負荷が限界に達していると判断された場合、サーバーを追加することにより、弾性膨張はピーク値に抵抗できます。運用・保守環境を迅速に拡大できるように開放する必要があります。

総括する:

インターネットの巨人が好む才能の特徴:テクノロジーへの熱意、強力な技術的基盤の強さ、イニシアチブ、チームワークが得意、要約と思考が得意。それがどの会社であっても、同時実行性と可用性の高いテクノロジーと基盤は非常に重要であるため、知識を過小評価しないでください。面接は双方向の選考プロセスですので、自分のパフォーマンスにつながらない恐ろしい態度で面接をしないでください。同時に、給料だけでなく、この会社が本当に好きかどうか、本当に運動できるかどうかも検討する必要があります。実際、私は多くのことを書きましたが、私自身の要約は、必ずしもすべての人に当てはまるわけではありません。いくつかのインタビューの後、誰もがこれらの感情を持つことになると思います。

また、インタビューに回答したい場合は、795983544シークレットコードCSDNをクリックしてご自分で入手してください。20年以上の企業インタビューの知識ポイントとさまざまな技術ポイントも収集しました。役立つスクリーンショットをいくつか示します。
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/banzhuanhu/article/details/108673138