ホームページ  >  記事  >  Java  >  SFテクノロジーインタビュー

SFテクノロジーインタビュー

Java后端技术全栈
Java后端技术全栈転載
2023-08-15 15:52:171244ブラウズ

私は当初 3 時に面接を予定していましたが、面接官は早めにオンラインに来て、私がオンラインであることを見て、早めに始めるように言いました。

最初に質問を見てください

  1. 自己紹介
  2. 難しいと思うプロジェクトについて教えてください
  3. Java の学習方法
  4. 抽象クラスとインターフェイスについて教えてください
  5. HashMap と Hashtable について話しましょう
  6. HashMap に要素を追加するプロセス
  7. HashMap とは赤黒の木とその特徴は何ですか?
  8. B ツリーの特徴、最大何層、何個のデータを保存できるか
  9. B ツリーを使用する理由MySQL のインデックス スキップ リストを使用せずに B ツリーを作成しますか?
  10. RedisB ツリーやバイナリ ツリーの代わりにスキップ テーブルを使用する理由は何ですか?
  11. インデックスを作成するときに注意すべき点は何ですか?
  12. 単一テーブル内のデータ量が数千万を超える場合、それを最適化するにはどうすればよいでしょうか?
  13. 500 万件のデータを持つテーブル a と 300 万件のデータを持つテーブル b が外部キー tid で関連付けられていますが、その 50000 番目から 50200 番目のデータを素早くクエリするにはどうすればよいでしょうか?条件を満たしていますか? データ レコードが 200 件ですか?
  14. JVM メモリ モデルについて話します
  15. Survivor 領域が必要な理由は何ですか?
  16. 何を持っていますか?私に聞きたいですか?

試験問題の分析

自己紹介

新人の答え:

こんにちは、インタビュアーさん、私の名前は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 つの側面から答えることができます:

  1. スレッド セーフか: HashMap は非スレッド セーフ、HashTable はスレッド安全 。 HashTable の内部メソッドは基本的に synchronized で変更されるためです。 (スレッドの安全性を確保したい場合は、ConcurrentHashMap を使用してください);

  2. 効率: スレッドの安全性の問題のため、HashMap は HashTable よりもわずかに効率的です。さらに、HashTable は基本的に削除されており、コード内で使用しないでください。

  3. Null キーと Null 値のサポート: HashMap は、Null キーと値を格納できます。ただし、キーとして null を 1 つだけ指定でき、値として複数の null を指定できます。HashTable では null キーと null 値は許可されず、そうでない場合は NullPointerException がスローされます。

  4. 初期容量と毎回の容量拡張の違い:

    ① 作成時に容量の初期値を指定しなかった場合、ハッシュテーブルのデフォルトの初期サイズは 11 です。拡張するたびに、容量は元の 2n 1 になります。 HashMap のデフォルトの初期化サイズは 16 です。その後の拡張ごとに容量が 2 倍になります。

    ② 作成時に容量の初期値が指定されている場合、Hashtable は指定されたサイズを直接使用し、HashMap はそれを 2 のべき乗に拡張します (tableSizeFor( in HashMap) )方法保証)。

  5. 基盤となるデータ構造: JDK1.8 以降の HashMap は、ハッシュの競合を解決するために大幅な変更が加えられました。リンクされたリストの長さがしきい値 (デフォルト) を超える場合、は 8 ) (リンク リストを赤黒ツリーに変換する前に判断されます。現在の配列の長さが 64 より大きい場合は、赤黒ツリーに変換せずに、最初に配列を拡張することを選択します。 ). リンク リストを赤黒ツリーに変換する場合、検索時間を短縮するためにリンク リストは赤黒ツリーに変換されます。 Hashtable にはそのようなメカニズムはありません。

これは一般的な面接の質問ですが、多くの学生は面接中にうまく答えられません。回答には 2 の n 乗が記載されており、面接官は関連する質問を続ける可能性がありますが、それでも不明な場合は、体系的に HashMap を学習することをお勧めします。

私は以前にブログに 2 つの記事を投稿しました:

HashMap要素を追加するプロセス

HashMapPUT 要素を追加するプロセスは、次の 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 つの連続する赤いノードは存在できません)

  • 任意のノードから各リーフまで、すべてのパスに同じ番号が含まれます。黒いノードの。

#実際、この質問は難しいものではありません。まれに、赤黒木の左右回転の操作について質問する面接官もいます。 ..、インタビューしてきました 何百人もいますが、声を上げられるのはほんのわずかです。

#B ツリーの特徴には、階層数と格納できるデータの最大数が含まれます。 ##B ツリーの特徴は次の 2 つです:

