先週、グループの友人が平安保険に面接に行きました。結果は少し残念でとても残念ですが、落ち込まないでほしいと思います。とおっしゃいましたが、面接で遭遇した問題は基本的に試験問題を暗記すれば解けるものばかりですので頑張ってください!
また、ご不明な点がございましたら、お気軽にご相談いただき、一緒に進めていきたいと思います。
あまり深入りせずに本題に入りましょう。この学生がまとめた技術面接の質問と参考回答を以下に示します。
ベクトル
、ハッシュテーブル
、文字列バッファ
。これらはすべて、スレッド セーフを実現するためにメソッドに同期ロックを追加します。
さらに、すべてのコレクション クラスが JUC パッケージの下にあります
ArrayBlockingQueue
、ConcurrentHashMap
、ConcurrentLinkedQueue
、ConcurrentLinkedDeque
など。これらもスレッドセーフです。
幸いなことに、これで回答は終わりで、面接官はそれ以上質問しませんでした。そうでなければ、JUC の下でこれらの質問に答えることはできなかったでしょう。
#この質問は比較的簡単なので、最後の 123 は問題ないと言えます。
Java
では、次の 4 つの方法でオブジェクトを作成できます。
#この質問に対する答えはあまり良くなく、当時は toString、equals、hashCode、wait、notify、notifyAll しか覚えていませんでした。他には何も考えませんでした。面接官はうなずき続け、大丈夫だろうという印象を与えた。
java.lang.Object
対応するメソッドの意味は次のとおりです。
clone メソッド
オブジェクトの浅いコピーを実装するための保護されたメソッド。このメソッドは、Cloneable インターフェイスが実装されている場合にのみ呼び出すことができます。それ以外の場合は、CloneNotSupportedException 例外が発生します。ディープ コピーも必要です。Cloneable を実装し、そのメンバー変数が参照型の場合は、Cloneable も実装してから、clone メソッドを書き直す必要があります。
finalize メソッド
このメソッドはガベージ コレクターに関連しています。オブジェクトをリサイクルできるかどうかを判断する最後のステップは、このメソッドがオーバーライドされているかどうかを判断することです。
equals メソッド
このメソッドは非常に頻繁に使用されます。通常、equals と == は異なりますが、Object では同じです。通常、サブクラスはこのメソッドをオーバーライドします。
hashCode メソッド
このメソッドはハッシュ検索に使用されます。equals メソッドを書き換えるには、通常、hashCode メソッドを書き換える必要があります。このメソッドは、ハッシュ関数を使用する一部のプログラムで使用されます。コレクションで使用されます。
通常、obj1.equals(obj2)==true
を満たす必要があります。 obj1.hashCode()==obj2.hashCode()
と結論付けることができますが、等しい hashCode は必ずしも等しいを満たすわけではありません。ただし、効率を向上させるためには、上記 2 つの条件を可能な限り同等に近づける必要があります。
wait メソッド
synchronized とともに使用される wait メソッドは、現在のスレッドがオブジェクトのロックを待機するようにします。はオブジェクトの所有者である必要があります。つまり、オブジェクトのロックを持っています。 wait() メソッドは、ロックを取得するか中断されるまで待機します。 wait(long timeout) はタイムアウト間隔を設定し、指定された時間内にロックが取得されない場合に戻ります。
このメソッドを呼び出した後、現在のスレッドは次のイベントが発生するまでスリープ状態に入ります。
スレッドはこの時点でスケジュールできますが、中断されると、InterruptedException 例外がスローされます。
notify メソッド
は、synchronized と組み合わせて使用されます。このメソッドは、オブジェクトの 待機キュー 内のスレッド (同期キュー (synchronized queue) CPU をプリエンプトするスレッド用であり、待機キュー内のスレッドとは、ウェイクアップを待っているスレッドを指します。
notifyAll メソッド
このメソッドを synchronized とともに使用すると、このオブジェクトのキューで待機しているすべてのスレッドが起動されます。
これは連続攻撃に似ているように思えます。この質問をして、面接官が少し混乱しているように感じました、私の基礎に疑問がありますが、この質問にはまだ答えることができます。
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 @SpringBootApplication
には非常に重要なアノテーションがあり、これは
- @SpringBootConfiguration
- @EnableAutoConfiguration
- @ComponentScan
@EnableAutoConfiguration
がキー (自動構成を有効にする) 内部的には、META-INF/spring.factories
ファイルの情報が実際に読み込まれ、# でフィルタリングされます。 ## EnableAutoConfiguration はキー データであり、自動構成機能を実現するために IOC コンテナにロードされます。
#この種の問題では、8 部構成のエッセイを暗記する必要があり、インターネット上にたくさんのエッセイが公開されています。データベース トランザクションには 4 つの分離レベルがあり、低から高まで、
Read uncommitted、
Read committed、
Repeatable read です。 、
シリアル化可能。
READ UNCOMMITTED
): この分離レベルでは、他のトランザクションは、このトランザクションによってコミットされていない一部の変更を認識できるため、ダーティ リードの問題が発生します (読み取りフェッチ他のトランザクションのコミットされていない部分、その後トランザクションはロールバックされました); READ COMMITTED
): 他のトランザクションはコミットされた部分の取得のみを行うことができますこのトランザクションの分離レベルには、反復不可能な読み取りの問題があります。同じトランザクションで 2 回読み取りを行った後に得られる結果は、実際には異なります。これは、別のトランザクションがデータを変更したためです。"REPEATABLE READ
)。反復可能な読み取り分離レベルは、上記の反復不可能な読み取りの問題を解決しますが、ファントム読み取りという新しい問題がまだあります。id>10 のデータ行を読み取る場合、関係するすべての行に読み取りロックが追加されます。このとき、トランザクションは id=11 のデータを新規に挿入します。新規に挿入されるため、上記はトリガーされません。ロックの除外、その後、次の実行時にこのトランザクションのクエリでは、id=11 のデータが見つかりますが、最後のクエリ操作ではそれを取得できなかったので、再度挿入すると主キーの競合の問題が発生します。SERIALIZABLE
)。これは最高の分離レベルであり、すべての操作が強制的に逐次的に実行されるため、上記の問題をすべて解決できます。これにより、同時実行パフォーマンスの急激な低下につながります。 この質問「大丈夫です、知っているだけ言ってください。それは皆さんの準備次第です。その時は十分に準備していました。答えても大丈夫だと感じたので、インデックスのメリットとデメリットを一緒に答えました。
インデックスは、Mysql が効率的にデータを取得できるようにするデータ構造です。より一般的に言うと、データベース インデックスは本の巻頭にある目次のようなもので、データベース クエリを高速化できます。
利点
1. クエリ ステートメントでは select *
2 を使用しないでください。サブクエリを最小限に抑え、代わりに関連クエリ (左結合、右結合、内部結合) を使用してください。
3. 削減IN または NOT IN の使用、
4 の代わりに、exists、notexits、または関連するクエリ ステートメントを使用します。 or クエリの代わりに、union または Union all を使用してみてください (重複データがないことを確認する場合、またはデータが存在することを確認する場合)。重複データを削除する必要はありません。すべて結合する方が良いでしょう)
5. where 句では != または <> 演算子を使用しないようにしてください。そうしないと、エンジンがインデックスの使用を断念して、フルテーブルスキャン。
6. where 句でフィールドの null 値を判断しないようにしてください。そうしないと、エンジンはインデックスの使用を断念し、次のような完全なテーブル スキャンを実行します: select id from t where num is null num に指定できます。デフォルト値 0 を設定し、テーブルの num 列に null 値がないことを確認してから、次のようにクエリします。 select id from t where num=0
NND さん、MySQL についてとても聞きたいのですが、この質問には本当に困惑しました。ばかげた話をした後、面接官は少し焦りました。戻ってきて、Tian Ge の Knowledge Planet にアクセスして調べてみましたが、案の定、ほぼ同じ面接の質問でした。準備ができていなかった自分を責めました。
たとえば、次の SQL ステートメント (面接官がその場で答えた SQL
):
select 字段1,字段2 from 表 where id=996
#気になったのですが、996 とはどういう意味ですか? あなたの会社は 996 ですか?何気なく言ってみよう
#これは問題ありません。JVM の知識に精通していれば、答えることができます。 Brother Tian がコンパイルした JVM ランタイム データ領域の説明は非常に優れています。
この 2 つの本質的な違いは、スタックはスレッドに対してプライベートであるのに対し、ヒープはスレッドによって共有されるということです。
スタックはロジックを表す実行時単位です。スタックはスレッドに対応し、基本的なデータ型とヒープ内のオブジェクトへの参照が含まれます。領域は連続しており、フラグメントはありません。
ヒープはデータを表すストレージであり、複数のスタックで共有できます (基本データ型、参照、メンバー内の参照オブジェクトを含む) 領域は連続しておらず、断片化されます。
1) さまざまな機能
スタック メモリはローカル変数とメソッド呼び出しの保存に使用され、ヒープ メモリは Java のオブジェクトの保存に使用されます。メンバー変数、ローカル変数、クラス変数のいずれであっても、それらが指すオブジェクトはヒープ メモリに格納されます。
2)、異なる共有
スタック メモリはスレッドに対してプライベートです。ヒープ メモリはすべてのスレッドに共通です。
3)、さまざまな例外エラー
スタック メモリまたはヒープ メモリが不足している場合、例外がスローされます。
スタック領域が不十分です: java.lang.StackOverFlowError。
ヒープ領域が不十分です: java.lang.OutOfMemoryError。
4)、スペース サイズ
スタックのスペース サイズは、ヒープのスペース サイズよりもはるかに小さいです。
これらは面接の質問を暗記したものです
JVM クラスの読み込みは、読み込み、検証、準備、解析、解析の 5 つのプロセスに分かれています。以下の図に示すように、初期化、使用、およびアンインストールが行われます。
ロード、検証、準備、解析、解析の 5 つのプロセスの具体的なアクションを見てみましょう。そして初期化。
ロード
ロードは主に、.class ファイル (必ずしも .class である必要はありません。以下から取得した ZIP パッケージである場合もあります) 内のバイナリ ワードをロードします。ネットワーク) スロットリングが JVM に読み込まれます。ロード段階で、JVM は次の 3 つのことを完了する必要があります: 1) クラスの完全修飾名を通じてクラスのバイナリ バイト ストリームを取得する; 2) バイト ストリームで表される静的ストレージ構造をランタイム データ構造に変換するメソッド領域; 3) このクラスの java.lang.Class オブジェクトを、メソッド領域内のこのクラスのさまざまなデータへのアクセス エントリとしてメモリ上に生成します。
接続
検証
検証は接続フェーズの最初のステップであり、主に次のことを行います。読み込みを確実にする 受信バイト ストリームは JVM 仕様に準拠しています。検証フェーズでは、次の 4 段階の検証アクションが完了します。 1) ファイル形式の検証 2) メタデータの検証 (Java 言語仕様に準拠しているかどうか) 3) バイトコードの検証 (プログラムのセマンティクスが正当かつ論理的であることを確認するため) 4)シンボル参照の検証(次の解析ステップが正常に実行できることを確認)
準備
主にメソッド領域の静的変数のメモリ確保とデフォルトの初期値の設定価値。
解析
は、仮想マシンが定数プール内のシンボル参照を直接参照に置き換えるプロセスです。
初期化
初期化フェーズはクラス読み込みプロセスの最後のステップであり、主にプログラム内の代入ステートメントに従ってクラス変数に値をアクティブに代入します。注: 1) 親クラスがあり、親クラスを初期化する場合は、最初に親クラスを初期化します; 2) その後、サブクラスの初期化ステートメントを実行します。
# ちょっと話が飛びますが、ガベージコレクションのアルゴリズムなどについて質問しようと思ったのですが、ここで質問させていただきました。準備ができていなかったので、何気なく 2 つのことを言っただけで、面接官は明らかに不満を感じました。
通常、フル GC をトリガーするシナリオは 5 つあります。
(1) System.gc
を呼び出すと、システムは フル GC # の実行を推奨します。 ## ですが、実行する必要はありません
(5) Eden領域、From Space領域からTo Space領域へコピーする際、オブジェクトサイズがTo Spaceの空きメモリを超えた場合、オブジェクトは旧世代に転送され、旧世代の空きメモリがなくなる世代はオブジェクトのサイズよりも小さいです。つまり、古い世代が新しい世代から古い世代にオブジェクトを格納できない場合、フル GC がトリガーされます。
この質問に対する答えはあまり満足のいくものではありません。ティアン兄弟が文書をまとめたことは知っていますが、どこに帰るべきかわかりません。途中で読んでみたら、これも覚えられる面接の質問だったので、実は答えていませんでした。戻ってもっと勉強してください。面接官が来て、「わかりました、今日の面接はここで終わります。ここで人事に報告します。ここで待っていてください」と言いました。
しばらくすると、美人の人事が笑顔でやって来ました(問題は深刻ではないと思っていました)が、実際は...
あなたは「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 サイトの他の関連記事を参照してください。