ホームページ  >  記事  >  Java  >  Java の面接でよくある重要な質問の共有

Java の面接でよくある重要な質問の共有

王林
王林転載
2020-09-30 16:18:012782ブラウズ

Java の面接でよくある重要な質問の共有

1. Java 仮想マシンとは何ですか? Java が「プラットフォームに依存しないプログラミング言語」と呼ばれるのはなぜですか?

(さらに関連する面接の質問に関する推奨事項: java 面接の質問と回答)

Java 仮想マシンは、バイトコード ファイル (.class) を実行する仮想マシン プロセスです。 。 Java ソース プログラム (.java) は、コンパイラによってバイトコード ファイル (.class) にコンパイルされます。次に、バイトコード ファイルは Java 仮想マシンによってマシン コードに解釈されます (プラットフォームが異なるとマシン コードは異なります)。マシンコードを使用してハードウェアとオペレーティング システムを操作します。異なるプラットフォームには異なる JVM が搭載されているため、同じ .class ファイルを異なるプラットフォームで必要なマシンコードに解釈できます。 Java がプラットフォームに依存しないプログラミング言語と呼ばれるのは、まさに JVM の存在によるものです。

2. JDK と JRE の違いは何ですか?

Java Development Kit (JDK) は、JRE、コンパイラ、その他のツール (JavaDoc、Java デバッガなど) を含む完全な Java ソフトウェア開発パッケージで、開発者はこれを使用して Java アプリケーションを開発、コンパイル、実行できます。 Java ランタイム環境 (JRE)。これには、Java 仮想マシン、Java コア クラス ライブラリ、およびサポート ファイルが含まれます。開発ツール (JDK)、コンパイラー、デバッガー、その他のツールは含まれません。

3.「静的」キーワードは何を意味しますか? Java でプライベート メソッドまたは静的メソッドをオーバーライドすることはできますか?

「static」キーワードは、メンバー変数またはメンバー メソッドが、それが属するクラスのインスタンス変数なしでアクセスできることを示します。
Java の静的メソッドはオーバーライドできません。メソッドのオーバーライドは実行時の動的バインディングに基づいているのに対し、静的メソッドはコンパイル時に静的にバインドされるためです。静的メソッドはクラスのどのインスタンスにも関連していないため、概念的には適用されません。プライベート変数やメソッドは現在のクラスでのみ使用できるため、Java ではプライベート メソッドをオーバーライドできません。他のクラスが現在のクラスを継承している場合、プライベート変数やメソッドにアクセスすることはできず、もちろんオーバーライドすることもできません。

4. 静的環境で非静的変数にアクセスできますか?

静的変数は Java のクラスに属しており、その値はすべてのインスタンスで同じです。クラスが Java 仮想マシンによってロードされると、静的変数が初期化されます。コードがインスタンスを使用せずに非静的変数にアクセスしようとすると、これらの変数はまだ作成されておらず、どのインスタンスにも関連付けられていないため、コンパイラーはエラーを報告します。

5.Java でサポートされるデータ型は何ですか?自動開梱ボックスとは何ですか?

Java でサポートされるデータ型には 2 つの型が含まれます: 1 つは、byte、char、short、boolean、int、long、float、double などの基本データ型であり、もう 1 つは String などの参照型です。 , など。実際には、これはオブジェクトへの参照です。JVM の仮想スタックにはオブジェクトのアドレスが保存されます。作成されたオブジェクトは実際にはヒープ内にあります。アドレスを通じてヒープ内でオブジェクトを見つけるプロセスは、参照タイプ。オートボックス化は、基本データ型と対応するオブジェクト パッケージ化型の間の Java コンパイラの変換、つまり int が Integer に変換されることです。自動アンボックス化は、そのメソッドを呼び出して Integer を int に変換するプロセスです。

6.Java におけるメソッドのオーバーライドとメソッドのオーバーロードとは何を意味しますか?

Java でのメソッドのオーバーロードは、同じクラス内の 2 つ以上のメソッドのメソッド名は同じだがパラメータが異なる場合に発生します。オーバーライドは、クラス内のポリモーフィズムの現れで​​す。メソッドのオーバーライドとは、サブクラスが親クラスのメソッドを再定義することを意味します。メソッドのオーバーライドは、同じメソッド名、パラメータ リスト、戻り値の型を持つ必要があります。オーバーライダーは、オーバーライドするメソッドへのアクセスを制限できない場合があります。 Java では、サブクラスは親クラスのメソッドを継承できるため、同じメソッドを書き直す必要はありません。ただし、サブクラスが親クラスのメソッドを変更せずに継承するのではなく、特定の変更を加えたい場合があるため、メソッドの書き換えが使用されます。メソッドのオーバーライドは、メソッドの上書きとも呼ばれます。

7.Java のコンストラクター メソッドとは何ですか?コンストラクターのオーバーロードとは何ですか?コピーコンストラクターとは何ですか?

新しいオブジェクトが作成されると、コンストラクターが呼び出されます。すべてのクラスにはコンストラクター メソッドがあります。プログラマがクラスのコンストラクタを提供しない場合、Java コンパイラはクラスのデフォルトのコンストラクタを作成します。 Java におけるコンストラクターのオーバーロードとメソッドのオーバーロードは非常に似ています。 1 つのクラスに対して複数のコンストラクターを作成できます。各コンストラクターには独自の一意のパラメーター リストが必要です。 Java はコピー コンストラクターをサポートしていません。コンストラクターを自分で作成しない場合、Java はデフォルトのコピー コンストラクターを作成しません。

8. Java は多重継承をサポートしていますか?

Java のクラスは多重継承をサポートせず、単一継承のみをサポートします (つまり、クラスには親クラスが 1 つだけあります)。ただし、Java のインターフェイスは多重継承をサポートしています。つまり、サブインターフェイスは複数の親インターフェイスを持つことができます。 (インターフェイスの機能は、オブジェクトの機能を拡張することです。サブインターフェイスは複数の親インターフェイスを継承します。これは、サブインターフェイスが複数の機能を拡張することを示します。クラスがインターフェイスを実装する場合、クラスは対応する機能を拡張します。)

9. インターフェイスと抽象クラスの違いは何ですか?

設計レベルから見ると、抽象化はクラスの抽象化とテンプレート設計であり、インターフェイスは動作の抽象化と動作の仕様です。