1. 非リーフ ノード] インデックス機能のみを持ちます。つまり、非リーフ ノードは Key のみを格納できます。ただし、値ではありません

  • 2. ツリーのすべてのリーフ ノードは、順序付けされたリンク リストを形成し、すべてのデータをキーのソート順にたどることができます。
  • B ツリーは通常 1 レーン、3 層です。
    InnoDB ページ サイズ
  • デフォルトは 16KBです
:

レコードのサイズが 1KB であると仮定すると、16 個のデータを保存できます。 1 つのデータ ページ内 (ページ内の他のデータ構造は無視します)

  • 主キーが int でポインタ サイズが 6B であると仮定すると、インデックス ページには
    16KB/( 4B 6B)≈1638
    インデックス
  • したがって、2 層の B ツリーには、16*1638=26208
    個のデータ、3 つのデータを格納できます。 -layer B ツリーは、
  • 16*1638*1638=42928704
データを格納できます。

MySQL

のインデックスはスキップ テーブルではなく B ツリーを使用するのはなぜですか?

B ツリー はマルチツリー構造です。各ノードは 16k データ ページであり、より多くのインデックス情報を保存できるため、 ファンの出力は次のようになります。すごく高い。

3 層

は約 2kw のデータを保存できます。つまり、データを 1 回クエリすると、これらのデータ ページがすべてディスク上にある場合、ディスク IO に対して最大 3 回クエリを実行する必要があります。

ジャンプ リストはリンク リスト構造で、1 つのデータが 1 つのノードになります。最下層に 2kw データを格納する場合、各クエリは # を達成できる必要があります。 ##二分探索, 2kw の効果は約 2 の 24 乗 であるため、ジャンプ テーブルのおおよその高さは 24 層 あたりになります。 。最悪の場合、これら 24 層のデータが異なるデータ ページに分散されることになります。これは、1 つのデータ クエリに 24 ディスク IO が必要になることを意味します。

したがって、同じ大きさのデータを格納する場合、B ツリーの高さはスキップ テーブルの高さよりも低くなり、MySQL データベース上に配置した場合、その数は

になります。ディスク IO が少ないため、B ツリー クエリが高速になります

書き込み操作

の場合、B ツリーはインデックス データ ページを分割およびマージする必要があり、ジャンプ テーブルが独立して挿入され、レイヤーの数はランダム関数に基づいて決定されます。回転やバランス維持のオーバーヘッドがないため、スキップテーブルの書き込みパフォーマンスはB-treeよりも優れています。 実際、MySQL の

ストレージ エンジンは変更できます

。以前は、mysql 5.5 は myisam でしたが、その後は innodb## になりました。 #. それらの基礎となるインデックスはすべて B ツリー を使用します。言い換えれば、スキップ テーブル インデックスを備えたストレージ エンジンを完全に構築し、MySQL にインストールすることができます。実際、facebook は、jump table を使用する rocksDB ストレージ エンジンを構築しました。結論から言えば、書き込みパフォーマンスは確かにinnodbよりも優れていますが、読み取りパフォーマンスは確かにinnodbよりもはるかに悪いです。ご興味がございましたら、記事の最後にある 参考文献 でパフォーマンス比較データをご覧ください。

RedisB ツリーやバイナリ ツリーの代わりにスキップ テーブルを使用する理由は何ですか? B ツリーの原理は、リーフ ノードにデータが格納され、非リーフ ノードにインデックスが格納されるためです。B ツリーの各ノードは複数のキーワードを格納でき、ノード サイズが設定されます。ディスクの先読み機能を最大限に活用して、ディスク ページのサイズを変更します。ディスク ページが読み取られるたびにノード全体が読み取られ、ディスク IO を最小限に抑えるために、各リーフ ノードには前後のノードへのポインタも含まれます。メモリ内のデータの読み取りにかかる時間は、ディスクからの IO の読み取りの 100 万分の 1 であり、Redis はメモリ内のデータを操作し、IO を伴わないため、スキップ テーブルが使用されます。

インデックスを作成するときに注意すべき点は何ですか?

#この質問は、どのような SQL 最適化を知っているかを尋ねるときにも使用できます。

  • インデックス付けに最も適した列は、WHERE 句にある列、または join 句にある列ですが、結合句に含まれる列ではありません。 SELECT キーワードの後の列に表示されます。
  • インデックス列のカーディナリティが大きいほど、インデックス作成の効果が高くなります。
  • 状況に応じて複合インデックスを作成すると、クエリ効率が向上します。
  • 追加のディスク領域を占有し、書き込み操作の効率が低下するため、インデックスを作成しすぎることは避けてください。
  • 主キーにはできるだけ短いデータ型を選択してください。これにより、インデックスのディスク使用量が効果的に削減され、クエリの効率が向上します。
  • 文字列にインデックスを付けるには、プレフィックスの長さをカスタマイズする必要があります。これにより、インデックス スペースを大幅に節約できます。

