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

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

王林
王林転載
2020-08-29 16:18:262312ブラウズ

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

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

(推奨される関連する面接の質問:

Java 面接の質問と回答)

1. String s = new String("xyz"); 作成される StringObject の数は何ですか? String クラスを継承することは可能ですか?

両方または一方が可能です。「xyz」はオブジェクトに対応します。このオブジェクトは文字列定数バッファーに配置されます。定数「xyz」は常に表示されます。何度出現しても、バッファ内にあるものです。 NewString が書き込まれるたびに、新しいオブジェクトが作成されます。このオブジェクトは、定数「xyz」オブジェクトの内容を使用して新しい String オブジェクトを作成します。

「xyz」が以前に使用されている場合、「xyz」はここでは作成されず、バッファから直接取得されます。このとき、StringObject が作成されますが、「xyz」の場合以前に使用されていない場合、この時点でオブジェクトが作成されてバッファに配置されます。この場合、2 つのオブジェクトが作成されます。 String クラスが継承されるかどうかについては、答えは「いいえ」です。String はデフォルトで最終変更され、継承できないからです。

2. String と StringBuffer の違い

JAVA プラットフォームには、String と StringBuffer という 2 つのクラスがあり、文字列、つまり複数の文字を格納および操作できます。 . キャラクターデータ。 String クラスは、数値的に不変の文字列を提供します。この StringBuffer クラスによって提供される文字列は変更できます。文字データが変更されることがわかっている場合は、StringBuffer を使用できます。通常、文字データを動的に構築するには StringBuffers を使用します。

3. 次のステートメントによって合計で作成されるオブジェクトの数: String s="a" "b" "c" "d";

次のコードの場合:

String s1 = "a";
String s2 = s1 + "b";
String s3 = "a" + "b";
System.out.println(s2 == "ab");
System.out.println(s3 == "ab");

最初のステートメントは false の結果を出力し、2 番目のステートメントは true の結果を出力します。これは、javac コンパイルが文字列定数を直接追加する式を最適化できることを示しています。実行時まで加算操作を実行するのを待ち、代わりにコンパイル中にプラス記号を削除し、これらの定数を結合した結果に直接コンパイルします。

質問のコードの最初の行は、コンパイル時にコンパイラによって最適化されますが、これは "abcd" の文字列を直接定義するのと同等であるため、上記のコードは String オブジェクトのみを作成する必要があります。次の 2 行のコードを記述します。

String s ="a" + "b" +"c" + "d";
System.out.println(s== "abcd");

最終的に出力される結果は true になるはずです。

4. try {} に return ステートメントがあるため、この try の直後にあるfinally{} のコードが実行されますか? いつ実行されますか? return の前または後ですか? ?

finally{} 内のステートメントは確実に実行されることがわかっているため、これは通常、return 前に口頭で表示され、このメソッドは return 後に出てくる可能性があります。それがどこに行ったのかは誰にも分かりません。次のプログラム コードの実行結果を参照してください:

public classTest {
    public static void main(String[]args) {
       System.out.println(newTest().test());;
    }
    static int test()
    {
       intx = 1;
       try
       {
          returnx;
       }
       finally
       {
          ++x;
       }
    }
  
}
---------执行结果 ---------
1

実行結果は 1 です。なぜでしょうか。メイン関数がサブ関数を呼び出して結果を取得するプロセスは、メイン関数が空のjarを用意するのと同じで、サブ関数が結果を返したい場合は、まず結果をjarに入れてからプログラムを返します。ロジックを main 関数に追加します。いわゆるリターンとは、サブ関数が「もう実行しません。メイン関数の実行を続けてください。結果はまったくありません。結果はこれを言う前に jar に入れられます。」ということを意味します。

(ビデオ チュートリアルの推奨:

java コース )

5.final、finally、finalize の違い。

final は、プロパティ、メソッド、クラスを宣言するために使用されます。これは、それぞれ、プロパティが不変、メソッドがオーバーライドできない、クラスが継承できないことを意味します。内部クラスがローカル変数にアクセスするには、ローカル変数を最終型として定義する必要があります。

Finally は例外処理ステートメント構造の一部であり、常に実行されることを意味します。

Finalize は、Object クラスのメソッドです。リサイクルされたオブジェクトのこのメソッドは、ガベージ コレクタの実行時に呼び出されます。このメソッドをオーバーライドして、ファイルを閉じるなど、ガベージ コレクション中に他のリソースのリサイクルを行うことができます。等ただし、JVM は、このメソッドが常に呼び出されることを保証しません

6. 実行時例外と一般例外の類似点と相違点は何ですか?

