この記事では、雇用主が候補者のJavaと一般的なオブジェクト指向のプログラミング機能をテストできるようにするJavaインタビューで、さまざまな種類のインタビューの質問について説明します。次の章は、2つの以前の記事と次の記事に分かれています。最初の記事では、オブジェクト指向のプログラミングとその特性、Javaとその機能に関する一般的な質問、Javaコレクションクラス、ガベージコレクター、および2番目の記事では、主に例外処理、Javaアプレット、スイング、JDBC、リモートメソッドコール(RMI)、サーブレット、JSPについて説明します。
始める!
目次
オブジェクト指向プログラミング(OOP)
一般的なJavaの問題
Javaスレッド
Javaコレクションクラス
ゴミコレクター
オブジェクト指向プログラミング(OOP)
Javaは、同時、クラスベース、オブジェクト指向をサポートするコンピュータープログラミング言語です。オブジェクト指向ソフトウェア開発の利点は、以下にリストされています。
オブジェクト指向プログラミングには、カプセル化、相続、多型、抽象化など、多くの重要な機能があります。次の章では、これらの特性を1つずつ分析します。
パッケージ
カプセル化は、内部の特徴と動作を非表示にする機能をオブジェクトに提供します。オブジェクトは、他のオブジェクトによってアクセスできるいくつかの方法を提供して、その内部のデータを変更します。 Javaには、パブリック、プライベート、保護された3つの修飾子があります。各修飾子は、同じパッケージまたは異なるパッケージにある他のオブジェクトに異なるアクセス権を与えます。
カプセル化を使用することの利点の一部は次のとおりです。
カプセル化に関する詳細と例については、このドキュメントを参照してください。
多型
多型は、基礎となるさまざまなデータ型に対して同じインターフェイスを実証するために言語をプログラミングする能力です。多型タイプの操作は、他のタイプの値に適用できます。
継承
継承は、ベースクラスからフィールドとメソッドを取得する機能をオブジェクトに提供します。継承は再利用されたコードの行を提供し、既存のクラスを変更せずに既存のクラスに新しい機能を追加することもできます。
抽象的な
抽象化は、アイデアを具体的なインスタンスから分離するステップであるため、実装の詳細ではなく機能に基づいてクラスを作成します。 Javaは、インターフェイスのみを公開するがメソッドの実装が含まれていない抽象クラスの作成をサポートしています。この抽象的な手法の主な目的は、クラスの動作を実装の詳細から分離することです。
抽象化とカプセル化の違い
抽象化とカプセル化は補完的な概念です。一方では、抽象的なオブジェクトの動作に焦点を当てています。一方、カプセル化は、オブジェクトの動作の詳細に焦点を当てています。一般に、カプセル化は、オブジェクトの内部状態情報を隠すことによって達成されます。したがって、カプセル化は、抽象化を提供する戦略と見なすことができます。
一般的なJavaの問題
1. Java仮想マシンとは何ですか? Javaが「プラットフォームに依存しないプログラミング言語」と呼ばれるのはなぜですか?
Java仮想マシンは、Java Bytecodeを実行できる仮想マシンプロセスです。 Javaソースファイルは、Java仮想マシンで実行できるバイトコードファイルにコンパイルされます。
Javaは、プログラマーが各プラットフォームを個別に書き換えたり再コンパイルしたりすることなく、アプリケーションが任意のプラットフォームで実行できるように設計されています。 Java仮想マシンは、基礎となるハードウェアプラットフォームの命令長とその他の機能を知っているため、これを可能にします。
2。JDKとJREの違いは何ですか?
Java Runtime Environment(JRE)は、Javaプログラムを実行するJava仮想マシンです。また、アプレットを実行するために必要なブラウザプラグインも含まれています。 Java Development Toolkit(JDK)は、JRE、コンパイラ、その他のツール(Javadoc、Java Debuggerなど)を含む完全なJavaソフトウェア開発パッケージであり、開発者がJavaアプリケーションを開発、コンパイル、実行できるようにします。
3.「静的な」キーワードとはどういう意味ですか? Javaのプライベートまたは静的な方法をオーバーライドできますか?
「静的」キーワードは、メンバー変数またはメンバーメソッドに属するクラスのインスタンス変数なしでアクセスできることを示します。
上書きはランタイム動的結合に基づいているため、Javaの静的方法は上書きできません。一方、静的メソッドはコンパイル時に静的結合です。静的方法はクラスのどのインスタンスにも関係がないため、概念的に適用されません。
4.静的環境で非静的変数にアクセスすることは可能ですか?
静的変数はJavaのクラスに属し、すべての場合のその値は同じです。クラスがJava仮想マシンによってロードされると、静的変数が初期化されます。コードがインスタンスなしで非静的変数にアクセスしようとする場合、これらの変数はまだ作成されておらず、インスタンスに関連付けられていないため、コンパイラはエラーを報告します。
5. Javaでサポートされているデータ型は何ですか?自動分解とは何ですか?
Java言語でサポートされている基本的なデータ型は次のとおりです。
自動ボクシングは、基本データ型と対応するオブジェクトラッパータイプの間でJavaコンパイラが行った変換です。たとえば、intを整数に、ダブルダブルに変換します。そうでなければ、それは自動解凍です。
6. Javaでのメソッドのオーバーライドとメソッドのオーバーロードは何を意味しますか?
Javaでのメソッドオーバーロードは、2つ以上のメソッドが同じメソッド名を持っているが、同じクラスで異なるパラメーターを持っている場合に発生します。対照的に、メソッドオーバーライドとは、サブクラスが親クラスの方法を再定義することを意味します。メソッドオーバーライドには、同じメソッド名、パラメーターリスト、および戻りタイプが必要です。上線は、カバーする方法へのアクセスを制限しない場合があります。
7. Javaのコンストラクターとは何ですか?コンストラクターのオーバーロードとは何ですか?コピーコンストラクターとは何ですか?
新しいオブジェクトが作成されると、コンストラクターが呼び出されます。各クラスにはコンストラクターがあります。プログラマがクラスにコンストラクターを提供しない場合、Javaコンパイラはクラスのデフォルトコンストラクターを作成します。
Javaでのコンストラクターの過負荷とメソッドの過負荷は非常に似ています。複数のコンストラクターをクラス用に作成できます。各コンストラクターには、独自のユニークなパラメーターリストが必要です。
Javaは、C ++のようなコピーコンストラクターをサポートしていません。この違いは、コンストラクターを自分で書いていない場合、Javaがデフォルトのコピーコンストラクターを作成しないためです。
8。Javaは多発性相続をサポートしていますか?
サポートされていない、Javaは複数の相続をサポートしていません。各クラスは1つのクラスのみを継承できますが、複数のインターフェイスを実装できます。
9.インターフェイスと抽象クラスの違いは何ですか?
Javaは、抽象クラスとインターフェイスの作成を提供およびサポートします。それらの実装には類似点があり、違いは次のとおりです。
JDK8の抽象クラスとインターフェイスの違いを参照することもできます
10.価値の合格と参照の合格とは何ですか?
オブジェクトは値によって渡されます。つまり、オブジェクトのコピーが渡されます。したがって、オブジェクトコピーが変更されたとしても、ソースオブジェクトの値は影響を受けません。
オブジェクトは参照によって渡されます。つまり、実際のオブジェクトではなく、オブジェクトの参照です。したがって、参照されるオブジェクトの外部変更は、すべてのオブジェクトに反映されます。
Javaスレッド
11.プロセスとスレッドの違いは何ですか?
プロセスは実行されるアプリケーションであり、スレッドはプロセス内の実行シーケンスです。プロセスには複数のスレッドがあります。スレッドは、軽量プロセスとも呼ばれます。
12.スレッドを作成する方法はいくつありますか?どちらが好きですか?なぜ?
スレッドを作成するには3つの方法があります。
実行可能なインターフェイスを実装することは、スレッドクラスを継承する必要がないため、より一般的です。アプリケーション設計で他のオブジェクトが継承されている場合、これには複数の継承が必要です(Javaは複数の継承をサポートしていません)、インターフェイスのみを実装できます。同時に、スレッドプールは非常に効率的で実装して使用しやすいです。
13。スレッドのいくつかの利用可能な状態の要約説明。
実行中、スレッドは次の状態にあります。
14.同期方法と同期コードブロックの違いは何ですか?
Java言語では、各オブジェクトにはロックがあります。スレッドは、同期されたキーワードを使用して、オブジェクトのロックを取得できます。同期されたキーワードは、メソッドレベル(粗粒ロック)またはコードブロックレベル(細粒ロック)で適用できます。
15.モニター内のスレッドを同期する方法は?プログラムはどのレベルの同期を行うべきですか?
モニターとロックは、Java仮想マシンで一緒に使用されます。モニターは同期コードブロックを監視し、一度に1つのスレッドのみが同期コードブロックを実行するようにします。各モニターはオブジェクト参照に関連付けられています。スレッドでは、ロックを取得する前に同期コードを実行することはできません。
16.デッドロックとは何ですか?
両方のプロセスが、実行を続ける前に相手が実行を完了するのを待っている場合、デッドロックが発生します。その結果、両方のプロセスが無限の待機に閉じ込められています。
17. nスレッドがデッドロックを引き起こすことなくnリソースにアクセスできるようにする方法は?
マルチスレッドを使用する場合、デッドロックを回避する非常に簡単な方法は、ロックが取得される順序を指定し、スレッドに指定された順序でロックを取得するように強制することです。したがって、すべてのスレッドが同じ順序でロックしてロックされている場合、デッドロックはありません。
Javaコレクションクラス
18. Java Collectionクラスフレームワークの基本的なインターフェイスは何ですか?
Javaコレクションクラスは、オブジェクトのセットでの操作をサポートする、適切に設計されたインターフェイスとクラスのセットを提供します。 Javaコレクションクラスで最も基本的なインターフェイスは次のとおりです。
19.なぜコレクションクラスがクローン可能でシリアル化可能なインターフェイスを実装しないのですか?
コレクションクラスインターフェイスは、要素と呼ばれる一連のオブジェクトを指定します。コレクションクラスインターフェイスの各特定の実装クラスは、独自の方法で要素を保存およびソートすることを選択できます。いくつかのコレクションクラスは重複するキーを許可しますが、他のクラスはそうではありません。
20.イテレーターとは何ですか?
Iteratorインターフェイスは、収集要素を繰り返す多くの方法を提供します。各コレクションクラスには、イテレーターインスタンスを返すことができる反復方法が含まれています。イテレーターは、反復中に基礎となるコレクションの要素を削除できます。
クローニングまたはシリアル化の意味論と意味は、特定の実装に関連しています。したがって、コレクションクラスの特定の実装により、クローニングまたはシリアル化方法を決定する必要があります。
21. IteratorとListiteratorの違いは何ですか?
違いは以下にリストされています。
22.高速障害(フェイルファスト)と安全な障害(フェイルセーフ)の違いは何ですか?
Iteratorのセキュリティ障害は、基礎となるコレクションのコピーを作成することに基づいているため、ソースコレクションの変更の影響を受けません。 java.utilパッケージの下のすべてのコレクションクラスはすぐに失敗しますが、java.util.concurrentパッケージの下のすべてのクラスは安全に失敗します。ファーストフェイルのイテレーターは、同時モジーゼーションの例外をスローしますが、安全な故障したイテレーターはこのような例外を投げません。
23. JavaのHashmapの実用的な原則は何ですか?
JavaのHashmapは、キー価値のペアの形で要素を保存します。 HashMapには、HashCode()およびEquals()メソッドを使用して、コレクションに要素を追加および取得するハッシュ関数が必要です。 Put()メソッドが呼び出されると、HashMapはキーのハッシュ値を計算し、セットの適切なインデックスにキー値ペアを保存します。キーが既に存在する場合、値は新しい値に更新されます。ハッシュマップのいくつかの重要な機能は、その容量、負荷係数、およびしきい値のサイズ変更です。
24. hashcode()とequals()メソッドの重要性はどこに反映されますか?
JavaのHashMapは、HashCode()およびEquals()メソッドを使用して、キー値ペアのインデックスを決定します。これらの2つの方法は、キーに基づいて値を取得するときにも使用されます。これらの2つの方法が正しく実装されていない場合、2つの異なるキーが同じハッシュ値を持つ可能性があるため、セットによって等しいと見なされる場合があります。さらに、これらの2つの方法は、重複する要素を発見するためにも使用されます。したがって、これら2つの方法の実装は、ハッシュマップの正確性と正確性に不可欠です。
25。ハッシュマップとハッシュテーブルの違いは何ですか?
26.配列(配列)とリスト(ArrayList)の違いは何ですか? ArrayListの代わりにアレイを使用する必要がありますか?
次のリストには、配列と配列リストの違いをリストします。
27. ArrayListとLinkedListの違いは何ですか?
ArrayListとLinkedListの両方の両方がリストインターフェイスを実装しており、次の違いがあります。
ArrayListはインデックスベースのデータインターフェイスであり、その基礎となるレイヤーは配列です。これにより、O(1)の時間の複雑さを持つ要素へのランダムアクセスが可能になります。それに応じて、LinkedListはそのデータを要素リストの形式で保存します。各要素は、以前の要素と次の要素にリンクされています。この場合、要素を見つける時間の複雑さはo(n)です。
ArrayListと比較して、LinkedListの挿入、追加、および削除はより速くなります。これは、要素がコレクション内の任意の位置に追加されると、サイズを再計算したり、アレイのようにインデックスを更新する必要はないためです。
LinkedListは、各ノードに2つの参照を保存し、1つは前の要素を指し、もう1つは次の要素を指しているため、LinkedListはArrayListよりも多くのメモリを占有します。
また、ArrayListとLinkedListを参照することもできます。
28. Comparable and Comparator Interfacesは何をしますか?それらの違いをリストします。
Javaは、1つの比較()メソッドのみを含む同等のインターフェイスを提供します。この方法では、2つのオブジェクトをソートできます。具体的には、入力オブジェクトが既存のオブジェクトよりも少なく、等しく、大きいことを示すために、負の数、0、および正の数を返します。
Javaは、2つの方法を含むコンパレータインターフェイスを提供します:比較()とequals()。 Compare()メソッドは、2つの入力パラメーターを並べ替えるために使用されます。負の数値0を返し、正の数値は、最初のパラメーターが2番目のパラメーターよりも少なく、等しく、大きいことを示します。 equals()メソッドは、入力パラメーターがコンパレータに等しいかどうかを決定するために使用されるパラメーターとしてオブジェクトを必要とします。このメソッドは、入力パラメーターもコンパレータであり、入力パラメーターと現在のコンパレーターソート結果が同じ場合にのみTRUEを返します。
29. Javaの優先順位キューとは何ですか?
PriorityQueueは、優先ヒープに基づいた無限のキューであり、その要素は自然な順序でソートされます。作成されると、要素のソートを担当するコンパレータを提供できます。 PriorityQueueは、自然な順序がないか、関連するコンパレータがないため、ヌル値を許可しません。最後に、PriorityQueueはスレッドセーフではなく、着信とデキュー化の時間の複雑さはO(log(n))です。
30.大きなOシンボル(Big-O Notation)を理解していますか?さまざまなデータ構造の例を挙げてもらえますか?
Big Oシンボルは、データ構造の要素が増加すると、アルゴリズムのスケールまたはパフォーマンスが最悪のシナリオでどれほど優れているかを説明しています。
大きなOシンボルを使用して、メモリ消費などの他の動作を説明することもできます。コレクションクラスは実際にはデータ構造であるため、通常、大きなOシンボルを使用して、時間、メモリ、パフォーマンスに基づいて最適な実装を選択します。大きなOシンボルは、大量のデータのパフォーマンスについて良い説明をすることができます。
31.順序付けられていないアレイを使用するか、順序付けられた配列を使用するかをトレードオフする方法は?
順序付けられた配列の最大の利点は、検索の時間の複雑さがo(log n)であり、順序付けられていない配列はo(n)であることです。順序付けられた配列の欠点は、挿入操作の時間の複雑さがo(n)であることです。これは、新しい要素のために大きな値を持つ要素を後方に移動する必要があるためです。対照的に、順序付けられていない配列の挿入時間の複雑さは、定数o(1)です。
32。Javaコレクションクラスフレームワークのベストプラクティスは何ですか?
アプリケーションのニーズに応じて使用する種類のコレクションを正しく選択することは、パフォーマンスにとって非常に重要です。たとえば、要素のサイズが固定され、事前に既知の場合は、配列の代わりに配列を使用する必要があります。
一部のコレクションクラスでは、初期容量を指定できます。したがって、保存された要素の数を推定できれば、ハッシュ値の再計算や拡張を避けるために初期容量を設定できます。
タイプの安全性、読みやすさ、堅牢性のために、ジェネリックは常に使用されます。同時に、ジェネリックを使用すると、実行時にClassCastExceptionを回避できます。
JDKが提供する不変のクラスをマップのキーとして使用すると、HashCode()およびEquals Methodの実装を避けることができます。
インターフェイスは、プログラミング時に実装よりも優れています。
基礎となるコレクションが実際に空の場合は、長さ0のセットまたは配列を返し、nullを返さないでください。
33。列挙インターフェイスとイテレーターインターフェイスの違いは何ですか?
列挙は、メモリの消費量を減らしながら、反復因子の2倍の速さです。ただし、他のスレッドはコレクション内のオブジェクトをイテレータによって移動するオブジェクトを変更できないため、イテレーターは列挙よりもはるかに安全です。同時に、Iteratorを使用すると、発信者は基礎となるコレクションの要素を削除できます。これは列挙できません。
34。ハッシュセットとツリーセットの違いは何ですか?
ハッシュセットはハッシュテーブルによって実装されるため、その要素は順序付けられていません。 add()、remove()、およびcontain()メソッドの時間の複雑さはo(1)です。
一方、ツリーセットは木の形の構造によって実装され、その内部の要素が順序付けられます。したがって、add()、remove()、およびcontains()メソッドの時間の複雑さはo(logn)です。
ゴミコレクター
35。Javaのゴミコレクションの目的は何ですか?ゴミはいつ集められますか?
ガベージコレクションの目的は、アプリケーションがもはやリソースを解放して再利用するために使用しないオブジェクトを特定して破棄することです。
36。System.gc()とruntime.gc()は何をしますか?
これらの2つの方法は、JVMにゴミコレクションを実行するように促すために使用されます。ただし、すぐに開始するか、ガベージコレクションの遅延はJVMに依存します。
37。finalize()メソッドはいつ呼び出されますか?デストラクタの目的は何ですか?
オブジェクトで占有されているメモリを解放する前に、Garbage Collectorはオブジェクトのfinalize()メソッドを呼び出します。一般に、この方法でオブジェクトが保持しているリソースをリリースすることをお勧めします。
38。オブジェクトの参照がnullに設定されている場合、ゴミコレクターはすぐにオブジェクトによって占有されているメモリを放出しますか?
いいえ、このオブジェクトは次のゴミ収集サイクルでリサイクル可能になります。
39。Javaヒープ構造はどのように見えますか?ヒープ内のパーマンスペースとは何ですか?
JVMのヒープはランタイムデータ領域であり、クラスのすべてのインスタンスと配列はヒープにメモリが割り当てられています。 JVMが開始されたときに作成されます。オブジェクトが占めるヒープメモリは、自動メモリ管理システム、つまりゴミコレクターによって収集されます。
ヒープメモリは、生き残り死ぬオブジェクトで構成されています。存続するオブジェクトはアプリケーションにアクセスでき、ゴミ収集されません。死んだオブジェクトは、アプリケーションにアクセスできないオブジェクトであり、ゴミコレクターによってリサイクルされていません。ゴミコレクターがこれらのオブジェクトを取り戻すまで、ヒープメモリスペースを占有します。
40.シリアルコレクターとスループットコレクターの違いは何ですか?
スループットコレクターは、中程度の大規模なデータを持つアプリケーションに使用される次世代のゴミコレクターの並列バージョンを使用します。シリアルコレクターは、ほとんどの小さなアプリケーションで十分であり、最新のプロセッサでは約100mのメモリが必要です)。
41。Javaでは、オブジェクトはいつゴミ収集されることができますか?
オブジェクトが現在このオブジェクトを使用しているアプリケーションに対して到達不可能になると、オブジェクトをリサイクルできます。
42。GARBAGEコレクションは、JVMの恒久的な世代で発生しますか?
恒久的な世代では、ごみ収集は発生しません。恒久的な世代が完全であるか、臨界値を超えている場合、完全なガベージコレクション(完全なGC)をトリガーします。ゴミコレクターの出力情報を注意深く確認すると、永続的な世代もリサイクルされていることがわかります。これが、完全なGCを避けるために正しい永久生成サイズが非常に重要である理由です。 Java 8を参照してください:恒久的な世代からメタデータエリアまで
(翻訳者のメモ:恒久的な世代はJava 8で削除され、メタデータ領域と呼ばれる新しいネイティブメモリエリアが追加されました)
上記は、Javaインタビューの質問のための情報の編集です。今後も関連情報を追加し続けます。このサイトへのご支援ありがとうございます!