ホームページ  >  記事  >  Java  >  先週、XX保険の面接を受けましたが、とても良かったです。 ! !

先週、XX保険の面接を受けましたが、とても良かったです。 ! !

Java后端技术全栈
Java后端技术全栈転載
2023-08-25 15:44:191188ブラウズ

先週、グループの友人が平安保険に面接に行きました。結果は少し残念でとても残念ですが、落ち込まないでほしいと思います。とおっしゃいましたが、面接で遭遇した問題は基本的に試験問題を暗記すれば解けるものばかりですので頑張ってください!

また、ご不明な点がございましたら、お気軽にご相談いただき、一緒に進めていきたいと思います。

あまり深入りせずに本題に入りましょう。この学生がまとめた技術面接の質問と参考回答を以下に示します。

Java のスレッドセーフ クラスとは何ですか?

ベクトルハッシュテーブル文字列バッファ。これらはすべて、スレッド セーフを実現するためにメソッドに同期ロックを追加します。

さらに、すべてのコレクション クラスが JUC パッケージの下にあります

ArrayBlockingQueueConcurrentHashMapConcurrentLinkedQueueConcurrentLinkedDeque など。これらもスレッドセーフです。

幸いなことに、これで回答は終わりで、面接官はそれ以上質問しませんでした。そうでなければ、JUC の下でこれらの質問に答えることはできなかったでしょう。

Java でオブジェクトを作成できる方法は何通りありますか?

#この質問は比較的簡単なので、最後の 123 は問題ないと言えます。

Java では、次の 4 つの方法でオブジェクトを作成できます。

  • new は新しいオブジェクトを作成します
  • リフレクション メカニズムを通じて
  • クローン メカニズムを使用します
  • シリアル化メカニズムを通じて

Object の一般的なメソッドは何ですか?

#この質問に対する答えはあまり良くなく、当時は toString、equals、hashCode、wait、notify、notifyAll しか覚えていませんでした。他には何も考えませんでした。面接官はうなずき続け、大丈夫だろうという印象を与えた。

java.lang.Object

先週、XX保険の面接を受けましたが、とても良かったです。 ! !

対応するメソッドの意味は次のとおりです。

clone メソッド

オブジェクトの浅いコピーを実装するための保護されたメソッド。このメソッドは、Cloneable インターフェイスが実装されている場合にのみ呼び出すことができます。それ以外の場合は、CloneNotSupportedException 例外が発生します。ディープ コピーも必要です。Cloneable を実装し、そのメンバー変数が参照型の場合は、Cloneable も実装してから、clone メソッドを書き直す必要があります。

finalize メソッド

このメソッドはガベージ コレクターに関連しています。オブジェクトをリサイクルできるかどうかを判断する最後のステップは、このメソッドがオーバーライドされているかどうかを判断することです。

equals メソッド

このメソッドは非常に頻繁に使用されます。通常、equals と == は異なりますが、Object では同じです。通常、サブクラスはこのメソッドをオーバーライドします。

hashCode メソッド

このメソッドはハッシュ検索に使用されます。equals メソッドを書き換えるには、通常、hashCode メソッドを書き換える必要があります。このメソッドは、ハッシュ関数を使用する一部のプログラムで使用されます。コレクションで使用されます。

通常、obj1.equals(obj2)==true を満たす必要があります。 obj1.hashCode()==obj2.hashCode() と結論付けることができますが、等しい hashCode は必ずしも等しいを満たすわけではありません。ただし、効率を向上させるためには、上記 2 つの条件を可能な限り同等に近づける必要があります。

  • JDK 1.6 および 1.7 のデフォルトは乱数を返すことです;
  • JDK 1.8 のデフォルトは 3 つの決定された値を使用することです現在のスレッドに関連する乱数。Marsaglia の xorshift スキームは、乱数アルゴリズムによって取得された乱数です。

wait メソッド

synchronized とともに使用される wait メソッドは、現在のスレッドがオブジェクトのロックを待機するようにします。はオブジェクトの所有者である必要があります。つまり、オブジェクトのロックを持っています。 wait() メソッドは、ロックを取得するか中断されるまで待機します。 wait(long timeout) はタイムアウト間隔を設定し、指定された時間内にロックが取得されない場合に戻ります。

