Javaの基礎知識まとめ Java言語の基本問題6点

1. コンパイルされたコードに import ステートメントが存在しますか?

存在しない!

2. ワイルドカードのインポートによりプログラムのパフォーマンスが低下しますか?

しません。コンパイラは、どのクラスが必要であるかを判断し、それらのクラスのみをインポートします。import ステートメントは、クラスの実行時の効率には影響しません。ワイルドカードインポートを使用するかどうかは個人の好みです。

3. short データ型と char データ型の違いは何ですか?

どちらもサイズが 16 ビットであるという点で、両者は密接に関連しています。主な違いは、short は符号付き (正の数と負の数を格納できる) のに対し、char は符号なしで、0 を含む正の数のみを格納できることです。

4. 拡張された for ループはイテレータでも機能しますか?

配列とコレクションのみに適用されます。イテレータをサポートしない理由は、イテレータによるコレクションのループを避けるために拡張された for ループ自体が追加されたためです。詳細については、 JSR-201 および拡張ループ仕様のドラフトを参照してください 。

5. Java では、finalize() メソッドが非推奨になったのはなぜですか?

Finalize() メソッドは、JVM によって呼び出されることが保証されていません。それは JVM 実装に依存します。Finalize() メソッドはボトルネックを引き起こし、パフォーマンスを低下させる可能性があります。

6. CopyOnWrite クラスは、ConcurrentHashMap などの他の並行クラスとどのように異なりますか?

これらのクラスは、コレクション内で参照が追加、削除、または変更されるたびにコレクションのコピーを作成し、そのコピーを指すように元のコレクション参照を更新します。これらのクラスは通常、コレクションへの変更が反復子によって認識されないようにするために使用されます。

7. Stringクラスのstrip()メソッドとtrim()メソッドの違いは何ですか?

どちらの方法も、文字列の先頭と末尾からスペースを削除するために使用されます。trim() は ASCII 文字のみをサポートしますが、strip() メソッドは Java 11 で導入され、Unicode などすべてをサポートします。

8. インスタンス初期化子とは何ですか?

インスタンス初期化子は、メンバーを初期化するために使用できるクラス内のコードのブロックです。これは、クラスのオブジェクトが作成されるたびに、コンストラクターが呼び出される前に呼び出されます。

class Animal {
    int legs;

    {
        this.legs = 10;
        System.out.println("Instance initializer block");
    } // This block is called as an instance initializer.

    public Animal() {
        System.out.println("Constructor");
    }
}

        出力

Instance initializer block
Constructor

9. コンストラクターでインスタンス変数を初期化できる場合、「インスタンス初期化ブロック」の実際の用途は何ですか?

  • 複数のコンストラクターを持つクラスでは、各コンストラクターでコードを繰り返す必要があります。インスタンス初期化子を使用すると、コードを 1 回記述するだけで、オブジェクトの作成にどのコンストラクターが使用されたかに関係なく、そのコードが実行されます。
  • インスタンス初期化子は、コンストラクターをまったく宣言できない匿名内部クラスでも役立ちます。

10. スロー可能なクラスでの fillInStackTrace() メソッドは何をしますか?

        fillInStackTrace() メソッドは、スロー可能オブジェクト内のスタック トレース情報をリセットし、現在のメソッド情報を使用して新しいスタック トレースを開始します。

fillinStackTrace() を使用しない例

void methodOne() throws Throwable {
    methodTwo();
}

void methodTwo() throws Throwable {
    methodThree();
}

void methodThree() throws Throwable {
    throw new Exception("Error occurred");
}

public static void main(String[] args) {
    try {
        new Test().methodOne();
    } catch (Throwable e) {
        e.printStackTrace();
    }
}

        出力

java.lang.Exception: Error occurred
 at com.test.Test.methodThree(Test.java:14)
 at com.test.Test.methodTwo(Test.java:10)
 at com.test.Test.methodOne(Test.java:6)
 at com.test.Test.main(Test.java:19)

fillInStackTrace() の使用例

void methodOne() throws Throwable {
    try {
        methodTwo();
    } catch (Throwable e) {
        throw e.fillInStackTrace();
    }
}

