ホームページ  >  記事  >  Java  >  Java で頻繁に聞かれる基本的な面接の質問—(3)

Java で頻繁に聞かれる基本的な面接の質問—(3)

王林
王林転載
2020-08-31 16:49:482516ブラウズ

Java で頻繁に聞かれる基本的な面接の質問—(3)

面接の質問は次のとおりです:

1. a.hashCode() の用途は何ですか? a.equals(b) と何の関係があるのでしょうか?

(より関連した面接の質問に関する推奨事項: java 面接の質問と回答)

hashCode() メソッドは、オブジェクトの整数型のハッシュ値に対応します。これは、Hashtable、HashMap、LinkedHashMap などのハッシュベースのコレクション クラスでよく使用されます。特に、equals() メソッドと密接に関連しています。 Java 仕様によれば、equal() メソッドを使用して等しい 2 つのオブジェクトは、同じハッシュ コードを持つ必要があります。

2. バイトストリームとキャラクタストリームの違い

バイナリデータを1つずつデバイスに出力する、またはデバイスからバイナリデータを1つずつ読み込む入力デバイスと出力デバイスが何であるかに関係なく、これらの操作を完了し、抽象的な方法で記述するには、統一された方法を使用する必要があります。この抽象的な記述メソッドは、IO ストリームと呼ばれます。対応する抽象クラスは、OutputStream と InputStream です。異なる実装クラスare さまざまな入力デバイスと出力デバイスを表し、すべてバイトで動作します。

コンピュータ内のすべてのものは、最終的にはバイナリ バイト形式で存在します。頻繁に使用される漢字の場合は、まず対応するバイトを取得してから、そのバイトを出力ストリームに書き込みます。読み込みの際、最初に読み込まれるのはバイトですが、文字として表示したい場合はバイトを文字に変換する必要があります。このようなニーズは広範囲に及ぶため、Java は特別に文字ストリーム ラッパー クラスを提供します。

基盤となるデバイスは常にバイト データのみを受け入れます。基盤となるデバイスに文字列を書き込みたい場合は、書き込む前に文字列をバイトに変換する必要がある場合があります。文字ストリームはバイト ストリームのラッパーです。文字ストリームは文字列を直接受け入れます。文字列を内部でバイトに変換し、基礎となるデバイスに書き込みます。これにより、文字列をバイト ストリームに書き込んだり読み込んだりするための情報が少し提供されます。 IOデバイス便利です。

文字をバイトに変換するときは、エンコードの問題に注意してください。文字列をバイト配列に変換すると、実際には文字の特定のエンコードされたバイト形式に変換され、読み取り時にはその逆が当てはまります。

3. Java シリアル化とは何ですか?また、Java シリアル化を実装する方法は何ですか?または、Serializable インターフェイスの役割を説明してください。

Java オブジェクトをバイト ストリームに転送したり、バイト ストリームから Java オブジェクトに復元したりすることがあります。たとえば、Java オブジェクトをハードディスクに保存したり、ネットワークに送信したりする必要があります。他のコンピュータと同様に、このプロセスでは、Java オブジェクトを特定の形式のバイト ストリームに変換して送信する独自​​のコードを作成できます。

ただし、jre 自体がこのサポートを提供します。これを行うには、OutputStream の writeObject メソッドを呼び出すことができます。Java にそれを行わせたい場合は、送信されるオブジェクトはシリアル化可能なインターフェイスを実装する必要があります。この方法では、 , javac のコンパイル時に、コンパイルしたクラスを writeObject メソッドで操作できるように特別な処理が行われます。これをシリアル化といいます。シリアル化する必要があるクラスは、Serializable インターフェイスを実装する必要があります。このインターフェイスは、メソッドを実装する必要がないミニ インターフェイスです。Serializable の実装は、オブジェクトがシリアル化できることを示すためだけに実装されています。

たとえば、Web 開発では、オブジェクトがセッションに保存されている場合、Tomcat は再起動時にセッション オブジェクトをハードディスクにシリアル化する必要があり、このオブジェクトは Serializable インターフェイスを実装する必要があります。オブジェクトが分散システムを介してネットワーク上で送信される場合、送信されるオブジェクトは Serializable インターフェイスを実装する必要があります。

4. JVM がクラス ファイルをロードする原理メカニズムについて説明しますか?

JVM でのクラスのロードは、ClassLoader とそのサブクラスによって実装されます。Java ClassLoader は、重要な Java ランタイム システム コンポーネントです。実行時にクラス ファイルからクラスを検索してロードする役割を果たします。

(推奨される関連チュートリアル: java 入門チュートリアル )

5. ヒープとスタックの違いは何ですか。

Java のメモリは 2 つのカテゴリに分類され、1 つはスタック メモリ、もう 1 つはヒープ メモリです。スタック メモリとは、プログラムがメソッドに入るときに、このメソッド内のローカル変数を保存するためにプライベート ストレージ スペースがこのメソッドに割り当てられることを意味します。このメソッドが終了すると、このメソッドに割り当てられたスタックが解放されます。変数も解放されます。それに応じて。