Java は、抽象クラスとインターフェイスの作成を提供およびサポートします。これらの実装には共通点がありますが、相違点は次のとおりです。

インターフェイス内のすべてのメソッドは暗黙的に抽象です。抽象クラスには、抽象メソッドと非抽象メソッドの両方を含めることができます。クラスは多くのインターフェイスを実装できますが、継承できるのは 1 つの抽象クラスのみです。クラスは、抽象クラスとインターフェイスによって宣言されたすべてのメソッドを実装する必要はありません。この場合、クラスも抽象として宣言する必要があります。抽象クラスは、インターフェイス メソッドの実装を提供せずにインターフェイスを実装できます。Java インターフェイスで宣言された変数は、デフォルトで Final になります。抽象クラスには最終変数以外の変数を含めることができます。Java インターフェイスのメンバー関数はデフォルトでパブリックです。抽象クラスのメンバー関数は、プライベート、プロテクト、またはパブリックにすることができますが、インターフェイスは完全に抽象的であり、インスタンス化できません。抽象クラスはインスタンス化できませんが、メイン メソッドが含まれている場合は呼び出すことができます。

JDK8 の抽象クラスとインターフェイスの違いも参照できます。

10.値渡しと参照渡しとは何ですか?

Java での転送は値によるものであると一般に考えられていますが、Java におけるインスタンス オブジェクトの転送は参照によるものです。

値の転送は基本変数用であり、変数のコピーが転送されます。コピーを変更しても元の変数には影響しません。参照転送は通常、オブジェクト変数用であり、オブジェクトが転送されます。元のオブジェクト自体ではなく、アドレスです。

11.プロセスとスレッドの違いは何ですか?

プロセスとは、実行中のアプリケーションであり、動的形式のプログラムであり、CPU やメモリなどのリソースを占有する基本単位です。また、プロセスは互いに独立しているため、通信が困難です。プロセス, 比較的固定された入口、実行シーケンス、および出口が含まれます。スレッドはプロセス内の実行シーケンスであり、特定のプロセスに属します。プロセスは複数のスレッドを持つことができます。スレッドは CPU やメモリなどのリソースを占有することはできず、スレッドは共有しますメモリ領域、通信がより便利になり、スレッドエントリの実行シーケンスとこれらのプロセスはアプリケーションプログラムによって制御されます。

12. スレッドを作成する方法は何通りありますか?あなたはどちらを好みますか?なぜ?

スレッドを作成するには 4 つの方法があります。

Thread クラスを継承し、Runnable インターフェイスを実装します。アプリケーションは Executor フレームワークを使用してスレッド プールを作成でき、Callable インターフェイスを実装します。

Runnable インターフェイスの実装は、Thread クラスを継承する必要がないため、より一般的です。アプリケーション設計で他のオブジェクトが継承されている場合、多重継承が必要となり (Java は多重継承をサポートしていません)、実装できるのはインターフェイスのみです。同時に、スレッド プールは非常に効率的で、実装と使用が簡単です。

13. スレッドで利用可能ないくつかの状態について簡単に説明します。

New (新規): 新しいスレッド オブジェクトが作成されます。実行可能: スレッド オブジェクトが作成された後、他のスレッド (メイン スレッドなど) がオブジェクトの start () メソッドを呼び出します。この状態のスレッドは実行可能なスレッド プール内にあり、CPU を使用する権利を取得するためにスレッド スケジューリングによって選択されるのを待っています。実行中: 実行可能状態のスレッドは、CPU タイム スライス (タイムスライス) を取得し、プログラム コードを実行します。ブロッキング (ブロック): ブロッキング状態は、スレッドが何らかの理由で CPU を使用する権利を放棄すること、つまり、CPU タイムスライスを放棄し、実行を一時的に停止することを意味します。スレッドが実行可能状態になるまで、CPU タイムスライスを再度取得して実行状態に移行する機会があります。ブロッキング状況には 3 つのタイプがあります:

(1). ブロッキングの待機: 実行中のスレッドは o.wait () メソッドを実行し、JVM はスレッドを待機キュー (待機キュー) に入れます。

(2). 同期ブロッキング: 実行中のスレッドがオブジェクトの同期ロックを取得するときに、その同期ロックが別のスレッドによって占有されている場合、JVM はそのスレッドをロック プールに入れます。

(3). その他のブロック: 実行中のスレッドが Thread.sleep (long ms) または t.join () メソッドを実行するか、I/O リクエストが発行されると、JVM はスレッドを次のように設定します。ブロッキング状態です。 sleep () 状態がタイムアウトになるか、join () がスレッドの終了を待つかタイムアウトになるか、I/O 処理が完了すると、スレッドは実行可能状態に戻ります。

Death (死亡): スレッドの run() メソッドと main() メソッドの実行が終了するか、例外により run() メソッドが終了すると、スレッドはそのライフサイクルを終了します。死んだスレッドを復活させることはできません。

Java の面接でよくある重要な質問の共有

#14. 同期メソッドと同期コード ブロックの違いは何ですか?

なぜ同期を使用するのでしょうか?
Java では、マルチスレッドの同時実行制御が可能です。複数のスレッドが共有可能なリソース変数を同時に操作 (追加、削除、変更、確認) すると、データが不正確になり、相互に競合が発生します。そのため、同期ロックはこのスレッドは操作が完了する前に他のスレッドによって呼び出されるため、変数の一意性と正確性が保証されます。

相違点

同期メソッドは、デフォルトでこのクラス オブジェクトまたは現在のクラス オブジェクトをロックとして使用します。同期コード ブロックはロック対象を選択でき、これは同期メソッドよりも細かく選択できます。選択できるのは「同期」のみで、メソッド全体ではなくコードの一部で同期の問題が発生します。同期メソッドはキーワード synchronized を使用してメソッドを変更し、同期コード ブロックは主に同期が必要なコードを変更し、同期コード ブロックを使用します。 (object) {code content} を変更してください;

15. スレッドの同期はモニター内でどのように行われますか?プログラムはどのレベルの同期を実行する必要がありますか?

