ホームページ  >  記事  >  Java  >  Java の基本的な面接の質問 (3)

Java の基本的な面接の質問 (3)

(*-*)浩
(*-*)浩オリジナル
2019-12-03 15:14:052082ブラウズ

Java の基本的な面接の質問 (3)

String s = new String("xyz");いくつの StringObject が作成されますか? String クラスを継承することは可能ですか?

両方または一方が可能です。「xyz」はオブジェクトに対応します。このオブジェクトは文字列定数バッファーに配置されます。定数「xyz」は常に表示されます。何度出現しても、バッファ内にあるものです。 (推奨学習: Java インタビューの質問 )

Newstring 毎回、新しいオブジェクトを作成します。「定数 xyz 」オブジェクトの内容を使用して、新しい String オブジェクトを作成します。 「xyz」が以前に使用されている場合、「xyz」はここでは作成されず、バッファから直接取得されます。この時点で、StringObject が作成されます。

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

String と StringBuffer の違い

JAVA プラットフォームには、String と StringBuffer という 2 つのクラスがあり、文字列を保存および操作できます。つまり、複数の文字列が含まれています。キャラクターのキャラクターデータ。 String クラスは、数値的に不変の文字列を提供します。この StringBuffer クラスによって提供される文字列は変更できます。

文字データが変更されることがわかっている場合は、StringBuffer を使用できます。通常、文字データを動的に構築するには StringBuffers を使用します。

#次のステートメントによって合計で作成されるオブジェクトの数: 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 になるはずです。

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 関数に返します。

いわゆる return は、サブ関数が「もう実行しません。メイン関数は引き続き実行できます。結果はまったくありません。これを言う前に結果が jar に入れられることを意味します」 。

final、finally、finalize の違い。

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


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


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


ランタイム例外と一般例外の類似点と相違点は何ですか?

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


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

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


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

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

Java はオブジェクト指向のアプローチを使用して例外を処理します。プログラム内で発生する各例外を、それを表すオブジェクトにカプセル化し、そのオブジェクトには例外情報が含まれます。

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

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


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

システム例外は次のとおりです。ソフトウェア自体の欠陥によって引き起こされる問題は、ソフトウェア開発者の不適切な配慮によって引き起こされる問題であり、ソフトウェアのユーザーはこの問題を克服して回復することはできませんが、そのような問題が発生した場合でも、ソフトウェア システムが実行を継続したり、ソフトウェアがハングしたりする可能性があります。

例: 配列スクリプトの範囲外 (ArrayIndexOutOfBoundsException)、ヌル ポインター例外 (NullPointerException)、クラス変換例外 (ClassCastException);

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


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

Java におけるヒープとスタックの違いは何ですか?

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

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

ヒープ: ヒープ メモリは、new によって作成されたオブジェクトと配列を格納するために使用され、ヒープに割り当てられたメモリは、Java 仮想マシンの自動ガベージ コレクタによって管理されます。

ヒープ内に配列またはオブジェクトを生成した後、スタック内の特殊変数を定義して、スタック内のこの変数の値が、ヒープ内の配列またはオブジェクトの最初のアドレスと等しくなるようにすることもできます。ヒープ メモリ。スタック この変数は、配列またはオブジェクトの参照変数になります。将来、スタック内の参照変数を使用して、プログラム内のヒープ内の配列またはオブジェクトにアクセスできるようになります。参照変数は次の変数と同等です。配列またはオブジェクトに名前を付ける。

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

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

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。