3つを共有するためのJavaバックグラウンド開発インタビューの質問

オーバーロードとオーバーライドの違い。オーバーロードされたメソッドは、リターンタイプに基づいて区別できますか?

オーバーロード:同じクラス、同じメソッド名、異なるパラメーターリスト(パラメーターの数、タイプ、および順序が異なる);コンストラクターはオーバーロードできます;メソッドのオーバーロードは、戻り値のタイプおよび正式なパラメーター変数名とは関係ありません。推奨されます。戻り値のタイプは同じであることが好ましい。
オーバーライド:サブクラスは、親クラスから継承されたメソッドをオーバーライドします。メソッド名、パラメータリスト、戻り値タイプは同じです。jdk1.5以降、サブクラスタイプの返送がサポートされています(ジェネリックタイプの場合、ジェネリックタイプを消去した後、親クラスはサブクラスと同じにすることができます)。メソッドのアクセス権は変更できません。小さい;サブクラスメソッドは親クラスよりも大きな例外をスローできません; 2つのメソッドは静的または非静的の両方である必要があります。


なぜ型変換Integer[]=>Object[]はい、しかしInteger[]=>int[]そうではない

Integer[]Object[]参照型変換参照型配列の大きな配列に、それが自動的に変換することができる小さいです。

Integer[]するint[]基本データ型、強い直接転送エラー、アレイを介して変換されるべき1つのニーズの参照データ型配列の配列に変換します。


try-catch-finally-return実行順序

例外が発生するかどうかに関係なく、finallyブロックのコードが実行されます。

tryとcatchにreturnステートメントがある場合でも、finallyブロックのコードは実行されます。

finalに戻りがなく、returnがfinallyの前にある場合、finallyのコードが何であっても、戻り値は変更されず、前のreturnステートメントで保存された値のままになります。

最終的にリターンがある場合、tryとcatchのリターンは無効になります。


スレッドのライフサイクル(状態)は何ですか

新しい状態(新規):スレッドオブジェクトが作成されたとき、つまり、次のような新しい状態になりますThread t = new MyThread()

準備完了状態(実行可能):スレッドオブジェクトのstart()メソッドt.start()が呼び出されると、スレッドは準備完了状態になります。準備完了状態のスレッドは、スレッドが準備ができており、CPUがいつでも実行をスケジュールするのを待機していることを意味し、t.start()の実行直後にスレッドが実行されることを意味しません。

実行状態(実行中):CPUがスレッドのスケジュールを準備完了状態で開始すると、スレッドは実際に実行できます。つまり、実行状態になります。注:準備完了状態は、実行状態への唯一のエントリです。つまり、スレッドが実行のために実行状態に入る場合は、最初に準備完了状態である必要があります。

ブロック:何らかの理由で、実行状態のスレッドは一時的にCPUの使用権を放棄して実行を停止します。このとき、ブロック状態になります。準備完了状態になるまで、CPUから再度呼び出されて入る機会があります。実行状態に。ブロッキングのさまざまな原因に応じて、ブロッキング状態は次の3つのタイプに分類できます。

  1. ブロッキングを待機中-実行状態のスレッドはwait()メソッドを実行して、スレッドをブロッキング待機状態にします。

  2. 同期ブロッキング-スレッドは同期同期ロックの取得に失敗し(ロックが他のスレッドによって占有されているため)、同期ブロッキング状態になります。

  3. その他のブロッキング-スレッドのsleep()またはjoin()を呼び出すか、I / O要求を発行することにより、スレッドはブロッキング状態に入ります。sleep()状態がタイムアウトするか、join()がスレッドの終了またはタイムアウトを待機するか、I / O処理が完了すると、スレッドは再び準備完了状態になります。

Dead:スレッドは、例外のために実行を終了するか、run()メソッドを終了します。スレッドはライフサイクルを終了します。


RunnableインターフェースとCallableインターフェースの違い