モニターとロックは Java 仮想マシンで一緒に使用されます。モニターは、同期されたコード ブロックを監視して、一度に 1 つのスレッドだけが同期されたコード ブロックを実行することを確認します。各モニターはオブジェクト参照に関連付けられます。スレッドは、ロックを取得する前に同期コードを実行することはできません。

16.デッドロックとは何ですか?

いわゆるデッドロックとは、複数のプロセスがリソースを奪い合うことで発生するデッドロック(お互いを待ち続ける状態)のことで、外部からの力がなければプロセスは先に進むことができなくなります。デッドロックに必要な 4 つの条件:

相互排他条件: プロセスは、割り当てられたリソース (プリンターなど) の排他制御を必要とします。つまり、特定のリソースは、一定期間内に 1 つのプロセスによってのみ占有されます。このとき、他のプロセスがリソースを要求した場合、要求元のプロセスは待つことしかできません。非剥奪条件: プロセスが取得したリソースは、完全に使用される前に他のプロセスに強制的に奪うことができません。つまり、リソースを取得したプロセスによってのみ解放できます(能動的にのみ解放できます)。要求と保留の条件: プロセスは少なくとも 1 つのリソースを保持していますが、新しいリソース要求を行っており、そのリソースは別のプロセスによって占有されています。この時点では、要求元のプロセスはブロックされていますが、そのプロセスが保持しているリソースは保持されます。得られた。循環待機条件: プロセス リソースには == 循環待機チェーン == があり、チェーン内の各プロセスによって取得されたリソースは、チェーン内の次のプロセスによって同時に要求されます。

17. デッドロックを引き起こすことなく N 個のスレッドが N 個のリソースにアクセスできるようにするにはどうすればよいでしょうか?

マルチスレッドを使用する場合、デッドロックを回避する非常に簡単な方法は次のとおりです: ==ロックを取得する順序を指定==し、スレッドが指定された順序でロックを取得するように強制します。したがって、すべてのスレッドが同じ順序でロックとロックの解放を行う場合、デッドロックは発生しません。

18.Java コレクション クラス フレームワークの基本インターフェイスは何ですか?

コレクション クラス インターフェイスは、要素と呼ばれるオブジェクトのセットを指定します。コレクション クラス インターフェイスの各具象実装クラスは、独自の方法で要素の保存と並べ替えを選択できます。一部のコレクション クラスでは重複キーが許可されますが、その他のコレクション クラスでは許可されません。
Java コレクション クラスは、一連のオブジェクトに対する操作をサポートする、適切に設計された一連のインターフェイスとクラスを提供します。 Java コレクション クラスの最も基本的なインターフェイスは次のとおりです。

Collection: オブジェクトのグループを表し、各オブジェクトはその子要素です。 Set: 重複した要素を含まないコレクション。リスト: 順序付けられ、繰り返しの要素を含めることができるコレクション。マップ: キーを値にマップできるオブジェクト。キーを繰り返すことはできません。

19. コレクション クラスが Cloneable インターフェイスと Serializable インターフェイスを実装していないのはなぜですか?

クローン作成またはシリアル化のセマンティクスと意味は、特定の実装に関連しています。したがって、コレクション クラスをどのように複製またはシリアル化するかは、コレクション クラスの特定の実装によって決まります。

20.イテレータとは何ですか?

Iterator インターフェイスには、コレクション要素を反復処理するためのメソッドが多数用意されています。すべてのコレクション クラスには、イテレータ インスタンスを返す
反復メソッドが含まれています。イテレータは、反復プロセス中に基になるコレクションの要素を削除できますが、コレクションの
remove(Object Obj) を直接呼び出して削除することはできません。イテレータの Remove() メソッドを通じて削除できます。

21.Iterator と ListIterator の違いは何ですか?

両者の違いは以下のとおりです。

Iterator は Set コレクションと List コレクションを走査するために使用できますが、ListIterator は List を走査するためにのみ使用できます。 Iterator はコレクションを前方にのみトラバースできますが、ListIterator は前方と後方の両方にトラバースできます。 ListIterator は Iterator インターフェイスを実装し、要素の追加、要素の置換、前後の要素のインデックスの取得などの他の関数を含みます。

22. フェイルファストとフェイルセーフの違いは何ですか?

イテレータの安全性の失敗は、基になるコレクションのコピーに基づいているため、ソース コレクションの変更の影響を受けません。 java.util パッケージの下のすべてのコレクション クラスはフェイルファストであり、java.util.concurrent パッケージの下のすべてのクラスはフェイルセーフです。フェイルファスト反復子は ConcurrentModificationException 例外をスローしますが、フェイルセーフ反復子はそのような例外をスローしません。

33. Java では HashMap はどのように機能しますか?

Java の HashMap は、要素をキーと値のペアの形式で保存します。 HashMap にはハッシュ関数が必要です。ハッシュ関数は、hashCode() メソッドとquals() メソッドを使用して、コレクションに要素を追加したりコレクションから要素を取得したりします。 put() メソッドが呼び出されると、HashMap はキーのハッシュ値を計算し、コレクション内の適切なインデックスにキーと値のペアを格納します。キーがすでに存在する場合、値は新しい値に更新されます。 HashMap のいくつかの重要な特性は、その容量、負荷率、およびしきい値のサイズ変更です。

34. hashCode() メソッドと equals() メソッドの重要性は何ですか?

Java の HashMap では、hashCode() メソッドとquals() メソッドを使用して、キーと値のペアのインデックスを決定します。これら 2 つのメソッドは、キーに基づいて値を取得するときにも使用されます。これら 2 つのメソッドが正しく実装されていない場合、2 つの異なるキーが同じハッシュ値を持つ可能性があり、そのためコレクションによって等しいとみなされる可能性があります。さらに、これら 2 つの方法は重複要素を見つけるためにも使用されます。したがって、これら 2 つのメソッドの実装は、HashMap の精度と正しさにとって非常に重要です。

35.HashMap と Hashtable の違いは何ですか?

HashMap と Hashtable は両方とも Map インターフェイスを実装しているため、多くの機能は非常に似ています。ただし、次のような違いがあります。

HashMap ではキーと値を null にすることができますが、Hashtable ではキーや値を null にすることができません。 Hashtable は同期的ですが、HashMap は同期的ではありません。したがって、HashMap はシングルスレッド環境に適しており、Hashtable はマルチスレッド環境に適しています。 HashMap は、アプリケーションが反復処理できるキーのコレクションを提供するため、HashMap はフェイルファストです。一方、Hashtable はキーの列挙を提供します。一般に、Hashtable はレガシー クラスであると考えられています。