ヒープは、スタックとは異なる機能を持つメモリです。通常、現在のメソッド スタックにないデータを保存するために使用されます。たとえば、new を使用して作成されたオブジェクトはヒープに配置されるため、方法だけでは終わらない、そして消えてしまう。メソッド内のローカル変数が Final で変更されると、それらはスタックではなくヒープに配置されます。

6. GC とは何ですか? なぜ GC があるのですか?

GC とは、ガベージ コレクション (Gabage Collection) を意味します。メモリ処理は、プログラマがメモリを忘れたり間違ったりするなどの問題が発生しやすい場所です。プログラムやシステムが不安定になったり、崩壊したりする可能性があります。Java が提供する GC 関数は、オブジェクトがスコープを超えているかどうかを自動的に検出して、自動的にメモリを再利用するという目的を達成します。Java 言語には、割り当てられたメモリを解放するための明示的な操作方法がありません。 。

7. ガベージ コレクションの利点と原則。そして2つのリサイクルメカニズムを考えてみましょう。

Java 言語の注目すべき機能は、C プログラマにとって最も厄介なメモリ管理問題を解決するガベージ コレクション メカニズムの導入です。これにより、Java プログラマはプログラムを作成するときにメモリ管理を考慮する必要がなくなります。ガベージ コレクション メカニズムにより、Java のオブジェクトには「スコープ」の概念がなくなり、オブジェクトへの参照のみが「スコープ」を持ちます。

ガベージ コレクションは、メモリ リークを効果的に防止し、利用可能なメモリを効果的に使用できます。ガベージ コレクターは通常、別個の低レベル スレッドとして実行され、予期せぬ状況下で、メモリ ヒープ内の停止したオブジェクトや長期間使用されなかったオブジェクトをクリアしてリサイクルします。プログラマーは、特定の状況に対処するためにリアルタイムでガベージ コレクターを呼び出すことができません。オブジェクト、またはすべてのオブジェクトがガベージ コレクションされます。

リサイクル メカニズムには、世代別コピー ガベージ コレクション、マーク付きガベージ コレクション、および増分ガベージ コレクションが含まれます。

8. ガベージ コレクターの基本原理は何ですか?ガベージ コレクターはメモリをすぐに再利用できますか?ガベージ コレクションを実行するように仮想マシンに積極的に通知する方法はありますか?

GC の場合、プログラマがオブジェクトを作成すると、GC はオブジェクトのアドレス、サイズ、使用状況の監視を開始します。通常、GC は有向グラフを使用して、ヒープ内のすべてのオブジェクトを記録および管理します。このようにして、どのオブジェクトが「到達可能」であり、どのオブジェクトが「到達不能」であるかが決定されます。一部のオブジェクトが「到達不能」であると GC が判断した場合、GC はこれらのメモリ空間を再利用する責任があります。

プログラマは System.gc() を手動で実行して GC の実行を通知できますが、Java 言語仕様では GC が実行されることは保証されていません。

9. Java では、throw と throws の違いは何ですか?

throw は、java.lang.Throwable クラスのインスタンス化されたオブジェクトをスローするために使用されます。キーワード throw 例外をスローします。例:
throw new IllegalArgumentException("XXXXXXXXX")

throws の機能はメソッド宣言とシグネチャの一部であり、メソッドは対応する例外をスローします。呼び出し側が処理できること。 Java では、未処理のチェック例外はスロー句で強制的に宣言されます。

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

10. Java ではメモリ リークが発生しますか? 簡単に説明してください。

最初にメモリ リークとは何かについて説明します。いわゆるメモリ リークとは、プログラムで使用されなくなったオブジェクトまたは変数がメモリ内で占有されていることを意味します。 Java にはガベージ コレクション メカニズムがあり、オブジェクトが参照されなくなった場合、オブジェクトはガベージ コレクタによってメモリから自動的にクリアされます。

Java はガベージ コレクション管理に有向グラフを使用するため、参照サイクルの問題を排除できます。たとえば、相互に参照する 2 つのオブジェクトがある場合、それらのオブジェクトがルート プロセスから到達できない限り、 GC はそれらをリサイクルすることもできます。

Java でのメモリ リーク: メモリ リークは、存続期間の長いオブジェクトが存続期間の短いオブジェクトへの参照を保持している場合に発生する可能性があります。ただし、存続期間の短いオブジェクトは必要なくなりましたが、ライフ サイクルが長いためです。オブジェクトはその参照を保持しており、リサイクルすることはできません。これは、Java でメモリ リークが発生するシナリオです。平たく言えば、プログラマはオブジェクトを作成しても、それを再度使用することはありませんが、オブジェクトは常に使用されます。参照、つまり、オブジェクトは役に立たないが、ガベージ コレクターによってリサイクルすることはできません。これは、Java でメモリ リークが発生する可能性がある状況です。たとえば、キャッシュ システムでは、オブジェクトをロードしてキャッシュ (たとえば、グローバル マップ内) に配置します。このオブジェクトは常にキャッシュによって参照されますが、今後は使用されません。

以上がJava で頻繁に聞かれる基本的な面接の質問—(3)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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