1. Callableインターフェイスのcall()メソッドは(Futureインターフェイスのget()メソッドを介して)戻り値を持つことができますが、Runnableインターフェイスのrun()メソッドには戻り値がありません。

2. Callableインターフェイスのcall()メソッドは例外のスローを宣言できますが、Runnableインターフェイスのrun()メソッドは例外のスローを宣言できません(runメソッドに例外がある場合、直接スローしてスタック情報を出力しますが、カスタマイズできます例外をキャッチするためのThreadFactoryメソッド)。


Javaのセキュリティはどこにありますか

言語レベルのセキュリティは、主に次の要素に反映されます。

  1. Javaは「参照」を使用して、強力で危険なポインターを置き換えます。ポインタを移動できるため、メモリ領域が利用可能かどうかに関係なく、ポインタがメモリ領域を指すことができます。メモリアドレスが重要なデータを格納したり、他のプログラムによって占有されたりして、ポインタを使用する可能性があるため、これは危険です。また、範囲外の例外を配列する傾向があります。
  2. ガベージコレクションメカニズム:プログラマーはメモリコレクションを直接制御する必要はなく、ガベージコレクターはバックグラウンドで使用されなくなったメモリを自動的に収集します。時間内にリサイクルすることを忘れることによって引き起こされるメモリリークを回避します。プログラムコアライブラリのメモリを再利用するプログラムエラーによって引き起こされるシステムクラッシュを回避します。
  3. 例外処理メカニズム:Java例外メカニズムは、主に5つのキーワード(try、catch、finally、throw、およびthrows)に依存しています。
  4. 強制型変換:強制変換ルールが満たされた場合にのみ、強制変換が成功します。

基礎となるセキュリティ:Javaは、バイトコードの送信に公開鍵暗号化を使用します。

オペレーティング環境には、バイトコードベリファイア、クラスローダー、ランタイムメモリレイアウト、ファイルアクセス制限の4つのレベルのセキュリティ保護メカニズムが用意されています。


スレッドプールを作成する方法は何ですか

  1. newFixedThreadPool(int nThreads) 固定長のスレッドプールを作成します。タスクが送信されるたびに、スレッドプールの最大数に達するまでスレッドが作成され、スレッドサイズは変更されなくなります。予期しないエラーが原因でスレッドの1つが終了すると、スレッドはプールは新しいスレッドを追加します。
  2. newCachedThreadPool() キャッシュ可能なスレッドプールを作成します。スレッドプールのサイズが処理要求を超えると、アイドル状態のスレッドが自動的にリサイクルされ、要求が増加すると、新しいスレッドを自動的に追加できます。スレッドプールのサイズに制限はありません。
  3. newSingleThreadExecutor() これはシングルスレッドのエグゼキュータです。タスクを実行するための単一のワーカースレッドを作成し、このスレッドが異常終了した場合は、新しいスレッドを作成して置き換えます。その機能は、タスクがキューの順序でシリアルに実行されるようにすることです。
  4. newScheduledThreadPool(int corePoolSize) 固定長のスレッドプールが作成され、タイマーと同様に、タスクが遅延または時間指定された方法で実行されます。

SynchronizedとLockの違い

オリジナル構成

  • Synchronizedはキーワードであり、JVMレベルに属します。最下層はmonitorenterとmonitorexitによって完成されます。これは、モニターオブジェクトによって異なります。wait / notifyメソッドもモニターオブジェクトに依存するため、これらのメソッドは同期されたブロックまたはメソッドでのみ呼び出すことができます。
  • ロックはjava.util.concurrent.locks.lockパッケージの下にあり、APIレベルのロックです。

指示

  • Synchronizedでは、ユーザーが手動でロックを解除する必要はありません。コードが完了すると、システムは自動的にスレッドにロックを解除させます。
  • ReentrantLockでは、ユーザーが手動でロックを解除する必要があります。手動で解除しないと、デッドロックが発生する可能性があります。