36. 配列 (Array) とリスト (ArrayList) の違いは何ですか? ArrayList の代わりに Array を使用する必要があるのはどのような場合ですか?

Array には基本タイプとオブジェクト タイプを含めることができますが、ArrayList にはオブジェクト タイプのみを含めることができます。 Array のサイズは固定されており、ArrayList のサイズは動的に変化します。 ArrayList は、addAll()、removeAll()、iterator() などのメソッドと機能をさらに提供します。基本的な種類のデータの場合、コレクションはオートボックス化を使用してコーディングの労力を軽減します。ただし、固定サイズのプリミティブ データ型を扱う場合、このアプローチは比較的遅くなります。

37. ArrayList と LinkedList の違いは何ですか?

ArrayList と LinkedList はどちらも List インターフェイスを実装していますが、次のような違いがあります:

ArrayList はインデックスベースのデータ インターフェイスであり、その最下層は配列です。 O(1) の時間計算量で要素へのランダム アクセスを実行できます。これに対応して、LinkedList は == 要素リスト == の形式でデータを格納します。各要素は前後の要素にリンクされます。この場合、要素を見つけるまでの時間は複雑になります。次数は O(n) です。
ArrayList と比較すると、LinkedList の挿入、追加、削除操作は高速です。これは、要素がコレクション内の任意の位置に追加されるときに、サイズを再計算したり、配列のようにインデックスを更新したりする必要がないためです。 LinkedList は各ノードに対して 2 つの参照 (前の要素を指し、もう 1 つは次の要素を指す) を格納するため、LinkedList は ArrayList よりも多くのメモリを消費します。

38.Comparable インターフェイスと Comparator インターフェイスは何をしますか?それらの違いを列挙してください。

Java は、compareTo() メソッドを 1 つだけ含む Comparable インターフェイスを提供します。このメソッドは 2 つのオブジェクトを並べ替えることができます。具体的には、負の数、0、および既存のオブジェクトが入力オブジェクトより小さい、等しい、または大きいことを示す正の数を返します。
Java は、compare() とquals() という 2 つのメソッドを含む Comparator インターフェイスを提供します。 Compare() メソッドは 2 つの入力パラメータを並べ替えるために使用され、負の数 0 を返します。正の数は、最初のパラメータが 2 番目のパラメータより小さい、等しい、または大きいことを示します。 quals() メソッドには、入力パラメーターがコンパレーターと等しいかどうかを判断するために使用されるパラメーターとしてオブジェクトが必要です。このメソッドは、入力パラメータがコンパレータでもあり、入力パラメータと現在のコンパレータの並べ替え結果が同じである場合にのみ true を返します。

Comparable と Comparator は、どちらもコレクション内の要素の比較と並べ替えを実現するために使用されます。ただし、Comparable はコレクション内で定義されたメソッドによって実装される並べ替えであり、Comparator はコレクションの外側で実装される並べ替えです。並べ替えを実装したい場合は、コレクションの外で Comparator インターフェイスのメソッドを定義するか、コレクション内で Comparable インターフェイスのメソッドを実装する必要があります。 Comparator はパッケージ java.util の下にあり、Comparable はパッケージ java.lang の下にあります。Comparable は、すでに自己比較をサポートしているオブジェクト自体 (String や Integer など) によって実装する必要があるインターフェイスです。カスタム クラスがリスト コンテナに追加された後にソートできる場合、Comparable インターフェイスを実装できます。Collections クラスの sort メソッドを使用してソートする場合、指定しない場合は、 Comparator の場合、自然な順序で並べ替えられます。ここでの自然な順序とは、Comparable インターフェイス設定の特定の並べ替えメソッドを実装することです。

コンパレータは専用のコンパレータです。オブジェクトが自己比較をサポートしていない場合、または自己比較関数が要件を満たせない場合、コンパレータを作成して 2 つのオブジェクト間のサイズ比較を完了できます。比較を自分で行う点と、外部プログラムが比較を実装する点の違いと言えます。 Comparator の使用は戦略設計パターンであり、オブジェクト自体を変更するのではなく、戦略オブジェクトを使用してその動作を変更することを意味します。例: 絶対サイズで整数を並べ替えたい場合、Integer は要件を満たしていません。並べ替え動作を変更するために Integer クラスを変更する必要はありません (実際には変更できません)。使用する必要があるのは、 Comparator インターフェイスを実装する Comparator インターフェイス。オブジェクトを使用してソートを制御するだけです。

39.Javaプライオリティキュー(プライオリティキュー)とは何ですか?

PriorityQueue は優先度ヒープに基づく無制限のキューであり、その要素は自然な順序で並べ替えられます。これを作成するときに、要素を並べ替えるコンパレーターを提供できます。 PriorityQueue では、null 値は許可されません。null 値には自然な順序がないか、関連するコンパレータが存在しないためです。最後に、PriorityQueue はスレッドセーフではなく、エンキューとデキューの時間計算量は O(log(n)) です。

40. big-O 記法を理解していますか?さまざまなデータ構造の例を挙げていただけますか?

ビッグ O 表記は、データ構造内の要素が増加した場合のアルゴリズムのサイズまたは漸近的な上限を表します。
Big O 表記は、メモリ消費などの他の動作を記述するためにも使用できます。コレクション クラスは実際にはデータ構造であるため、通常は Big O 表記法を使用して、時間、メモリ、パフォーマンスに基づいて最適な実装を選択します。 Big O 表記により、大量のデータのパフォーマンスを把握できます。

41.Enumeration インターフェイスと Iterator インターフェイスの違いは何ですか?

列挙はイテレータよりも 2 倍高速で、メモリの使用量も少なくなります。ただし、他のスレッドはイテレータによって走査されているコレクション内のオブジェクトを変更できないため、イテレータは列挙よりもはるかに安全です。同時に、Iterator を使用すると、呼び出し元は基になるコレクション内の要素を削除できますが、これは Enumeration では不可能です。

42.HashSet と TreeSet の違いは何ですか?