このメソッドを呼び出した後、現在のスレッドは次のイベントが発生するまでスリープ状態に入ります。

  1. 他のスレッドがオブジェクトの Notice メソッドを呼び出しました;
  2. 他のスレッドがオブジェクトの NoticeAll メソッドを呼び出しました;
  3. 他のスレッドがスレッドを中断するために割り込みを呼び出しました;
  4. 時間間隔が終了しました。

スレッドはこの時点でスケジュールできますが、中断されると、InterruptedException 例外がスローされます。

notify メソッド

は、synchronized と組み合わせて使用​​されます。このメソッドは、オブジェクトの 待機キュー 内のスレッド (同期キュー (synchronized queue) CPU をプリエンプトするスレッド用であり、待機キュー内のスレッドとは、ウェイクアップを待っているスレッドを指します。

notifyAll メソッド

このメソッドを synchronized とともに使用すると、このオブジェクトのキューで待機しているすべてのスレッドが起動されます。

hashCode メソッドと equals メソッドの関係は何ですか?

これは連続攻撃に似ているように思えます。この質問をして、面接官が少し混乱しているように感じました、私の基礎に疑問がありますが、この質問にはまだ答えることができます。

a.equals(b) が「true」を返す場合、a と b の hashCode() は等しい必要があります。

a.equals(b) が「false」を返す場合、a と b の hashCode() は等しいか等しくない可能性があります。

ハッシュコードの役割

#これは実際には一連の質問であり、次々と出てくる答えは理想的ではありませんが、理想的でもあります。関連する。

Javaコレクションには 2 種類あり、1 つは List で、もう 1 つは Set です。前者は秩序があり、再現可能ですが、後者は無秩序で再現できません。要素をセットに挿入するときに、その要素がすでに存在するかどうかを確認するにはどうすればよいですか?equals メソッドを使用できます。ただし、要素が多すぎる場合、この方法はさらに充実したものになります。

そこで、誰かがコレクション内の要素の検索効率を向上させるためにハッシュ アルゴリズムを発明しました。この方法では、コレクションをいくつかの記憶領域に分割します。オブジェクトごとにハッシュ コードを計算できます。ハッシュ コードをグループ化できます。各グループは特定の記憶領域に対応します。オブジェクトのハッシュ コードに基づいてオブジェクトを決定できます。保存する必要がある領域。

hashCode メソッドは次のように理解できます。オブジェクトのメモリ アドレスに基づいて計算された値を返します。このようにして、新しい要素がコレクションに追加されると、この要素の hashCode メソッドが最初に呼び出され、配置される物理的な場所がすぐに特定されます。この位置に要素がない場合は、比較せずにこの位置に直接格納できます。この位置に要素がすでに存在する場合は、その等しいメソッドを呼び出して新しい要素と比較します。それらが同じであれば、同じでない場合は、他のアドレスをハッシュします。このようにして、equals メソッドの実際の呼び出し数は大幅に減り、ほとんど 1 回か 2 回だけになります。

Spring Boot の自動アセンブリ原理について話します

この問題は、私が Spring Boot を書いたことが原因でもあります。履歴書を聞かれるのは普通のことですが、面接前に読んで答えは大丈夫でした。面接官は、それが意味するところだと言いました。

Spring Boot @SpringBootApplication には非常に重要なアノテーションがあり、これは

- @SpringBootConfiguration

と同等です。

- @EnableAutoConfiguration

- @ComponentScan

@EnableAutoConfiguration がキー (自動構成を有効にする) 内部的には、META-INF/spring.factories ファイルの情報が実際に読み込まれ、# でフィルタリングされます。 ## EnableAutoConfiguration はキー データであり、自動構成機能を実現するために IOC コンテナにロードされます。

データベース トランザクションの分離レベルは何ですか?

#この種の問題では、8 部構成のエッセイを暗記する必要があり、インターネット上にたくさんのエッセイが公開されています。

データベース トランザクションには 4 つの分離レベルがあり、低から高まで、

Read uncommittedRead committedRepeatable read です。 、シリアル化可能

  • 未コミット読み取り (READ UNCOMMITTED): この分離レベルでは、他のトランザクションは、このトランザクションによってコミットされていない一部の変更を認識できるため、ダーティ リードの問題が発生します (読み取りフェッチ他のトランザクションのコミットされていない部分、その後トランザクションはロールバックされました);
  • Read Committed (READ COMMITTED): 他のトランザクションはコミットされた部分の取得のみを行うことができますこのトランザクションの分離レベルには、反復不可能な読み取りの問題があります。同じトランザクションで 2 回読み取りを行った後に得られる結果は、実際には異なります。これは、別のトランザクションがデータを変更したためです。"
  • Repeatable read (REPEATABLE READ)。反復可能な読み取り分離レベルは、上記の反復不可能な読み取りの問題を解決しますが、ファントム読み取りという新しい問題がまだあります。id>10 のデータ行を読み取る場合、関係するすべての行に読み取りロックが追加されます。このとき、トランザクションは id=11 のデータを新規に挿入します。新規に挿入されるため、上記はトリガーされません。ロックの除外、その後、次の実行時にこのトランザクションのクエリでは、id=11 のデータが見つかりますが、最後のクエリ操作ではそれを取得できなかったので、再度挿入すると主キーの競合の問題が発生します。
  • Serializable (SERIALIZABLE)。これは最高の分離レベルであり、すべての操作が強制的に逐次的に実行されるため、上記の問題をすべて解決できます。これにより、同時実行パフォーマンスの急激な低下につながります。

MySQL のインデックスについての理解を話してください

この質問「大丈夫です、知っているだけ言ってください。それは皆さんの準備次第です。その時は十分に準備していました。答えても大丈夫だと感じたので、インデックスのメリットとデメリットを一緒に答えました。

インデックスは、Mysql が効率的にデータを取得できるようにするデータ構造です。より一般的に言うと、データベース インデックスは本の巻頭にある目次のようなもので、データベース クエリを高速化できます。

利点

  • データベーステーブル内のデータの各行の一意性を保証できる
  • インデックス作成を大幅に高速化できる
  • 特にデータの参照整合性の実現において、テーブル間の接続を高速化します
  • グループ化を使用する場合およびデータに並べ替え句を使用する場合
  • #インデックスを使用することで、時間クエリ中に最適化非表示機能を使用してシステム パフォーマンスを向上させることができます。
欠点

  • インデックスの作成と維持には時間がかかり、データ量が増えるとこの時間も長くなります
  • インデックスには必要な時間がかかります。データ テーブルが占有するデータ スペースに加えて、各インデックスも一定量の物理スペースを占有します。クラスター化インデックスを確立する必要がある場合、必要なスペースはさらに大きくなります。大
  • #テーブル内のデータが追加、削除、または変更されると、インデックスを動的に維持する必要があるため、整数のメンテナンス速度が低下します
  • ##SQL とは最適化手法に精通していますか?

この部分は、ブラザー ティアンのナレッジ プラネットの「Java プログラマーのための必須の MySQL データベース知識」を読んで学びました。ブラザー ティアンはたくさんの内容をまとめているので、これは一部に過ぎません。私の兄は物覚えが悪いです。

1. クエリ ステートメントでは select *

2 を使用しないでください。サブクエリを最小限に抑え、代わりに関連クエリ (左結合、右結合、内部結合) を使用してください。

3. 削減IN または NOT IN の使用、

4 の代わりに、exists、notexits、または関連するクエリ ステートメントを使用します。 or クエリの代わりに、union または Union all を使用してみてください (重複データがないことを確認する場合、またはデータが存在することを確認する場合)。重複データを削除する必要はありません。すべて結合する方が良いでしょう)