#単一テーブル内のデータ量が数千万を超える場合、それを最適化するにはどうすればよいでしょうか?

1. データベースを設計してテーブルを作成するときは、パフォーマンスの問題を考慮してください。たとえば、1 つのテーブルのフィールド数が多すぎてはならず、20 以内にすることをお勧めします。インデックスは多ければ多いほど良いです。クエリはターゲットを絞った方法で作成されます。WHERE および ORDER BY コマンドに関係する列のインデックス付けを検討してください。EXPLAIN を使用して、インデックスまたはフル テーブル スキャンが使用されているかどうかを確認できます。適切なデータ型を選択し、適切なインデックス タイプを選択します。

2. SQL を書くときは注意が必要です。例: リスト データにテーブル全体を使用しないでください。ページ分割には LIMIT を使用してください。ページ数が多すぎてはいけません。SQL が遅い場合があります。低速クエリ ログをオンにする、select * を避ける、検索する必要があるフィールドをリストするなどです。

3. ストレージ エンジンの選択、MyISAM は SELECT 中心のテーブルに適しており、InnoDB は INSERT および UPDATE 中心のテーブルに適しています

4. サブデータベースとテーブルの例: サブデータベース データベースを複数に分割します。読み取りと書き込みを分離することをお勧めします。実際にサブデータベースを実行すると、大変な苦労があり、開発コストは利益に見合っていません。使用はお勧めしません。テーブル分割は、上記のプロセスに従って大きなテーブルを最適化しますが、クエリはまだスタックしており、テーブルを複数のテーブルに分割し、1 つのクエリを複数のクエリに分割し、その後、結果の組み合わせがユーザーに返されます。テーブルの分割には縦分割と横分割があり、通常は特定のフィールドを分割項目として使用します。たとえば、id フィールドに基づいて 100 のテーブルに分割すると、テーブル名は tableName_id 0 になります。ただし、サブテーブルはソースプログラムコードの修正が必要となるため、開発工数が多く、開発コストが大幅に増加するため、開発初期段階で大量のデータの存在を考慮する場合にのみ適しています。サブテーブル処理ではうまく機能しますが、アプリケーションには適していません。オンライン化した後に変更するにはコストがかかりすぎます。

5. ハードウェアのアップグレードは最も簡単な方法ですが、相対的なコストも高いため、上司はそれをやりたがりません。