HashSet はハッシュ テーブルによって実装されるため、その要素には順序がありません。 add()、remove()、contains() メソッドの時間計算量は O(1) です。一方、TreeSet はツリー構造で実装されており、その中の要素は順序付けされています。したがって、add()、remove()、および contains() メソッドの時間計算量は O(logn) です。

43.Java におけるガベージ コレクションの目的は何ですか?ガベージコレクションはいつ行われますか?

ガベージ コレクションは、メモリ内に参照されていないオブジェクトやスコープを超えるオブジェクトがある場合に実行されます。
ガベージ コレクションの目的は、アプリケーションによって使用されなくなったオブジェクトを特定して破棄し、リソースを解放して再利用することです。

44.System.gc() と Runtime.gc() は何をしますか?

これら 2 つのメソッドは、JVM にガベージ コレクションの実行を促すために使用されます。ただし、ガベージ コレクションがすぐに開始されるか遅延されるかは、JVM によって異なります。

45.finalize() メソッドはいつ呼び出されますか?デストラクタ(ファイナライゼーション)の目的は何ですか?

ガベージ コレクターがオブジェクトをリサイクルすることを決定すると、オブジェクトの Finalize() メソッドが実行されますが、残念ながら Java では、メモリが常に十分である場合、ガベージ コレクションは決して行われない可能性があります。つまり、filalize() は決して実行されない可能性があり、これが最後の作業を行うと期待するのは明らかに信頼できません。では、finalize() は正確に何をするのでしょうか?その主な目的は、特別なチャネルによって割り当てられたメモリを再利用することです。 Java プログラムにはガベージ コレクターがあるため、通常の状況では、プログラマはメモリの問題を心配する必要はありません。ただし、非 Java プログラム (C または C) を呼び出す JNI (Java Native Interface) があり、finalize() の役割はメモリのこの部分を再利用することです。

呼び出しのタイミング: ガベージ コレクターがオブジェクトの終了を宣言したい場合、少なくとも 2 つのマーキング プロセスを経る必要があります。オブジェクトが到達可能性分析を実行した後、GC ルートに接続されている参照チェーンが存在しないことが判明した場合、 will は初めてマークされ、finalizer() メソッドを実行するかどうかを決定します。オブジェクトが Finalizer() メソッドをオーバーライドし、仮想マシンによって呼び出されなかった場合、オブジェクトは F-Queue キューに配置されますマシンによって自動的に作成された優先度の低いファイナライザー スレッド領域の実行により、finalizer() メソッドがトリガーされますが、その操作の終了を待つことは保証されません。

(推奨チュートリアル: java コース)

ファイナライゼーションの目的: オブジェクトが死を免れる最後のチャンス。 (参照チェーン上の任意のオブジェクトと再関連付けするだけです。) ただし、実行コストが高く、不確実性が高く、各オブジェクトの呼び出し順序が保証されないため、お勧めできません。 try-finally または他の代替手段を使用してください。

46. オブジェクトへの参照が null に設定されている場合、ガベージ コレクターはオブジェクトが占有しているメモリをすぐに解放しますか?

いいえ、このオブジェクトは次のガベージ コレクション サイクルでリサイクル可能になります。

オブジェクトが占有しているメモリはすぐには解放されません。オブジェクトの参照が null に設定されている場合、現在のスレッド スタック フレーム内のオブジェクトへの参照が切断されるだけであり、ガベージ コレクターはバックグラウンドで実行されているスレッドであり、ユーザー スレッドが実行されるときにのみ使用できます。安全点 (安全点) または安全 オブジェクトの参照関係はその領域内でのみスキャンされます オブジェクトが参照されていない場合、オブジェクトはマークされます このとき、一部のオブジェクトは回復可能なため、オブジェクト メモリはすぐには解放されません(参照はファイナライズメソッドで復元されます)。オブジェクトへの参照を復元できないと判断された場合にのみ、オブジェクト メモリがクリアされます。

47.Java ヒープの構造は何ですか?ヒープ内の Perm Gen スペースとは何ですか?

JVM のヒープはランタイム データ領域であり、すべてのクラス インスタンスと配列はヒープ上にメモリを割り当てます。 JVM の起動時に作成されます。オブジェクトが占有しているヒープ メモリは、自動メモリ管理システム、つまりガベージ コレクタによって再利用されます。
ヒープ メモリは、生きているオブジェクトと死んだオブジェクトで構成されます。存続するオブジェクトはアプリケーションからアクセス可能であり、ガベージ コレクションされません。デッド オブジェクトは、アプリケーションからアクセスできず、ガベージ コレクターによってまだ回収されていないオブジェクトです。ガベージ コレクターがこれらのオブジェクトを収集するまで、それらのオブジェクトはヒープ メモリ領域を占有し続けます。

永久世代は、Java クラス、メソッドなどの静的ファイルを保存するために使用されます。永続的な生成はガベージ コレクションに大きな影響を与えませんが、一部のアプリケーションでは、Hibernate などの一部のクラスを動的に生成または呼び出す場合があります。この場合、これらの新しく追加されたクラスを格納するために、比較的大きな永続的な生成スペースをセットアップする必要があります。コードには通常次のものが含まれます:
クラスのメソッド (バイトコード...)
クラス名 (Sring オブジェクト)
.class ファイルから読み取られた定数情報
オブジェクトのリストと型のリストクラス オブジェクト (メソッド オブジェクトの配列など) に関連します。
JVM によって作成される内部オブジェクト
JIT コンパイラの最適化に関する情報

48. シリアル コレクターとスループット コレクターの違いは何ですか?

スループット コレクターは、中規模および大規模なデータを扱うアプリケーションに使用される、若い世代のガベージ コレクターの並列バージョンを使用します。シリアル コレクターは、ほとんどの小規模なアプリケーション (最新のプロセッサでは約 100M のメモリを必要とする) には十分です。

49. Java では、いつオブジェクトをガベージ コレクションできますか?

オブジェクトが GC ルートに到達できない場合、次のガベージ コレクション サイクルでオブジェクトのリサイクルを試行します。オブジェクトが Finalize() メソッドをオーバーライドし、オブジェクト自体をこのメソッドに正常に保存する (オブジェクト自体を何かに割り当てる) 場合は、参照)、オブジェクトはリサイクルされません。ただし、オブジェクトが Finalize() メソッドをオーバーライドしていない場合、またはこのメソッドがすでに実行されていてオブジェクト自体の保存に失敗した場合、オブジェクトはリサイクルされます。

