私は当初 3 時に面接を予定していましたが、面接官は早めにオンラインに来て、私がオンラインであることを見て、早めに始めるように言いました。
最初に質問を見てください
自己紹介 難しいと思うプロジェクトについて教えてください Java の学習方法 -
抽象クラスとインターフェイスについて教えてください HashMap と Hashtable について話しましょう HashMap に要素を追加するプロセス HashMap とは赤黒の木とその特徴は何ですか? B ツリーの特徴、最大何層、何個のデータを保存できるか B ツリーを使用する理由MySQL
のインデックス スキップ リストを使用せずに B ツリーを作成しますか?Redis
B ツリーやバイナリ ツリーの代わりにスキップ テーブルを使用する理由は何ですか?インデックスを作成するときに注意すべき点は何ですか? 単一テーブル内のデータ量が数千万を超える場合、それを最適化するにはどうすればよいでしょうか? 500 万件のデータを持つテーブル a と 300 万件のデータを持つテーブル b が外部キー tid で関連付けられていますが、その 50000 番目から 50200 番目のデータを素早くクエリするにはどうすればよいでしょうか?条件を満たしていますか? データ レコードが 200 件ですか? JVM メモリ モデルについて話します Survivor 領域が必要な理由は何ですか? 何を持っていますか?私に聞きたいですか?
試験問題の分析
自己紹介
新人の答え:
こんにちは、インタビュアーさん、私の名前はZhang Sanです。河南出身です。XX大学を卒業しました。XX大学を卒業して以来、Java開発に従事しています。 3年が経ちました。あなたの会社に面接に来て、Java 開発の仕事を探してください。
自己紹介のためのいくつかのポイント: あなたは誰ですか、そしてあなたの長所は何ですか?ここ何年も何をしてたんですか?学校でどんな賞を受賞しましたか?どのようなテクノロジーについて詳細な研究を行ってきましたか?高度な同時実行システムの設計はありますか?何か大規模なプロジェクトに参加したことがありますか?
つまり、自分のすべての資産を誇示し、自分が比較的得意な分野を他の人に知らせてください。
あなたが挑戦的だと思うプロジェクトについて教えてください
この質問は実際には人によって異なります。始めたばかりの方へ、彼に電話してください プロジェクトの構築は非常に挑戦的だと感じます。
ダニエルにとって、「挑戦」はもはやテクノロジーではありません。さらに、プロジェクトをどのようにパッケージ化して上司を説得するか、部下をどのように絞り込むかがプロジェクトの難しいところです。
面接では「やりがい」が面接官の基準です。面接官がプロジェクト ビジネスの技術的な側面に触れたことがなく、難しそうに聞こえる場合、これは「挑戦的な」プロジェクトです。
面接官があなたが言及したチャレンジ プロジェクトに精通している場合は、現時点ではそれがあなたにとってチャンスであり、挑戦である可能性があります。面接官が遭遇したことのない質問と、それをどのように解決したかに答えてください。面接官「私はあなたを完全に尊敬しています。逆に、面接官がこのプロジェクトについて知っていることをあなたに質問し、あなたが答えられない場合、面接は大きく損なわれることになります。」
例: 5 ~ 6 年前、テクノロジー スタックには dubbo と Spring Boot が含まれており、非常に人気がありましたが、現在では標準になっています。
しかし、ほとんどの企業は大企業に成長できないため、ビッグ データ、高同時実行性、アーキテクチャ変革の経験を持つ開発者はまだ少数です。しかし。これはソフトウェア工学がどんなに発展しても変えることはできません。
したがって、挑戦的なプロジェクトには次のような特徴があります:
1. 大量のデータ
2. 高い同時実行性
3. アーキテクチャの変革
あなたのプロジェクトがこれらのことに関わることができる限り、あなたのプロジェクトのレベルは少なくとも 1 レベル高くなります。
ここで、回答テンプレートを提供します:
1. 私はこの xxx ビジネス プロジェクトの責任者であり、このビジネスは xxx のものです。
2. 迅速な試行錯誤と市場への迅速な対応のため、初期段階ではシンプルな xxxx プランが使用されました。
3. ビジネスの発展に伴い、この計画には xxx の技術的な問題が発生しました。
4. これらの技術的問題を解決するために、最終的に xxx ソリューションを使用し、これらのソリューションと、これらのソリューションがこれらの技術的問題をどのように解決したかを紹介しました。
Java を普段どのように学習していますか
学習プロセスについて真実を話してください。ただし、学習には積極的に反映する必要があることに注意してください。さらに、自分自身にマークを付ける良い習慣があります。何度もメモを取ることは、悪いペンほど効果的ではありません。
公式サイトを読んだり、本を読んだり、動画を見たりすることをお勧めします。
学習プロセスでは、練習を続け、常に反省し、常に要約してください。
- 抽象クラスはサブクラスによって継承され、インターフェイスは実装される必要がありますサブクラスごとに。
- 抽象クラスにはコンストラクターを含めることができますが、インターフェイスにはコンストラクターを含めることはできません。 # 抽象クラスには通常のメンバー変数が存在できますが、インターフェイスには通常のメンバー変数は存在しません。その変数はパブリック静的定数のみです
- クラスは複数のインターフェイスを実装できますが、継承できる親クラスは 1 つだけであり、その親クラスは抽象クラスにすることができます。
- メソッドの宣言とメソッドの実装は、抽象クラスで行うことができます。メソッドの宣言はインターフェイス内で行うことができ、デフォルトのメソッドを定義することもできます。
- 抽象レベル (高から低):
- インターフェース>抽象クラス>実装クラス
。 抽象クラスは主にカテゴリを抽象化するために使用され、インターフェイスは主にメソッド関数を抽象化するために使用されます。 - 抽象クラスのキーワードはabstract、インターフェイスのキーワードはinterfaceです。
HashMapとHashtable5 つの側面から答えることができます:
- スレッド セーフか: HashMap は非スレッド セーフ、HashTable はスレッド安全 。 HashTable の内部メソッドは基本的に synchronized で変更されるためです。 (スレッドの安全性を確保したい場合は、ConcurrentHashMap を使用してください);
- 効率: スレッドの安全性の問題のため、HashMap は HashTable よりもわずかに効率的です。さらに、HashTable は基本的に削除されており、コード内で使用しないでください。
- Null キーと Null 値のサポート: HashMap は、Null キーと値を格納できます。ただし、キーとして null を 1 つだけ指定でき、値として複数の null を指定できます。HashTable では null キーと null 値は許可されず、そうでない場合は NullPointerException がスローされます。
- 初期容量と毎回の容量拡張の違い:
① 作成時に容量の初期値を指定しなかった場合、ハッシュテーブルのデフォルトの初期サイズは 11 です。拡張するたびに、容量は元の 2n 1 になります。 HashMap のデフォルトの初期化サイズは 16 です。その後の拡張ごとに容量が 2 倍になります。
② 作成時に容量の初期値が指定されている場合、Hashtable は指定されたサイズを直接使用し、HashMap はそれを 2 のべき乗に拡張します (
tableSizeFor( in HashMap) )
方法保証)。 基盤となるデータ構造: JDK1.8 以降の HashMap は、ハッシュの競合を解決するために大幅な変更が加えられました。リンクされたリストの長さがしきい値 (デフォルト) を超える場合、は 8 ) (リンク リストを赤黒ツリーに変換する前に判断されます。現在の配列の長さが 64 より大きい場合は、赤黒ツリーに変換せずに、最初に配列を拡張することを選択します。 ). リンク リストを赤黒ツリーに変換する場合、検索時間を短縮するためにリンク リストは赤黒ツリーに変換されます。 Hashtable にはそのようなメカニズムはありません。
これは一般的な面接の質問ですが、多くの学生は面接中にうまく答えられません。回答には 2 の n 乗が記載されており、面接官は関連する質問を続ける可能性がありますが、それでも不明な場合は、体系的に HashMap を学習することをお勧めします。
私は以前にブログに 2 つの記事を投稿しました:
HashMap
要素を追加するプロセス
HashMap
PUT 要素を追加するプロセスは、次の 9 つのステップに分割できます。
1. put() メソッドを使用する場合は、 putVal()
メソッドを直接呼び出します2. put 時に最初に判断します。配列が空かどうかにかかわらず、空の場合はサイズ変更操作を実行します 3. ハッシュ インデックス配列の長さ -1 を使用して、配列のハッシュ値と AND 演算を実行します。キーを使用して配列内のインデックスを取得し、インデックスで指定された位置が空であれば挿入可能であることを意味します。新しいノードを直接挿入します。 4.現在のノードかどうかを判断します。キーが存在し、存在する場合は置き換えます。置き換えが成功した場合は、古い値を返します #5。キーが存在しない場合は、現在のノードがツリーであるかどうかを確認します。タイプ。ツリー タイプの場合は、ツリー操作に従って新しいノードのコンテンツを追加します 6. ハッシュ競合が発生したノードがツリー タイプではない場合、それは次のことを意味します。現在の衝突はリンクされたリスト内にあり、この時点でループ処理ロジックに入ります -
7. ループ ロジックに入った後、まず衝突したノードの次のノードが存在するかどうかを判断しますノードが空です。空の場合は、新しいノードをその中に配置します 8. 配置後、現在のノードを決定します リンク リストがリンク リストの最大許容長である 8 を超えているかどうかを確認しますを超える場合、挿入用に赤黒ツリーに変換されます 9. マップのインデックス テーブルが空であるか、現在のインデックス テーブルの長さが 64 未満の場合(最大値 (赤黒ツリーのインデックス配列テーブルの長さまで)) の場合は、サイズ変更操作を実行するだけです。それ以外の場合、衝突したノードが空でない場合は、ノードを追加し、衝突したノードのツリーに沿って挿入します。
私のブログのブログ投稿を読むことができます: 3 年間の重要な HashMap ソース コード: http://www.woaijava.cc/blog/211
赤黒木とは何ですか?その特徴は何ですか?
Red Black Tree (Red Black Tree) は、特殊な AVL ツリー (バランス型バイナリ ツリー) であり、挿入および削除操作中に特定の操作を通じてバイナリ値を維持します。検索ツリーを使用して、より高い検索パフォーマンスを実現します。
赤黒木には 5 つの特徴があります:
ノードは赤または黒です。
#ルート ノードは黒です。 すべての葉は黒です (葉は NIL ノードです) #赤い各ノードの 2 つの子ノードは黒です。 (各リーフからルートまでのすべてのパス上に 2 つの連続する赤いノードは存在できません) 任意のノードから各リーフまで、すべてのパスに同じ番号が含まれます。黒いノードの。
#実際、この質問は難しいものではありません。まれに、赤黒木の左右回転の操作について質問する面接官もいます。 ..、インタビューしてきました 何百人もいますが、声を上げられるのはほんのわずかです。
1. 非リーフ ノード] インデックス機能のみを持ちます。つまり、非リーフ ノードは Key のみを格納できます。ただし、値ではありません
- 2. ツリーのすべてのリーフ ノードは、順序付けされたリンク リストを形成し、すべてのデータをキーのソート順にたどることができます。
- B ツリーは通常 1 レーン、3 層です。 InnoDB ページ サイズ デフォルトは 16KBです
レコードのサイズが 1KB であると仮定すると、16 個のデータを保存できます。 1 つのデータ ページ内 (ページ内の他のデータ構造は無視します)
- 主キーが int でポインタ サイズが 6B であると仮定すると、インデックス ページには
16KB/( 4B 6B)≈1638 インデックス -
個のデータ、3 つのデータを格納できます。 -layer B ツリーは、したがって、2 層の B ツリーには、
16*1638=26208 16*1638*1638=42928704
MySQL
B ツリー ファンの出力は次のようになります。すごく高い。
3 層は約 2kw のデータを保存できます。つまり、データを 1 回クエリすると、これらのデータ ページがすべてディスク上にある場合、ディスク IO に対して最大 3 回クエリを実行する必要があります。 ジャンプ リストはリンク リスト構造で、1 つのデータが 1 つのノードになります。最下層に になります。ディスク IO が少ないため、B ツリー クエリが高速になります。 の場合、B ツリーはインデックス データ ページを分割およびマージする必要があり、ジャンプ テーブルが独立して挿入され、レイヤーの数はランダム関数に基づいて決定されます。回転やバランス維持のオーバーヘッドがないため、スキップテーブルの書き込みパフォーマンスはB-treeよりも優れています。 実際、MySQL の 。以前は、mysql 5.5 は myisam でしたが、その後は 2kw
データを格納する場合、各クエリは # を達成できる必要があります。 ##二分探索, 2kw の効果は約
2 の 24 乗 であるため、ジャンプ テーブルのおおよその高さは
24 層 あたりになります。 。最悪の場合、これら 24 層のデータが異なるデータ ページに分散されることになります。これは、1 つのデータ クエリに 24 ディスク IO が必要になることを意味します。 innodb## になりました。 #. それらの基礎となるインデックスはすべて
B ツリー を使用します。言い換えれば、スキップ テーブル インデックスを備えたストレージ エンジンを完全に構築し、MySQL にインストールすることができます。実際、
facebook は、jump table を使用する
rocksDB ストレージ エンジンを構築しました。結論から言えば、
書き込みパフォーマンスは確かにinnodbよりも優れていますが、読み取りパフォーマンスは確かにinnodbよりもはるかに悪いです。ご興味がございましたら、記事の最後にある 参考文献 でパフォーマンス比較データをご覧ください。 Redis
以上がSFテクノロジーインタビューの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。