void methodTwo() throws Throwable {
    methodThree();
}

void methodThree() throws Throwable {
    throw new Exception("Error occurred");
}

public static void main(String[] args) {
    try {
        new Test().methodOne();
    } catch (Throwable e) {
        e.printStackTrace();
    }
}

        出力

java.lang.Exception: Error occurred
 at com.test.Test.methodOne(Test.java:9)
 at com.test.Test.main(Test.java:23)

11. 文字列の重複排除とは何ですか?

        文字列の重複排除は、Java アプリケーションで繰り返される文字列オブジェクトによって占有されるメモリを節約するのに役立ちます。重複または同一の文字列値が同じ文字配列を共有できるようにすることで、Java ヒープ メモリ内の文字列オブジェクトのメモリ フットプリントを削減します。

12. 「super」キーワードを使用して、実装されたクラス内のインターフェイスの静的メソッドを呼び出すことはできますか?

        コンパイルできません

interface A {
    public static void print() {
        System.out.println("Hello World");
    }
}

class MyClass implements A {

    public void hello() {
        super.print(); // COMPILATION ERROR!!!
    }
}

        ただし、「super」キーワードを使用して、継承されたクラス内のクラスの静的メソッドを呼び出すことができます。

class A {
    public static void print() {
        System.out.println("Hello World");
    }
}

class MyClass extends A {

    public void hello() {
        super.print(); // Valid!
    }
}

13. 最終クラスから匿名クラスを作成できますか?

        できません!匿名クラスの作成は、クラスの継承と同じです。したがって、「最終」クラスから継承することはできませんが、匿名クラスを作成することもできません。

final class Bird {
    
}

class MyClass {

    public static void main(String[] args) {
        Bird b = new Bird() {}; // 这句话编译错误

}

14. switch ステートメントは null 値を受け入れますか?

        null 値が switch ステートメントに渡されると、NullPointerException がスローされます。

15. enum はパブリック コンストラクターを持つことができますか?

        enum ではプライベート コンストラクターのみが許可されます。

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

        java.lang.Error は、 通常では処理できないエラーを表します。これらは通常、システム リソースの枯渇などの致命的な障害を指します。例としては、java.lang.OutOfMemoryError、java.lang.NoClassDefFoundError、java.lang.UnSupportedClassVersionError などがあります。

        一方、java.lang.Exception は、IOException、ArithmeticException など、捕捉して処理できるエラーを表します。

17. インスタンス オペレーターがコンパイル エラーを生成するのはどのような場合ですか?

  • プリミティブをチェックすることはできません
  • 変数はインスタンス化する必要があります。
  • オブジェクトは同じ継承ツリー内に存在する必要があります。そうしないとコンパイルされません。
class A {
}

class B {
}

class C extends A {
}

class Test {
    public static void main(String[] args) {
        A a = new A();
        System.out.println(a instanceof B); // COMPILATION ERROR
        System.out.println(a instanceof C); // Valid
        System.out.println(a instanceof A); // Valid
        
        C c = new C();
        System.out.println(c instanceof A); // Valid since C extends A
    }
}

18. 短絡計算とは何ですか?

短絡評価を使用すると、左側の値から全体の結果が予測できる場合に、AND 式と OR 式の右側を評価しなくても済みます。

int a = 3, b = 2;
boolean c = false;

c = (a > b && ++b == 3); // c is true,   b is 3
c = (a > b && ++b == 3); // c is false,  b is 3

c = (a > b || ++b == 3); // c is false,  b is 4
c = (a < b || ++b == 3); // c is true,   b is 4

c = (a < b | ++b == 3);  // c is true,   b is 5

19. コンストラクターで「this()」と「super()」の両方を使用できますか?

できない

class Car extends Vehicle {
    
    public Car() {
        this(20);
        super(10); // COMPILATION ERROR!!!
    }

    public Car(int x) {
        super(x);
    }
}

20. 次のプログラムの出力は何ですか?

class Test {