50.JVM の永続世代ではガベージ コレクションが発生しますか?

永続世代ではガベージ コレクションは発生しません。永続世代がいっぱいであるか、臨界値を超えている場合、フル ガベージ コレクション (フル GC) がトリガーされます。ガベージ コレクターの出力を注意深く見ると、永続世代も収集されていることがわかります。このため、フル GC を回避するには、正しい永続世代サイズが非常に重要です。 Java8: 永続世代からメタデータ領域へ を参照してください。
(注: Java8 では永続世代が削除され、メタデータ領域と呼ばれる新しいネイティブ メモリ領域が追加されました)

51.Java とは? の 2 つの例外タイプそれらの違いは何ですか?

Java には、チェック例外と非チェック例外の 2 種類の例外があります。非チェック例外は、メソッドまたはコンストラクターの実行によってそのような例外がスローされる可能性があっても、メソッドまたはコンストラクターで宣言する必要はありません。また、非チェック例外はメソッドまたはコンストラクターの外部に伝播する可能性があります。代わりに、チェック例外は throws ステートメントを使用してメソッドまたはコンストラクターで宣言する必要があります。 Java 例外処理のヒントをいくつか紹介します。

Throwable にはエラー (Error) と例外 (Excetion) が含まれます。
Exception には、実行時例外 (RuntimeException、非チェック例外とも呼ばれます) と非実行時例外 (チェック例外とも呼ばれます) も含まれます
(1)エラーとは、プログラムが処理できないことを意味します。OutOfMemoryError などの例外が発生した場合、通常、Java 仮想マシンはスレッドを終了します。
(2) ランタイム例外は、 RuntimeException クラスとそのサブクラス ( NullPointerException 、 IndexOutOfBoundsException など) です。など。これらの例外は、プログラムの実行中に発生する可能性があるチェックされていない例外であるため、プログラムがそれらをキャッチする場合とキャッチしない場合があります。これらのエラーは通常、プログラム内の論理エラーによって引き起こされるため、プログラムは論理的な観点から開始する必要があります。
(3) チェック例外は実行時例外以外の例外であり、例外とそのサブクラスでもあります。プログラムの観点から見ると、これらの例外はキャッチしてチェックする必要があり、そうでないとコンパイルに合格できません。 IOException 、 SQLException など。

52.Java の例外とエラーの違いは何ですか?

Exception と Error はどちらも Throwable のサブクラスです。 Exception は、ユーザー プログラムがキャッチできる例外に使用されます。エラーは、ユーザー プログラムによってキャッチされることが予期されない例外を定義します。

53.投げる と 投げる はどう違いますか?

throw キーワードは、プログラム内で明示的に例外をスローするために使用されますが、反対に、throws ステートメントは、メソッドが処理できない例外を示すために使用されます。各メソッドでは、どの例外が処理できないかを指定する必要があるため、メソッドの呼び出し元は、発生する可能性のある例外が処理されることを確認できます。複数の例外はカンマで区切られます。

1. Throw はメソッド内で使用され、Throws はメソッド宣言で使用されます;
2. Throw の後に例外オブジェクトが続き、Throws の後に例外タイプが続きます;
3 Throw の後に続く例外オブジェクトは 1 つだけです。Throw の後に複数の例外タイプを一度に宣言できます。

54. 例外処理が完了した後、Exception オブジェクトはどうなりますか? ,

例外オブジェクトは、次のガベージ コレクション プロセス中にリサイクルされます。

55.finally コード ブロックと Finalize() メソッドの違いは何ですか?

finally コード ブロックは、例外がスローされるかどうかに関係なく実行され、主にアプリケーションによって占有されているリソースを解放するために使用されます。 Finalize() メソッドは、Object クラスの保護されたメソッドであり、オブジェクトがガベージ コレクションされる前に Java 仮想マシンによって呼び出されます。

56. アプレットとは何ですか?

Java アプレットは、HTML ページに組み込んで、Java 対応クライアント ブラウザで実行できるプログラムです。アプレットは主に、動的な対話型 Web アプリケーションを作成するために使用されます。

57. アプレットのライフサイクルを説明します。

アプレットは次の状態を遷移します:
Init: ロードされるたびに初期化されます。
Start: アプレットの実行を開始します。
Stop: アプレットの実行を終了します。
Destroy: アプレットをアンインストールする前に、最終クリーンアップを実行します。

58. アプレットがロードされると何が起こるでしょうか?

まず、アプレット コントロール クラスのインスタンスを作成し、次にアプレットを初期化し、最後に実行を開始します。

59. アプレットと通常の Java アプリケーションの違いは何ですか?

アプレットは Java 対応ブラウザで実行されます。Java アプリケーションは、ブラウザの外部で実行できる独立した Java プログラムです。ただし、それらはすべて Java 仮想マシンを必要とします。
さらに、Java アプリケーションの実行を開始するには、特定のメソッド シグネチャを持つ main 関数が必要です。 Java アプレットでは、実行を開始するためにそのような関数は必要ありません。
最後に、Java アプレットは通常、非常に厳格なセキュリティ ポリシーを使用し、Java アプリケーションは通常、より緩やかなセキュリティ ポリシーを使用します。

60. Java アプレットにはどのような制限がありますか?

主にセキュリティ上の理由により、アプレットには次の制限が課されます:
アプレットはクラス ライブラリをロードしたり、ローカル メソッドを定義したりできません。ホスト上のファイルを読み書きできません。特定のシステム プロパティを読み取れません。開始できません。ホスト以外のネットワーク接続は無効になり、ホスト上で他のプログラムを起動できなくなります。

61.信頼できないアプレットとは何ですか?

信頼できないアプレットは、ローカル システム ファイルにアクセスしたり実行したりできない Java アプレットです。デフォルトでは、ダウンロードされたすべてのアプレットは信頼できません。

62. ネットワークからロードされたアプレットとローカル ファイル システムからロードされたアプレットの違いは何ですか?