5. where 句では != または a8093152e673feb7aba1828c43532094 演算子を使用しないようにしてください。そうしないと、エンジンがインデックスの使用を断念して、フルテーブルスキャン。

6. where 句でフィールドの null 値を判断しないようにしてください。そうしないと、エンジンはインデックスの使用を断念し、次のような完全なテーブル スキャンを実行します: select id from t where num is null num に指定できます。デフォルト値 0 を設定し、テーブルの num 列に null 値がないことを確認してから、次のようにクエリします。 select id from t where num=0

How is MySQL で実行される SQL クエリ?

NND さん、MySQL についてとても聞きたいのですが、この質問には本当に困惑しました。ばかげた話をした後、面接官は少し焦りました。戻ってきて、Tian Ge の Knowledge Planet にアクセスして調べてみましたが、案の定、ほぼ同じ面接の質問でした。準備ができていなかった自分を責めました。

たとえば、次の SQL ステートメント (面接官がその場で答えた SQL):

select 字段1,字段2 from 表 where id=996
  1. リンクを取得、MySQL へのコネクタを使用します。
  2. クエリ キャッシュ、キーは SQL ステートメント、値はクエリ結果であり、見つかった場合は直接返されます。 MySQL 8.0 バージョンではクエリ キャッシュが削除されているため、MySQL 8.0 以降ではこの機能は存在しません。
  3. Analyzer、字句解析と構文解析に分かれています。この段階では、SQL の解析と構文の検証が行われるだけです。したがって、一般的な文法上の誤りはこの段階にあります。
  4. Optimizer は、テーブルに複数のインデックスがある場合、またはステートメント (結合) に複数のテーブルの関連付けがある場合に、どのインデックスを使用するかを決定し、接続を決定します。各テーブルの順番。
  5. Executor は、アナライザーを使用して SQL に何をしたいのかを知らせ、オプティマイザーを使用してその方法を知らせ、ステートメントの実行を開始します。ステートメントを実行するときは、この権限があるかどうかも判断する必要があります。権限がない場合は、権限がないことを示すエラーが直接返されます。権限がある場合は、テーブルを開いてインターフェイスを使用します。テーブルのエンジン定義に従ってテーブルの最初の行を取得するためにエンジンによって提供され、ID が 1 に等しいかどうかを判断します。存在する場合はそのままリターンし、次の行に進むためにエンジンインターフェースを呼び出し続けない場合は、テーブルの最後の行がフェッチされるまで同じ判断を繰り返し、最終的にリターンします。
