みなさん、またこんにちは!私たちはジュニア、ミドル、シニアの開発者向けの250 以上の質問に対する回答を引き続き探しています。質問は非常に興味深いもので、私自身もそれを分析するのが好きです。そのような瞬間に、理論的知識のギャップや、最も予期しない場所でギャップを発見することができます。前の部分はこの記事にあります。しかし、始める前に、次のことを思い出していただきたいと思います。
- 情報が再度重複しないように、この一連の記事に関連する質問は省略します。これらの資料には、Java Core の面接で最も一般的な (よくある) 質問が含まれているため、これらの資料を読むことをお勧めします。
- DOU に関する質問はウクライナ語で行われますが、ここではすべてロシア語で答えます。
- 答えをもっと詳しく説明することもできますが、各質問に対する答えを書くと記事全体が書けてしまう可能性があるため、ここでは書きません。そして、面接ではそこまで詳しく聞かれることはありません。
11. Object クラスのすべてのメソッドに名前を付けます
Object クラスには 11 のメソッドがあります。- Class<?> getClass() — 現在のオブジェクトのクラスを取得します。
- int hashCode() — 現在のオブジェクトのハッシュ コードを取得します。
- booleanquals (Object obj) - 現在のオブジェクトと別のオブジェクトの比較。
- Object clone() - 現在のオブジェクトのコピーを作成して返します。
- String toString() — オブジェクトの文字列表現を取得します。
- void Notice() - このオブジェクトのモニターで待機している 1 つのスレッドを起動します (スレッドの選択はランダムです)。
- void NoticeAll() - このオブジェクトのモニターを待機しているすべてのスレッドを起動します。
- void wait() - 現在のモニター上で現在のスレッドをスタンバイ モード (フリーズ) に切り替えます。何らかの Notice または NotifyAll がスレッドをウェイクアップするまで、同期ブロック内でのみ動作します。
- void wait(long timeout) - 現在のモニター (現在同期されているモニター) 上の現在のスレッドもフリーズしますが、この状態を終了するためのタイマーを使用します (または、再度、notify または NoticeAll がウェイクアップするまで)。
- void wait(long timeout, int nanos) - 上で説明したメソッドと似ていますが、フリーズを終了するためのより正確なタイマーが使用されます。
- void Finalize() - このオブジェクトを削除する前に、ガベージ コレクターはこのメソッドを (最後に) 呼び出します。占有されているリソースをクリーンアップするために使用されます。
12. リソースを扱う場合の try-with-resources と try-catch-finally の違いは何ですか?
通常、try-catch-finally を使用する場合、最後のブロックはリソースを閉じるために使用されます。Java 7 では、新しいタイプの演算子try-with-resourcesが導入されました。これは、リソースを解放するためのtry-catch-finallyに似ていますが、よりコンパクトで読みやすくなっています。try-catch-finally がどのようなものかを思い出してみましょう。String text = "some text......";
BufferedWriter bufferedWriter = null;
try {
bufferedWriter = new BufferedWriter(new FileWriter("someFileName"));
bufferedWriter.write(text);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
次に、 try-with-resources を使用してこのコードを書き直してみましょう。
String text = "some text......";
try(BufferedWriter bufferedWriter =new BufferedWriter(new FileWriter("someFileName"))) {
bufferedWriter.write(text);
} catch (IOException e) {
e.printStackTrace();
}
なんだか楽になってきましたね。簡略化に加えて、いくつかのポイントがあります。
-
try-with-resourcesでは、括弧内で宣言されたリソース (閉じられる) は、 AutoCloseable インターフェースとその唯一のメソッドclose()を実装する必要があります。
closeメソッドは暗黙的なfinallyブロックで実行されます。そうでない場合、プログラムはどのようにして特定のリソースを閉じる方法を正確に理解するのでしょうか?
ただし、リソースの実装とその終了メソッドを独自に作成することはほとんどないでしょう。
-
ブロック実行のシーケンス:
- ブロックを試してください。
- 最後に暗黙的に。
- 前のステップで例外をキャッチするcatchブロック。
- 最後に明示的に。
原則として、リストの下位にある例外は上位にある例外を中断します。
13. ビット演算とは何ですか?
ビット単位の演算は、論理演算とビット単位のシフトを含むビット文字列に対する演算です。 論理演算:-
ビットごとのAND - ビット値を比較し、その過程で 0 (偽) に設定されたビットは、結果の対応するビットを 0 に設定します。つまり、比較される両方の値でビットが 1 (真) であった場合、結果も1になります。
- AND、&として表されます
例: 10111101 & 01100111 = 00100101
-
ビット単位のOR は、前の演算の逆の演算です。1 に設定されたビットは、結果内の同様のビットを 1 に設定します。したがって、両方の比較値でビットが 0 だった場合、結果のビットも 0 になります。
- OR、|として表されます。
例: 10100101 | 01100011 = 11100111
-
bitwise NOT - 1 つの値に適用され、ビットを反転 (反転) します。つまり、1 だったビットは 0 になります。そして0だったものは1になります。
- NOT、~として表されます
例: ~10100101 = 01011010
ビット 単位の排他的 OR - ビット値を比較し、両方の値のビットが 1 に等しい場合、結果は 0 になり、両方の値のビットが 0 の場合、結果は 0 になります。結果が 1 になるには、ビットのうちの 1 つだけが 1 に等しく、2 番目のビットが 0 に等しくなる必要があります。 - XOR、^として示されます。
例: 10100101 ^ 01100011 = 11000110
- 01100011 >> 4 = 00000110
- 01100011 << 3 = 00011000
14. Java のオブジェクトとなる標準の不変クラスは何ですか?
Immutableは、元のパラメータの変更を許可しないオブジェクトです。変更したいパラメータを含む、指定されたタイプの新しいオブジェクトを返すメソッドが含まれる場合があります。いくつかの標準的な不変オブジェクト:- Java で最も有名な不変オブジェクトは String です。
- 標準型をラップするラッパー クラスのインスタンス: Boolean、Character、Byte、Short、Integer、Long、Double、Float。
- 通常、特に大きな数値に使用されるオブジェクト - BigInteger と BigDecimal。
- スタックトレース (例外スタックトレースなど) の単位であるオブジェクト StackTraceElement。
- File クラスのオブジェクト - ファイルを変更できますが、同時にそれ自体は不変です。
- UUID - 要素の一意の ID としてよく使用されます。
- java.time パッケージのすべてのクラス オブジェクト。
- ロケール - 地理的、政治的、または文化的地域を定義するために使用されます。
15. 通常のオブジェクトに対する不変オブジェクトの利点は何ですか?
- このようなオブジェクトは、マルチスレッド環境で使用しても安全です。これらを使用すると、スレッドの競合状態によるデータの損失を心配する必要がなくなります。通常のオブジェクトを操作する場合とは異なり、この場合は慎重に検討し、並列環境でオブジェクトを使用するためのメカニズムを考案する必要があります。
- 不変オブジェクトはマップ内で適切なキーです。なぜなら、可変オブジェクトを使用した後にオブジェクトの状態が変化すると、HashMap を使用するときに混乱が生じる可能性があるからです。オブジェクトはまだ存在しますが、containsKey()を使用すると存在しない可能性があります。見つけられた。
- 不変オブジェクトは、プログラムの実行中に決して変更すべきではない不変 (定数) データを格納するのに最適です。
- 「失敗に対する原子性」 - 不変オブジェクトが例外をスローした場合でも、望ましくない (壊れた) 状態に留まりません。
- これらのクラスはテストが簡単です。
- コピー コンストラクターやクローン実装などの追加のメカニズムは必要ありません。
OOPに関する質問
16. 手続き型プログラミングと比較した場合、OOP には一般的にどのような利点がありますか?
OOP の利点は次のとおりです。- 複雑なアプリケーションは手続き型プログラミングよりも簡単に作成できます。すべてが小さなモジュール (相互作用するオブジェクト) に分割され、その結果、プログラミングはオブジェクト間の関係に帰着するからです。
- OOP を使用して作成されたアプリケーションは、(設計概念に従っている限り) 変更がはるかに簡単です。
- データとその操作は単一のエンティティを形成するため、アプリケーション全体に散らばることはありません (手続き型プログラミングではよく起こります)。
- 情報のカプセル化により、最も重要なデータがユーザーから保護されます。
- クラスを使用すると、それぞれが独自の属性値を持つ多数のオブジェクトを作成できるため、同じコードを異なるデータで再利用することができます。
- 継承とポリモーフィズムにより、(同様の機能を複製する代わりに) 既存のコードを再利用および拡張することもできます。
- 手続き型アプローチよりもアプリケーションの拡張が簡単です。
- OOP アプローチにより、実装の詳細を抽象化することができます。
17. OOP の欠点を教えてください
残念ながら、次のようなものも存在します。- OOP では、何かを書く前に習得する必要のある多くの理論的知識が必要です。
- OOP の考え方は、理解して実際に適用するのはそれほど簡単ではありません (ある程度の哲学者である必要があります)。
- OOP を使用すると、システムの構成がより複雑になるため、ソフトウェアのパフォーマンスがわずかに低下します。
- OOP アプローチでは、すべてがクラス、インターフェイス、メソッドで構成され、通常の変数よりも多くのメモリを消費するため、より多くのメモリが必要になります。
- 初期分析に必要な時間は、手順分析に比べて長くなります。
18. 静的および動的ポリモーフィズムとは何ですか
ポリモーフィズムにより、オブジェクトは同じクラスまたはインターフェイスに対して異なる動作を行うことができます。多型には 2 つのタイプがあり、早期バインディングおよび後期バインディングとも呼ばれます。 静的多態性、または以前のバインディング:- コンパイル時 (プログラムのライフサイクルの初期) に発生します。
- コンパイル時にどのメソッドを実行するかを決定します。
- メソッドのオーバーロードは静的多態性の一例です。
- 早期バインディングには、プライベート、静的、および端末メソッドが含まれます。
- 継承は早期バインディングには関与しません。
- 静的多相性には、特定のオブジェクトが関係するのではなく、クラスに関する情報が関係します。クラスの型は変数名の左側に表されます。
- 実行時 (プログラムの実行中) に発生します。
- 動的ポリモーフィズムは、メソッドが実行時にどのような特定の実装を持つかを決定します。
- メソッドのオーバーライドは動的多態性の一例です。
- 遅延バインディングは、特定のオブジェクト、その型の参照、またはそのスーパークラスの割り当てです。
- 継承は動的ポリモーフィズムに関連しています。
GO TO FULL VERSION