アプレットがネットワークからロードされるとき、アプレットはアプレット クラス ローダーによってロードされますが、これはアプレット セキュリティ マネージャーによって制限されます。
アプレットがクライアントのローカル ディスクからロードされる場合、アプレットはファイル システム ローダーによってロードされます。
ファイル システムからロードされたアプレットにより、クライアントはファイルの読み取り、書き込み、クラス ライブラリのロードが可能になり、また他のプログラムの実行も可能になりますが、バイトコード検証には合格できません。

63. アプレット クラス ローダーとは何ですか?それは何をするのでしょうか?

アプレットがネットワークからロードされると、アプレット クラス ローダーによってロードされます。クラスローダーには独自の Java 名前空間階層があります。クラス ローダーは、ファイル システムのクラスが一意の名前空間を持つこと、およびネットワーク リソースのクラスが一意の名前空間を持つことを保証します。
ブラウザがネットワーク経由でアプレットをロードすると、アプレットのクラスは、アプレットのソースに関連付けられたプライベート名前空間に配置されます。次に、クラス ローダーによってロードされたクラスは、バリデーターによって検証されます。バリデータは、クラス ファイルの形式が Java 言語仕様に準拠しているかどうかをチェックして、スタックのオーバーフローまたはアンダーフローが発生していないこと、およびバイトコード命令に渡されたパラメーターが正しいことを確認します。

64. アプレット セキュリティ マネージャーとは何ですか?それは何をするのでしょうか?

アプレット セキュリティ マネージャーは、アプレットに制限を課すためのメカニズムです。ブラウザーにはセキュリティ マネージャーを 1 つだけ持つことができます。セキュリティ マネージャーは起動時に作成され、後で置き換えたり拡張したりすることはできません。

65. ポップアップ選択メニュー (Choice) とリスト (List) の違いは何ですか?

選択肢はコンパクトな形式で表示されており、すべてのオプションを表示するには下にスクロールする必要があります。 Choice では一度に 1 つのオプションのみを選択できます。リストには複数の要素を同時に表示でき、1 つ以上の要素の選択がサポートされます。

66. レイアウト マネージャーとは何ですか?

レイアウト マネージャーは、コンテナ内のコンポーネントを整理するために使用されます。

67. スクロール バー (Scrollbar) とスクロール パネル (JScrollPane) の違いは何ですか?

スクロールバーはコンポーネントであり、コンテナではありません。そして ScrollPane はコンテナです。 ScrollPane はスクロール イベント自体を処理します。

68. どの Swing メソッドがスレッドセーフですか?

スレッドセーフなメソッドは、repaint()、revalidate()、invalidate() の 3 つだけです。

69. 再描画をサポートするコンポーネントを 3 つ挙げてください。

キャンバス、フレーム、パネル、アプレットは再描画をサポートしています。

70. JDBC とは何ですか?

JDBC は、ユーザーが異なるデータベースから選択できるようにする抽象化レイヤーです。 JDBC を使用すると、開発者は基礎となる特定のデータベースの詳細を気にすることなく、JAVA でデータベース アプリケーションを作成できます。

JDBC (Java DataBase Connectivity) は、オブジェクト指向のアプリケーション プログラミング インターフェイス (API) のセットで、さまざまなリレーショナル データベースにアクセスするための統一された標準インターフェイスを策定し、さまざまなデータベース メーカーに標準実装を提供します。 JDBC テクノロジを通じて、開発者は Pure Java 言語と標準 SQL ステートメントを使用して完全なデータベース アプリケーションを作成し、ソフトウェアのクロスプラットフォームの性質を真に実現できます。
通常は、JDBC を使用して次の操作を実行します:
1. データベースとの接続を確立します;
2. SQL ステートメントをデータベースに送信します;
3. データベースから返された結果を処理します;
JDBC には次の利点があります:
1. JDBC は ODBC (Open Database Connectivity、つまりオープン データベース相互接続) に非常に似ており、ソフトウェア開発者にとって理解しやすいです;
2. JDBC はソフトウェア開発者を解放します複雑なドライバー作成作業から解放され、ビジネス ロジックの開発に完全に集中できます。
3. JDBC はさまざまなリレーショナル データベースをサポートし、ソフトウェアの移植性が大幅に向上します。
4. JDBC API はオブジェクト指向であり、ソフトウェア開発者は、コードの再利用性を向上させるために、メソッドが再カプセル化されています;

71. データベース接続プールとは何を意味しますか?

データベース接続の開閉など、データベースとの対話には時間がかかる場合があります。特にクライアントの数が増えると、大量のリソースが消費され、コストが非常に高くなります。アプリケーション サーバーの起動時に、多くのデータベース接続をプール内で確立して維持できます。接続リクエストはプール内の接続から処理されます。接続が使い果たされると、接続はプールに返され、今後さらに多くの要求を満たすために使用されます。

72. RMI プログラムを正しく実行するための手順は何ですか?

RMI プログラムを正しく実行するには、次の手順を含める必要があります。
すべてのソース ファイルをコンパイルします。
rmic を使用してスタブを生成します。
rmiregistry を開始します。
RMI サーバーを起動します。
クライアント プログラムを実行します。

73. マーシャリングとデマーシャリングについて説明します。

アプリケーションがメモリ オブジェクトをネットワーク経由で別のホストに転送したり、ストレージに保存したりする場合、メモリ内のオブジェクトの表現を適切な形式に変換する必要があります。このプロセスはマーシャリングと呼ばれ、その逆はデマーシャリングと呼ばれます。

74. シリアル化と逆シリアル化について説明します。

Java は、オブジェクト シリアル化と呼ばれるメカニズムを提供します。これは、オブジェクトのデータ、オブジェクトの型情報、オブジェクト内のデータの型情報などが含まれる一連のバイトとしてオブジェクトを表します。したがって、シリアル化は、オブジェクトをディスクに保存したり、ディスクから読み取って再構築したりするためにオブジェクトを平坦化する方法とみなすことができます。逆シリアル化は、オブジェクトをフラットな状態からライブ オブジェクトに変換する逆の手順です。

75. サーブレットとは何ですか?

サーブレットは、クライアント要求を処理し、動的な Web コンテンツを生成するために使用される Java クラスです。サーブレットは主に、HTML フォームによって送信されたデータの処理または保存、動的コンテンツの生成、およびステートレス HTTP プロトコルでのステータス情報の管理に使用されます。

76. サーブレットのアーキテクチャについて話しましょう。