#気になったのですが、996 とはどういう意味ですか? あなたの会社は 996 ですか?何気なく言ってみよう

JVM におけるヒープとスタックの違いは何ですか?

#これは問題ありません。JVM の知識に精通していれば、答えることができます。 Brother Tian がコンパイルした JVM ランタイム データ領域の説明は非常に優れています。

この 2 つの本質的な違いは、スタックはスレッドに対してプライベートであるのに対し、ヒープはスレッドによって共有されるということです。

スタックはロジックを表す実行時単位です。スタックはスレッドに対応し、基本的なデータ型とヒープ内のオブジェクトへの参照が含まれます。領域は連続しており、フラグメントはありません。

ヒープはデータを表すストレージであり、複数のスタックで共有できます (基本データ型、参照、メンバー内の参照オブジェクトを含む) 領域は連続しておらず、断片化されます。

1) さまざまな機能

スタック メモリはローカル変数とメソッド呼び出しの保存に使用され、ヒープ メモリは Java のオブジェクトの保存に使用されます。メンバー変数、ローカル変数、クラス変数のいずれであっても、それらが指すオブジェクトはヒープ メモリに格納されます。

2)、異なる共有

スタック メモリはスレッドに対してプライベートです。ヒープ メモリはすべてのスレッドに共通です。

3)、さまざまな例外エラー

スタック メモリまたはヒープ メモリが不足している場合、例外がスローされます。

スタック領域が不十分です: java.lang.StackOverFlowError。

ヒープ領域が不十分です: java.lang.OutOfMemoryError。

4)、スペース サイズ

スタックのスペース サイズは、ヒープのスペース サイズよりもはるかに小さいです。

クラスロードメカニズムについてご存知ですか?

これらは面接の質問を暗記したものです

JVM クラスの読み込みは、読み込み、検証、準備、解析、解析の 5 つのプロセスに分かれています。以下の図に示すように、初期化、使用、およびアンインストールが行われます。

先週、XX保険の面接を受けましたが、とても良かったです。 ! !

ロード、検証、準備、解析、解析の 5 つのプロセスの具体的なアクションを見てみましょう。そして初期化。

ロード

ロードは主に、.class ファイル (必ずしも .class である必要はありません。以下から取得した ZIP パッケージである場合もあります) 内のバイナリ ワードをロードします。ネットワーク) スロットリングが JVM に読み込まれます。ロード段階で、JVM は次の 3 つのことを完了する必要があります: 1) クラスの完全修飾名を通じてクラスのバイナリ バイト ストリームを取得する; 2) バイト ストリームで表される静的ストレージ構造をランタイム データ構造に変換するメソッド領域; 3) このクラスの java.lang.Class オブジェクトを、メソッド領域内のこのクラスのさまざまなデータへのアクセス エントリとしてメモリ上に生成します。