6. データベースのアップグレード (例: MySQL データベースをデータ処理用のビッグ データ エンジンに置き換えるか、Alibaba Cloud POLARDB に置き換えます。POLARDB は、Alibaba Cloud によって開発された次世代のリレーショナル分散クラウド ネイティブ データベースです。 MySQL およびストレージと 100% 互換性があり、容量は最大 100T に達し、パフォーマンスは MySQL の最大 6 倍に向上します。

500 万件のデータを持つテーブル a と 300 万件のデータを持つテーブル b が外部キー tid で関連付けられていますが、その 50000 番目から 50200 番目のデータを素早くクエリするにはどうすればよいでしょうか?条件を満たしていますか? データ レコードが 200 件ですか?

方法 1: テーブル a の tid が自己増加して連続している場合、テーブル b の id がインデックスになります。 SQL文は以下の通りです。

select * from a,b where a.tid = b.id and a.tid>500000 limit 200;

方法 2: テーブル a の tid が連続していない場合は、カバー インデックスを使用する必要があります。tid は主キーまたは補助インデックスのいずれかであり、テーブル b の ID もインデックス。 SQL文は以下の通りです。

select * from b, (select tid from a limit 50000,200) a where b.id = a.tid;

JVM のメモリ モデルについて話す

JVM メモリ構造には、プログラム カウンター、ヒープ メモリ、メソッド領域、スタック (Java 仮想マシン スタックとネイティブ メソッド スタック)。

プログラム カウンター (プログラム カウンター レジスタ) は小さなメモリ空間であり、その機能は現在のスレッドによって実行されるバイトコードの行番号インジケーターとみなすことができます。仮想マシンの概念モデル (単なる概念モデルであり、さまざまな仮想マシンがより効率的な方法で実装される可能性があります) では、バイトコード インタープリターは、このカウンターの値を変更して、実行する必要がある次のステップを選択することによって機能します。バイトコード命令、分岐、ループ、ジャンプ、例外処理、スレッド回復などはすべて、このカウンターに依存して完了します。

ヒープ メモリは JVM の最大の部分であり、若い世代と古い世代で構成されます。若い世代のメモリは、Eden 領域、From Survivor 領域、To Survivor 領域の 3 つの部分に分割されます。デフォルトでは、 , 若い世代は 8:1:1 の比率で割り当てられます;

メソッド領域には、クラス情報、定数、静的変数などのデータが格納されます。 Java ヒープと区別するため、メソッド領域も Non-Heap (非ヒープ) と呼ばれ、スタックは主にメソッドの実行に使用される Java 仮想マシン スタックとローカル メソッド スタックに分かれます。メソッド領域は仕様として理解でき、その実装は永続世代やメタスペースなどです。

Java 仮想マシン スタック (Java 仮想マシン スタック) もスレッドプライベートであり、そのライフサイクルはスレッドのライフサイクルと同じです。仮想マシン スタックは、Java メソッド実行のメモリ モデルを記述します。 各メソッドが実行されると、ローカル変数テーブル、操作スタック、ダイナミック リンクなどの情報を格納するスタック フレーム (Stack Frame) が同時に作成されます。 、メソッド出口など。各メソッドの呼び出しから実行が完了するまでの過程は、仮想マシンスタックにおいてスタックフレームがスタックからプッシュされてスタックからポップアウトされるまでの過程に相当します。

ネイティブ メソッド スタック (ネイティブ メソッド スタック) と仮想マシン スタックは非常によく似た役割を果たします。唯一の違いは、仮想マシン スタックが仮想マシンに Java メソッド (つまり、バイトコード) の実行を提供することと、 ローカル メソッド スタックは、仮想マシンで使用されるネイティブ メソッドを提供します。 仮想マシンの仕様では、ローカル メソッド スタック内のメソッドの言語、使用法、およびデータ構造が義務付けられていないため、特定の仮想マシンが自由に実装できます。

サバイバーエリアが必要な理由

サバイバーがいない場合、エデンエリアでマイナー GC が実行されるたびに、年齢制限はありません。生き残ったオブジェクトは古い時代に送られます。その結果、古い世代はすぐにいっぱいになり、メジャー GC がトリガーされます (メジャー GC には通常マイナー GC が伴うため、フル GC がトリガーされるとみなすこともできます)。旧世代のメモリ空間は新世代のメモリ空間よりもはるかに大きく、フル GC はマイナー GC よりもはるかに時間がかかります。

面接官は次のように尋ねるかもしれません: 長い実行時間のデメリットは何ですか?

頻繁なフル GC は長時間を消費し、大規模なプログラムの実行と応答に影響を与えます。スピード。

古い世代のスペースを増やすと、より多くの存続オブジェクトが古い世代を埋めることができます。フル GC の頻度は減少しますが、古い世代の領域が増加するため、一度フル GC が発生すると実行に時間がかかります。

古い世代の領域が削減されると、フル GC に必要な時間は短縮されますが、古い世代は生き残ったオブジェクトですぐにいっぱいになり、フル GC の頻度が増加します。

したがって、Survivor の目的は、古い世代に送信されるオブジェクトの数を減らし、それによってフル GC の発生を減らすことです。Survivor の事前スクリーニングにより、16 回のマイナー GC を経験したオブジェクトのみが世代内で生き残ることができます。新しい世代。、古い世代に送信されます。

何か聞きたいことはありますか?

面接官の中には、この時点ではおそらく面接がクールなため、この質問を丁寧に質問し、あなたの答えにはあまり注意を払わない人もいます。

ただし、質問する機会がある場合、ほとんどの人はまだあなたが良いと考えており、入学できる可能性は非常に高いため、慎重に答える必要があります。

いいえ彼の心理がどうであれ、礼儀正しく行動しましょう。

この質問は必要ないように思えるかもしれませんが、実は非常に重要です。一般に、面接官は人柄や人柄を重視するため、「問題ありません 」と言う人は嫌いです。従業員のイノベーション、能力。企業は、求職者が個人的な福利厚生について質問することを好みません。誰かが「あなたの会社には新入社員向けの研修プログラムはありますか? 参加できますか?」と尋ねたら、あるいはあなたの会社のプロモーションの仕組みは何ですか?会社があなたを歓迎するのは、あなたの学習意欲や会社への忠誠心、野心を示すものだからです。

以上がSFテクノロジーインタビューの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はJava后端技术全栈で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。