ホームページ  >  記事  >  Java  >  Java ジェネリックスの面接での質問

Java ジェネリックスの面接での質問

(*-*)浩
(*-*)浩オリジナル
2019-12-12 15:21:523073ブラウズ

Java ジェネリックスの面接での質問

Java のジェネリックとは何ですか?ジェネリックを使用する利点は何ですか?

ジェネリック型は次のとおりです。 Java SE 1.5 の新機能。ジェネリックの本質はパラメータ化された型であり、これは、操作対象のデータ型がパラメータとして指定されることを意味します。

利益:#2。後方および後方互換性#3。一般化されたコード、コードをもっと再利用できます

# 4。高性能、コード、コードGJ (汎用 JAVA) で書かれたものは Java 用にコンパイルできます。サーバーと仮想マシンはより多くの型情報をもたらし、Java プログラムをさらに最適化するための条件を提供します。

Java ではジェネリックスはどのように機能しますか?型消去とは何ですか?どのように機能しますか?

1. 型チェック: バイトコードを生成する前に型チェックを提供します

2. 型消去: すべての型パラメーターは、クラス、変数、メソッドを含む修飾された型に置き換えられます (型消去) )3. 型消去とポリモーフィズムが競合する場合、問題を解決するためにサブクラスでブリッジ メソッドが生成されます。

4. ジェネリック メソッドが呼び出された場合、戻り値の型が消去され、キャストが行われます。メソッドが呼び出されるときに挿入されます。

型の消去:

すべての型パラメーターは、修飾された型に置き換えられます:

たとえば、T-> ;Object ? extends BaseClass->BaseClass

仕組み:

ジェネリックスは type Erasure を通じて実装され、コンパイラはコンパイル時にすべての型関連情報を消去します。したがって、実行時に型に関連する情報はありません。たとえば、Listf7e83be87db5cd2d9a8a0b8117b38cd4 は、実行時に 1 つのリストだけで表されます。

これの目的は、Java 5 より前のバージョンで開発されたバイナリ クラス ライブラリとの互換性を確保することです。コンパイラがジェネリック型をプリミティブ型に変換しているため、実行時に型パラメーターにアクセスすることはできません。 このジェネリックに関する質問への回答に応じて、ジェネリックが型消去によって実装される理由や、コンパイラ エラーを引き起こす間違ったジェネリックを示すなど、いくつかのフォローアップの質問が表示されます。

Lista87fdacec66f0909fc0757c19f2d2b1d パラメータを受け入れるメソッドに Listf7e83be87db5cd2d9a8a0b8117b38cd4 を渡すことはできますか?

ジェネリックスに詳しくない人にとって、この Java ジェネリックスの質問はわかりにくいように思えるかもしれません。なぜなら、一見 String は Object の型であるため、Liste4f43e4896e15f0c0dca393c99aeb30e が期待されていますが、そうではありません。コンパイルエラーが発生します。

さらに考えてみると、Lista87fdacec66f0909fc0757c19f2d2b1d は String、Integer などのあらゆる種類のオブジェクトを格納できるのに対し、Listf7e83be87db5cd2d9a8a0b8117b38cd4 は Java でこれを行うのが理にかなっていることがわかります。 String を格納するためにのみ使用されます。

List<Object> objectList;
List<String> stringList;
objectList = stringList; //compilation error incompatible types

Java で未チェック型の警告を防ぐ方法は?

次のコードのようにジェネリック型とプリミティブ型を混在させると、Java 5 の javac がコンパイラーによって生成されます。

List<String> rawList = newArrayList()

などの unchecked タイプの警告: Hello.java は未チェックまたは安全でない操作を使用します;この種の警告は @SuppressWarnings(" unchecked") アノテーションを使用してブロックできます。

Lista87fdacec66f0909fc0757c19f2d2b1d と Java のプリミティブ型 List の違いは何ですか?

プリミティブ型とパラメータ化された型a87fdacec66f0909fc0757c19f2d2b1d の主な違い違いは、コンパイラはコンパイル時にプリミティブ型の型安全性チェックを実行せず、パラメータを使用して型をチェックすることです。型として Object を使用することで、メソッドが String などの任意の型のオブジェクトを受け入れることができることをコンパイラに伝えることができます。または整数。

この質問のテストポイントは、ジェネリックのプリミティブ型を正しく理解しているかどうかにあります。 2 番目の違いは、パラメーターを含む任意の型をプリミティブ型 List に渡すことができますが、Listf7e83be87db5cd2d9a8a0b8117b38cd4 を Lista87fdacec66f0909fc0757c19f2d2b1d を受け入れるメソッドに渡すことはできないことです。コンパイル エラーが発生するためです。

LRU キャッシュを実装するための汎用プログラムを作成しますか?

これは、Java プログラミングが好きな人のための演習に相当します。ヒントとして、LinkedHashMap を使用すると、固定サイズの LRU キャッシュを実装でき、LRU キャッシュがいっぱいになると、最も古いキーと値のペアがキャッシュから移動されます。

LinkedHashMap には、removeEldestEntry() というメソッドが用意されています。このメソッドは、put() および putAll() によって呼び出され、最も古いキーと値のペアを削除します。もちろん、すでに実行用の JUnit テストを作成している場合は、独自の実装コードを自由に作成できます。

ジェネリックは配列で使用できますか?

这可能是Java泛型面试题中最简单的一个了,当然前提是你要知道Array事实上并不支持泛型,这也是为什么Joshua Bloch在Effective Java一书中建议使用List来代替Array,因为List可以提供编译期的类型安全保证,而Array却不能。

如何编写一个泛型方法,让它能接受泛型参数并返回泛型类型?

编写泛型方法并不困难,你需要用泛型类型来替代原始类型,比如使用T, E or K,V等被广泛认可的类型占位符。最简单的情况下,一个泛型方法可能会像这样:

public V put(K key, V value) {
return cahe.put(key,value);
}

C++模板和java泛型之间有何不同?

java泛型实现根植于“类型消除”这一概念。当源代码被转换为Java虚拟机字节码时,这种技术会消除参数化类型。有了Java泛型,我们可以做的事情也并没有真正改变多少;他只是让代码变得漂亮些。鉴于此,Java泛型有时也被称为“语法糖”。

这和 C++模板截然不同。在 C++中,模板本质上就是一套宏指令集,只是换了个名头,编译器会针对每种类型创建一份模板代码的副本。

由于架构设计上的差异,Java泛型和C++模板有很多不同点:

C++模板可以使用int等基本数据类型。Java则不行,必须转而使用Integer。

在Java中,可以将模板的参数类型限定为某种特定类型。

在C++中,类型参数可以实例化,但java不支持。

在Java中,类型参数不能用于静态方法(?)和变量,因为它们会被不同类型参数指定的实例共享。在C++,这些类时不同的,因此类型参数可以用于静态方法和静态变量。

在Java中,不管类型参数是什么,所有的实例变量都是同一类型。类型参数会在运行时被抹去。在C++中,类型参数不同,实例变量也不同。

以上がJava ジェネリックスの面接での質問の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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