例外は、プログラムの実行中に発生する可能性のある異常な状態を表します。ランタイム例外は、仮想マシンの通常の操作で発生する可能性のある例外を表し、一般的な操作エラーです。 Java コンパイラでは、発生する可能性のある非ランタイム例外をスローするメソッドを宣言する必要がありますが、キャッチされないランタイム例外をスローするメソッドを宣言する必要はありません。

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

エラーは、回復が不可能ではないが困難な場合の深刻な問題を示します。たとえば、メモリのオーバーフローです。プログラムがそのような状況に対処することを期待することは不可能です。例外は設計または実装の問題を表します。つまり、プログラムが正常に実行されている場合には決して起こらない状況を表します。

8. Java の例外処理メカニズムの簡単な原理と応用について簡単に説明します。

例外とは、Java プログラムの実行中 (コンパイルされていない) に発生する異常な状況またはエラーを指します。これは現実の出来事と非常によく似ています。現実の出来事には、時間、場所、登場人物、プロットなどが含まれます。イベントの情報。情報はオブジェクトで表すことができます。Java はオブジェクト指向のアプローチを使用して例外を処理します。プログラム内で発生する各例外をオブジェクトにカプセル化し、それを表します。オブジェクトには例外情報が含まれます。

Java は例外を分類します。さまざまなタイプの例外は、さまざまな Java クラスによって表されます。すべての例外のルート クラスは java.lang.Throwable であり、Throwable から 2 つのサブクラスが派生します:

Error および例外、エラーは、アプリケーション自体が克服および回復できない重大な問題を表します。プログラムはクラッシュするだけです。たとえば、メモリ オーバーフローやスレッド デッドロックなどのシステムの問題です。

例外は、プログラムがまだ克服および回復できる問題を示します。これは、システム例外と通常の例外に分けられます。

システム例外は、ソフトウェア自体の欠陥によって引き起こされる問題です。つまり、開発者の配慮が不十分なために発生したソフトウェアの問題は、ソフトウェア ユーザーが克服したり回復したりすることはできません。ただし、そのような問題が発生しても、ソフトウェア システムは実行を継続できるか、ソフトウェアがハングします。たとえば、配列スクリプトの範囲外 (ArrayIndexOutOfBoundsException) )、空のポインタ例外 (NullPointerException)、クラス変換例外 (ClassCastException);

一般的な例外は、動作環境の変更や例外によって引き起こされる問題であり、ネットワークの切断、不十分な問題など、ユーザーが克服できる問題です。ハードディスクの空き容量。このような例外が発生した後、プログラムが停止することはありません。

Java は、システム例外と通常の例外に対して異なる解決策を提供します。コンパイラは、通常の例外を try..catch によって処理するか、throws ステートメントを使用して上位層の呼び出しメソッドにスローし続けるように強制します。チェック済み例外とも呼ばれます。例外、およびシステム例外は処理されるかどうかが異なるため、コンパイラは try..catch 処理を強制したり宣言をスローしたりしないため、システム例外は未チェック例外とも呼ばれます。

(推奨チュートリアル: java 入門チュートリアル )

9. Java のヒープとスタックの違いは何ですか?

JVM のヒープとスタックは異なるメモリ領域に属し、異なる目的に使用されます。スタックはメソッド フレームやローカル変数を格納するためによく使用されますが、オブジェクトは常にヒープ上に割り当てられます。スタックは通常、ヒープよりも小さく、複数のスレッド間で共有されませんが、ヒープは JVM 全体のすべてのスレッドによって共有されます。

スタック: 関数で定義されたいくつかの基本的なタイプの変数とオブジェクト参照変数は、関数のスタック メモリに割り当てられます。変数がコード ブロックで定義されると、Java はその変数をスタックに割り当てます。変数はメモリ空間を割り当てます。変数のスコープを超えると、Java は変数に割り当てられたメモリ空間を自動的に解放し、そのメモリ空間はすぐに他の目的に使用できるようになります。

ヒープ: ヒープ メモリは、new によって作成されたオブジェクトと配列を格納するために使用され、ヒープに割り当てられたメモリは、Java 仮想マシンの自動ガベージ コレクタによって管理されます。配列またはオブジェクトがヒープ内に生成された後、スタック内の変数の値がヒープ メモリ内の配列またはオブジェクトの最初のアドレスと等しくなるように、スタック内に特殊な変数を定義することもできます。配列またはオブジェクトの参照変数を取得した後、スタック内の参照変数を使用して、プログラム内でヒープ内の配列またはオブジェクトにアクセスできます。参照変数は、配列またはオブジェクトに名前を付けるのと同じです。物体。

10. int をバイト型変数に強制することはできますか?値がバイト型の範囲より大きい場合はどうなりますか?

強制変換もできますが、Java の int は 32 ビット、byte は 8 ビットなので、強制変換すると int 型の上位 24 ビットが破棄されてしまいます。タイプの範囲は -128 ~ 127 です。

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

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