    static int myMethod() {
        try {
            throw new RuntimeException();
        } catch (Exception e) {
            System.out.println("Error");
            return 3;
        } finally {
            return 2;
        }
    }
    
    public static void main(String[] args) {
        System.out.println(myMethod());
    }
}

最初に「Error」が出力され、次に 2 が出力されます。常に最後のブロックが実行されます。

21. switch ステートメントが Long、Float、Boolean、Double をサポートしていないのはなぜですか?

  • 浮動小数点数は不正確です。switch ステートメントは、完全一致を実行するために使用されます。したがって、float で完全一致を実行することが常に良いとは限りません。
  • ブール値はifステートメントを使用して簡単に実行できるため、 サポートされていません 。
  • 長くすることは許されません。 これは、switch ステートメントが、 JVM の tableswitch またはlookup switch仮想マシン命令コードを使用して実装されているためです。これらは 32 ビット オペコード (整数) でのみ動作しますが、長いオペコードは 64 ビット (8 バイト) です。

22.WeakHashMapとは何ですか?

WeakHashMap は、Java の 3 つの専用マップ実装のうちの 1 つです。そのキー タイプは WeakReference で、マップ エントリのキーがプログラム内で参照されなくなったときに、マップ エントリをガベージ コレクションできるようになります。これは、どのスレッドからもキーにアクセスできなくなるとエントリが消える、「レジストリのような」データ構造や単純なメモリ内キャッシュの実装を実装するのに役立ちます。

23. IdentityHashMapとは何ですか ?

Mapインターフェイスで は、キーの比較に equals()メソッドを使用する必要があります。ただし、  IdentityHashMap は==記号を 使用して オブジェクトの同等性をチェックし、 equals()メソッド を呼び出す代わりに hashCode() を使用する代わりに System.identityHashCode()を使用してハッシュ コードを計算します。

24. ConcurrentHashMapとは何ですか?

ConcurrentHashMap は、HashMap のパフォーマンスが標準に達していないため、アプリケーションでスレッドを処理する場合には HashMap が適切な選択肢ではないことがわかっているため、HashMap の機能強化です。

25. LinkedHashMapとは何ですか ?

LinkedHashMap は、 要素の挿入順序を維持し、ハッシュによる高速アクセスを提供します。さらに、以下に示すように、LRU (最も最近使用された順) 順での要素の並べ替えがサポートされています。

LinkedHashMap<Integer, String> linkedHashMap = new LinkedHashMap<>(16, 0.75f, true);
linkedHashMap.put(0, "a");
linkedHashMap.put(1, "b");
linkedHashMap.put(2, "c");

System.out.println(linkedHashMap);  // {0=a, 1=b, 2=c}
System.out.println(linkedHashMap);  // {0=a, 1=b, 2=c}

linkedHashMap.get(0);
System.out.println(linkedHashMap); // {1=b, 2=c, 0=a}

26. ConcurrentHashMap と Hashtable の違いは何ですか?

        ハッシュ テーブルはデータ全体に対して単一のロックを使用します。ConcurrentHashMap は、オブジェクト レベル (つまりマップ全体) ではなく、セグメント レベル (デフォルトでは 16) で複数のロックを使用します。

        ConcurrentHashMap ロックは更新にのみ適用されます。完全な同時実行が可能な取得の場合、取得には最後に完了した更新操作の結果が反映されます。したがって、書き込みはロックを使用して行われますが、読み取りは非常に迅速に行われる可能性があります。

27. Java で使用できる 4 種類の参照は何ですか?

        Java は 4 種類の参照を提供します。それらは、StrongReference、WeakReference、SoftReference、および PhantomReference です。

28. isInstance()メソッドとinstanceof演算子の違いは何ですか?

        instanceof 演算子と isInstance() メソッドは両方とも、オブジェクトのクラスをチェックするために使用されます。しかし、主な違いは、オブジェクトのクラスを動的にチェックする場合に生じます。この場合、 isInstance() メソッドが機能します。インスタンス演算子ではそれを行うことはできません。

29. 静的メソッドをオーバーライドできますか?

        できません。

おすすめ

転載: blog.csdn.net/bashendixie5/article/details/131504310