Java の基本的な面接の質問 - ジェネリックス

王林
リリース: 2020-09-28 16:26:35
転載
2119 人が閲覧しました

Java の基本的な面接の質問 - ジェネリックス

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

(推奨されるその他の関連する面接の質問:java の面接の質問と回答)

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

利点:

1. コンパイル中に型検出を提供する型安全性

2. 後方互換性

3. 一般化されたコード、コードは次のことができます。更新される さらなる再利用

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

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

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

2. 型消去: クラス、変数、メソッドを含むすべての型パラメーターが修飾された型に置き換えられます (型消去)

3. 型消去がポリモーフィズムと競合する場合は、サブクラスでブリッジ メソッドを生成して問題を解決します。

4. ジェネリック メソッドの戻り値の型が消去されると、そのときにキャストが挿入されます。このメソッドは

型消去と呼ばれます:

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

例:

T->Object ? extends BaseClass->BaseClass
ログイン後にコピー

仕組み:

ジェネリックは型消去によって実装されます。コンパイラはコンパイル時にすべての型関連情報を消去するため、実行時には型関連情報は存在しません。たとえば、List は、実行時に 1 つのリストだけで表されます。この目的は、Java 5 より前のバージョンで開発されたバイナリ クラス ライブラリとの互換性を確保することです。コンパイラがジェネリック型をプリミティブ型に変換しているため、実行時に型パラメーターにアクセスすることはできません。ジェネリックスの質問に対する回答に応じて、ジェネリックスが型消去によって実装される理由について追加の質問がされるか、コンパイラでエラーが発生する誤ったジェネリック コードが表示されます。

141、Listパラメータを受け取るメソッドに List を渡すことはできますか?

ジェネリックに慣れていない人にとって、この Java ジェネリックの質問は混乱するように思えるかもしれません。なぜなら、一見すると String はオブジェクトの一種であるため、必要な場合は List List を使用する必要があるからです。これはそうではありません。コンパイルエラーが発生します。さらに考えてみると、Listは String や Integer などのあらゆるタイプのオブジェクトを格納できるのに対し、List は格納するためにのみ使用できるため、Java がこれを行うのは理にかなっていることがわかります。文字列 s.

List objectList; List stringList; objectList = stringList; //compilation error incompatible types
                
ログイン後にコピー

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

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

List rawList = newArrayList()
ログイン後にコピー

など注: Hello.java は未チェックまたは安全でない操作を使用します;

この種の警告には @SuppressWarnings("unchecked") の注釈を付けてシールドできます。

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

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

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

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

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

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

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

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

これは Java ジェネリックである可能性があります。最も単純な面接の質問です。もちろん、配列が実際にはジェネリックスをサポートしていないことを知っていることが前提です。Joshua Bloch が著書『Effective Java』で Array の代わりに List を使用することを推奨しているのはこのためです。List はコンパイル時の型を提供できるためです。セキュリティは保証されますが、配列では保証されません。

146, ジェネリック パラメーターを受け入れ、ジェネリック型を返すようにジェネリック メソッドを作成する方法は?

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

public V put(K key, V value) { return cahe.put(key,value); }
ログイン後にコピー

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

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

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

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

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

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

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

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

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

相关推荐:java入门

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

ソース:csdn.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!