中断できるかどうか待つ

  • 例外がスローされるか、通常の操作が完了しない限り、同期を中断することはできません。
  • ReentrantLockは中断できます。1つはを渡すことでtryLock(long timeout, TimeUnit unit)もう1つはlockInterruptibly()をコードブロックに入れ、interrupt()メソッドを呼び出して割り込みます。

ロックは公平ですか

  • 同期は不公平なロックです
  • ReentrantLockは、デフォルトでは非公平なロックです。コンストラクターでブール値を渡すことができます。Trueは公平なロックを表し、falseは不公平なロックを表します。

複数の条件をロックする

  • Synchronizedにはブロッキングキューが1つだけあり、ランダムに1つのスレッドまたはすべてのスレッドのみをウェイクアップできます。
  • ReentrantLockは、グループのウェイクアップを実現するために使用され、正確にウェイクアップできます。

String s = new String("xyz");いくつのオブジェクトが作成されましたか?Stringクラスを継承することは可能ですか?

2つまたは1つ。「Xyz」はオブジェクトに対応します。このオブジェクトは文字列定数プールに配置されます。定数「xyz」は、出現回数に関係なく文字列定数プール内のオブジェクトです。新しい文字列が書き込まれるたびに、新しいオブジェクトが作成されます。定数「xyz」を使用して、新しいStringオブジェクトを作成します。「xyz」が以前に作成されている場合は、文字列定数プールから直接取得され、この時点ではStringObjectのみが作成されます。ただし、「xyz」が以前に作成されていない場合は、「xyz」定数オブジェクトが作成されて配置されます。文字列定数プールを入力し、新しい文字列に「xyz」を指す新しいオブジェクトを作成します。この場合、2つのオブジェクトを作成します。

Stringクラスが継承するかどうかについては、答えはノーです。Stringクラスは最終変更を使用するため、継承できません。


HashSetの使用と原則(hashCode()およびequals())

  1. HashSetの最下層はHashMapによって実装され、HashMapの最下層はデータ管理にハッシュテーブルを使用します。ハッシュテーブルのクエリ速度は非常に速く、時間の複雑さはO(1)です。ハッシュテーブルは、オブジェクトの特性を表す整数値であるハッシュコードハッシュコードを使用する必要があります。address = hash(hashcode)、ここで、hashはハッシュ関数、addressはハッシュテーブルデータのストレージアドレスです。Javaのハッシュテーブルで2つの要素が重複しているかどうかを判断するには、hashCode()とequals()を使用します。hashCode()はテーブル内のデータの保存場所を決定し、equals()は同じデータが存在するかどうかを決定します。
  2. カスタムクラスをHashSetコレクションに配置する場合は、hashCode()をオーバーライドする必要があります。カスタムクラスが書き換えられていない場合、オブジェクトのhashCode()が呼び出されますが、オブジェクトのhashCode()は、実際には参照されているオブジェクトのアドレスです。さらに、システムクラスはすでにhashCode()メソッドをカバーしているため、書き直す必要はありません。
  3. HashSetによって追加された要素は、HashMapのキー位置に格納されますが、HashMapの値は、空のオブジェクトであるデフォルトの定数PRESENTを取ります。
  4. HashSetのaddメソッドは、HashMapのputメソッドによって実装されます。最初に、追加するオブジェクトのハッシュコードを計算し、値に従って現在のオブジェクトを格納する場所を取得します。その位置にオブジェクトがない場合、セットはオブジェクトがセットに存在しないと見なし、直接追加します。この位置にオブジェクトがある場合は、コレクションに追加するオブジェクトを、equalsメソッドを使用してその位置にあるオブジェクトと比較します。equalsメソッドがfalseを返す場合、コレクションはオブジェクトがコレクションに存在しないと見なし、次にオブジェクトを比較します。リンクリストまたは赤黒ツリーを使用して挿入します。equalsメソッドがtrueを返す場合は、要素が繰り返されていることを意味します。

詳細を知りたい場合は、WeChatパブリックアカウントをフォローしてください:Renda_Zhang

おすすめ

転載: blog.csdn.net/qq_40286307/article/details/108890773