すべてのサーブレットが実装する必要があるコア インターフェイスは javax.servlet.Servlet です。すべてのサーブレットは、このインターフェースを直接的または間接的に実装するか、javax.servlet.GenericServlet または javax.servlet.http.HTTPServlet を継承する必要があります。最後に、サーブレットは複数のスレッドを使用して、複数のリクエストを並行して処理します。

77. Web アプリケーションとは何ですか?

Web アプリケーションは、Web サーバーまたはアプリケーション サーバーの動的な拡張機能です。 Web アプリケーションには、プレゼンテーション指向とサービス指向の 2 種類があります。プレゼンテーション指向の Web アプリケーションは、リクエストに応じて、さまざまなマークアップ言語と動的コンテンツを含むインタラクティブな Web ページを生成します。サービス指向 Web アプリケーションは、Web サービスのエンドポイントを実装します。一般に、Web アプリケーションは、サーバーの URL 名前空間の特定のサブセットの下にインストールされたサーブレットのコレクションとして見ることができます。

78. どのクライアント マシンがサーブレットを要求しているかを確認するにはどうすればよいですか?

ServletRequest クラスは、クライアント マシンの IP アドレスまたはホスト名を見つけることができます。 getRemoteAddr() メソッドはクライアント ホストの IP アドレスを取得し、getRemoteHost() メソッドはホスト名を取得します。

79. HTTP レスポンスの構造は何ですか?

HTTP 応答は 3 つの部分で構成されます。
ステータス コード (ステータス コード): 応答のステータスを説明します。リクエストが正常に完了したかどうかを確認するために使用できます。リクエストが失敗した場合、ステータス コードを使用して失敗の理由を調べることができます。サーブレットがステータス コードを返さない場合は、デフォルトで成功ステータス コード HttpServletResponse.SC_OK が返されます。
HTTP ヘッダー: 応答に関する詳細情報が含まれています。たとえば、ヘッダーでは、応答の有効期限が切れたとみなされる有効期限を指定したり、エンティティ コンテンツをユーザーに安全に送信するために使用されるエンコード形式を指定したりできます。 Serlet で HTTP ヘッダーを取得する方法については、こちらを参照してください。
本文: 応答の内容が含まれます。 HTML コードや画像などを含めることができます。本文は、ヘッダーの直後に続く HTTP メッセージで送信されるデータ バイトで構成されます。

80. Cookie とは何ですか?セッションとクッキーの違いは何ですか?

Cookie は、Web サーバーからブラウザに送信される情報です。ブラウザは、各 Web サーバーの Cookie をローカル ファイルに保存します。将来的には、ブラウザが特定の Web サーバーにリクエストを送信するときに、そのサーバーに保存されているすべての Cookie も送信されるようになります。以下に、セッションと Cookie の違いを示します。
クライアント ブラウザがどのような設定を行っても、セッションは正常に動作するはずです。クライアントは Cookie を無効にすることを選択できますが、クライアントはサーバー側のセッションを無効にできないため、セッションは引き続き機能します。
セッションと Cookie は、保存されるデータの量の点でも異なります。 Session は任意の Java オブジェクトを格納できますが、Cookie は String 型のオブジェクトのみを格納できます。

81. JSP リクエストはどのように処理されますか?

ブラウザは、最初に .jsp 拡張子で終わるページを要求し、JSP リクエストを開始する必要があります。次に、Web サーバーはリクエストを読み取り、JSP コンパイラを使用して JSP ページをサーブレット クラスに変換します。 JSP ファイルは、ページが初めてリクエストされたとき、または JSP ファイルが変更されたときにのみコンパイルされ、その後、サーバーがサーブレット クラスを呼び出してブラウザのリクエストを処理することに注意してください。リクエストの実行が完了すると、サーブレットはクライアントにレスポンスを送信します。

82. カプセル化の定義と利点は何ですか?

カプセル化は、オブジェクトに内部特性と動作を隠す機能を提供します。オブジェクトは、他のオブジェクトからアクセスして内部データを変更できるメソッドを提供します。 Java には、public、private、protected の 3 つの修飾子があります。各修飾子は、同じパッケージまたは異なるパッケージにある他のオブジェクトに異なるアクセス権を与えます。
カプセル化を使用する利点を以下に示します。
オブジェクトのプロパティを非表示にすることで、オブジェクト内の状態を保護します。
オブジェクトの動作を個別に変更または拡張できるため、コードの使いやすさと保守性が向上します。
モジュール性を向上させるために、オブジェクト間の不適切な相互作用を禁止します。
カプセル化の詳細と例については、このドキュメントを参照してください。

Or:

まず、private を使用してクラスの詳細を外部から隔離し、それによってデータ項目とメソッドを非表示にします。これらのデータ項目とメソッドにアクセスする唯一の方法は、クラス クラスは、それ自体で、そのクラスが所有するリソース (メソッド、データ項目属性など) を呼び出すことができます。したがって、最初の利点は、データのセキュリティが向上することです。
2 番目は、分離を非表示にし、クラスへの外部アクセスを限定的に許可することです。開発者は、クラスを使用するプログラムを変更せずに、クラスの内部実装を自由に変更できます。クラス外から呼び出せるメソッドは、外部の性質を変えずに内部コードを自由に変更できるため、分業が容易です。
3 番目は、コードの再利用性を向上させることで、コードをツール クラスにカプセル化すると、多くの面倒な手順を減らすことができます。

83. 抽象化の定義は何ですか?抽象化とカプセル化の違いは何ですか?

抽象化は、アイデアを具体的なインスタンスから分離するステップであり、実装の詳細ではなく機能に基づいてクラスを作成します。 Java は、インターフェイスのみを公開し、メソッド実装を含まない抽象クラスの作成をサポートします。この抽象化手法の主な目的は、クラスの動作を実装の詳細から分離することです。抽象化とカプセル化は補完的な概念です。一方では、抽象化はオブジェクトの動作に焦点を当てます。一方、カプセル化では、オブジェクトの動作の詳細に焦点を当てます。カプセル化は一般にオブジェクトの内部状態情報を隠すことで実現されるため、カプセル化は抽象化を実現するための戦略とみなすことができます。

関連する推奨事項:Java の使用を開始する

以上がJava の面接でよくある重要な質問の共有の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。