接続

検証

検証は接続フェーズの最初のステップであり、主に次のことを行います。読み込みを確実にする 受信バイト ストリームは JVM 仕様に準拠しています。検証フェーズでは、次の 4 段階の検証アクションが完了します。 1) ファイル形式の検証 2) メタデータの検証 (Java 言語仕様に準拠しているかどうか) 3) バイトコードの検証 (プログラムのセマンティクスが正当かつ論理的であることを確認するため) 4)シンボル参照の検証(次の解析ステップが正常に実行できることを確認)

準備

主にメソッド領域の静的変数のメモリ確保とデフォルトの初期値の設定価値。

解析

は、仮想マシンが定数プール内のシンボル参照を直接参照に置き換えるプロセスです。

初期化

初期化フェーズはクラス読み込みプロセスの最後のステップであり、主にプログラム内の代入ステートメントに従ってクラス変数に値をアクティブに代入します。注: 1) 親クラスがあり、親クラスを初期化する場合は、最初に親クラスを初期化します; 2) その後、サブクラスの初期化ステートメントを実行します。

フル GC を引き起こす可能性のある条件は何ですか?

# ちょっと話が飛びますが、ガベージコレクションのアルゴリズムなどについて質問しようと思ったのですが、ここで質問させていただきました。準備ができていなかったので、何気なく 2 つのことを言っただけで、面接官は明らかに不満を感じました。

通常、フル GC をトリガーするシナリオは 5 つあります。

(1) System.gc を呼び出すと、システムは フル GC # の実行を推奨します。 ## ですが、実行する必要はありません

(2) 旧世代の容量不足

(3) 容量不足を解消する方法

(4) を入力します。マイナー GC 通過後の古い世代 > 古い世代で使用可能なメモリの平均サイズ

(5) Eden領域、From Space領域からTo Space領域へコピーする際、オブジェクトサイズがTo Spaceの空きメモリを超えた場合、オブジェクトは旧世代に転送され、旧世代の空きメモリがなくなる世代はオブジェクトのサイズよりも小さいです。つまり、古い世代が新しい世代から古い世代にオブジェクトを格納できない場合、フル GC がトリガーされます。

オンライン システムの CPU が非常に高いのですが、どうすればよいですか?

この質問に対する答えはあまり満足のいくものではありません。ティアン兄弟が文書をまとめたことは知っていますが、どこに帰るべきかわかりません。途中で読んでみたら、これも覚えられる面接の質問だったので、実は答えていませんでした。戻ってもっと勉強してください。面接官が来て、「わかりました、今日の面接はここで終わります。ここで人事に報告します。ここで待っていてください」と言いました。

しばらくすると、美人の人事が笑顔でやって来ました(問題は深刻ではないと思っていました)が、実際は...

あなたは「YYさん、面接官から面接状況についてフィードバックがありました。再度検討させていただきます。先に帰ってください。結果は後ほどお電話させていただきます。」 ですか?

(⊙o⊙)...、n日経っても音沙汰なし、本当にかっこよかったです。

従来の操作は次のとおりです:

1.top oder by with P: 1040 // まずプロセス負荷でソートされた axLoad(pid) を見つけます

2.top - Hp process PID: 1073 // 関連するロード スレッド PID

3 を検索します。 printf "0x%x\n" Thread PID: 0x431 // 後の jstack ログの検索に備えて、スレッド PID を 16 進数に変換します

4. jstack プロセス PID | vim/hex スレッド PID - // 例: jstack 1040|vim /0x431 -

要約

#面接プロセス全体は比較的簡単で、面接官はかなり優秀でした。準備ができていなかった自分を責めただけです。2 年間働いているので、見たことのない質問もいくつかありましたが、面接官が尋ねた質問は準備したこと(面接の質問を暗記すること)は達成できますし、個人的に経験する必要はありません。

以上が先週、XX保険の面接を受けましたが、とても良かったです。 ! !の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はJava后端技术全栈で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
前の記事:Matlab における iframe の意味次の記事:なし