Java SE 8のインタビューの質問と回答(パート1)

この投稿では、いくつかの重要なJava SE 8 インタビューの質問と回答について議論します。残りのJava SE 8 インタビューの質問については、別の投稿で説明します。

Java 8 インタビューの質問

  1. なぜ再びJavaを変更する必要があるのですか?
  2. Java SE 8の新機能は何ですか?
  3. Java SE 8の新機能の利点は何ですか?
  4. ラムダ式とは何ですか?
  5. ラムダ式の3つの部分とは何ですか?ラムダ式の型は何ですか?
  6. 関数インターフェースとは何ですか?SAMインターフェースとは何ですか?
  7. 独自の関数インターフェースを定義することは可能ですか?@FunctionalInterfaceとは何ですか?関数インターフェースを定義するためのルールは何ですか?
  8. @FunctionalInterfaceアノテーションは、関数インターフェースを定義するために必須ですか?@FunctionalInterfaceアノテーションの使用は何ですか?なぜJavaで関数インターフェースが必要なのですか?
  9. いつJava 8 Stream APIを使用する必要がありますか?プロジェクトでJava 8 Stream APIを使用する理由は何ですか?
  10. コレクションAPIとStream APIの違いを説明してください。
  11. Java SE 8でのSpliteratorとは何ですか?Java SE 8でのIteratorとSpliteratorの違いは何ですか?
  12. Java 8でのOptionalとは何ですか?Optionalの使用目的は何ですか?Java 8 Optionalの利点は何ですか?
  13. Type Inferenceとは何ですか?Type Inferenceは、Java 7やそれ以前の古いバージョンで利用できますか、それともJava SE 8でのみ利用できますか?

Java 8 インタビューの質問と回答

このセクションでは、前のセクションから各質問を取り上げ、詳細な説明で回答します。さらなる情報や例が必要な場合は、JournalDEVで利用可能な以前のJava SE 8の投稿をご覧ください。

なぜJavaを再び変更する必要があるのですか?

Oracle Corporationは、Java SE 8で次の利点を導入するために多くの新しい概念を導入しました。

  • 現在のマルチコアCPUを効率的に活用する方法
    最近、ハードウェアの変化が激しいです。現在、すべてのシステムはマルチコアCPU(2、4、8、16コアなど)を使用してアプリケーションを展開・実行しています。私たちは、これらのマルチコアプロセッサを効率的に活用するために、Javaで新しいプログラミング構造が必要です。これにより、高度に並行し、スケーラブルなアプリケーションを開発することができます。FP(関数型プログラミング)の機能を活用するために
    Oracle Corporationは、Java SE 8の一部として多くのFP(関数型プログラミング)の概念を導入し、その利点を活用しています。

Java SE 8の新機能?

  • Lambda式
  • 関数型インターフェース
  • Stream API
  • 日付と時刻API
  • インターフェースのデフォルトメソッドと静的メソッド
  • Spliterator
  • メソッドとコンストラクタの参照
  • コレクションAPIの拡張
  • 並行性ユーティリティの拡張
  • Fork/Joinフレームワークの拡張
  • 内部イテレーション
  • 並列配列と並列コレクションの操作
  • Optional
  • 型注釈と繰り返し可能な注釈
  • メソッドパラメータのリフレクション
  • Base64エンコーディングおよびデコーディング
  • IOおよびNIO2の拡張
  • Nashorn JavaScriptエンジン
  • javacの拡張機能
  • JVMの変更
  • Java 8コンパクトプロファイル:compact1、compact2、compact3
  • JDBC 4.2
  • JAXP 1.6
  • Java DB 10.10
  • ネットワーキング
  • セキュリティの変更

Java SE 8の新機能の利点は何ですか?

Java SE 8の新機能から次の利点を得ることができます:

  • より簡潔で読みやすいコード
  • より再利用可能なコード
  • よりテスト可能でメンテナンスしやすいコード
  • 高並行性および高スケーラビリティのコード
  • 並行コードを記述する
  • データベースのような操作を記述する
  • より良いパフォーマンスアプリケーション
  • より生産性の高いコード

ラムダ式とは何ですか?

Lambda Expression(ラムダ式)は、一連の入力パラメーターを受け入れ、結果を返す匿名関数です。Lambda Expressionは、名前のないコードブロックであり、パラメーターの有無、結果の有無にかかわらず、実行時に要求されます。

ラムダ式の3つの部分は何ですか?ラムダ式のタイプは何ですか?

A Lambda Expression contains 3 parts:

  • パラメーターリスト
    ラムダ式には、0個または1個以上のパラメーターを含めることができます。これはオプションです。- ラムダ矢印演算子
    「->」はラムダ矢印演算子として知られています。これは、パラメーターリストと本文を区別します。- ラムダ式の本体

「Journal Dev」の型はjava.lang.Stringです。 「true」の型はブール型です。同様に、Lambda Expressionの型は何ですか?Lambda Expressionの型は関数型インターフェースです。例:次のLambda Expressionの型は何ですか?

   () -> System.out.println("Hello World");

このLambda Expressionにはパラメーターがなく、結果を返しません。そのため、その型は「java.lang.Runnable」関数型インターフェースです。

Functional Interfaceとは何ですか?SAM Interfaceとは何ですか?

A Functional Interface is an interface, which contains one and only one abstract method. Functional Interface is also known as SAM Interface because it contains only one abstract method. SAM Interface stands for Single Abstract Method Interface. Java SE 8 API has defined many Functional Interfaces.

私たち自身のFunctional Interfaceを定義することは可能ですか? @FunctionalInterfaceは何ですか?Functional Interfaceを定義するためのルールは何ですか?

はい、私たち自身のFunctional Interfaceを定義することは可能です。Java SE 8の@FunctionalInterfaceアノテーションを使用して、インタフェースをFunctional Interfaceとしてマークします。Functional Interfaceを定義するためには、以下のルールに従う必要があります:

  • 1つの抽象メソッドを持つインタフェースを定義します。
  • 複数の抽象メソッドを定義することはできません。
  • インタフェース定義内で@FunctionalInterfaceアノテーションを使用します。
  • デフォルトメソッド、静的メソッドを含む他のメソッドを任意の数だけ定義できます。
  • もし、java.lang.Objectクラスのメソッドを抽象メソッドとしてオーバーライドした場合、それは抽象メソッドとして数えられません。

@FunctionalInterfaceアノテーションは、関数インターフェースを定義するために必須ですか?@FunctionalInterfaceアノテーションの用途は何ですか?なぜJavaで関数インターフェースが必要なのですか?

@FunctionalInterfaceアノテーションで関数インターフェースを定義することは必須ではありません。必要がない場合、このアノテーションを省略することができます。しかし、関数インターフェースの定義でそれを使用する場合、Javaコンパイラはそのインターフェース内に1つの抽象メソッドのみを使用するように強制します。なぜ関数インターフェースが必要なのでしょうか?Java SE 8のラムダ式の型は関数インターフェースです。ラムダ式を使用する場所では、関数インターフェースが使用されていることを意味します。

いつJava 8 Stream APIを使用するのですか?なぜJava 8 Stream APIをプロジェクトで使用する必要がありますか?

Javaプロジェクトが次の操作を実行したい場合、多くの利点を得るためにJava 8 Stream APIを使用することが良いです:

  • データベースのような操作を実行したい場合。たとえば、groupby操作、orderby操作などを実行したい場合。
  • 操作を遅延して実行したい場合。
  • 関数型スタイルのプログラミングを記述したい場合。
  • 並列操作を実行したい場合。
  • 内部反復を使用したい場合。
  • パイプライン操作を実行したい場合。
  • より良いパフォーマンスを達成したい場合。

コレクションAPIとストリームAPIの違いを説明してください。

S.No. Collection API Stream API
1. It’s available since Java 1.2 It is introduced in Java SE 8
2. It is used to store Data (A set of Objects). It is used to compute data (Computation on a set of Objects).
3. We can use both Spliterator and Iterator to iterate elements. We can use forEach to performs an action for each element of this stream. We can’t use Spliterator or Iterator to iterate elements.
4. It is used to store unlimited number of elements. Stream API is used to process on the elements of a Collection.
5. Typically, it uses External Iteration concept to iterate Elements such as Iterator. Stream API uses internal iteration to iterate Elements, using forEach methods.
6. Collection Object is constructed Eagerly. Stream Object is constructed Lazily.
7. We add elements to Collection object only after it is computed completely. We can add elements to Stream Object without any prior computation. That means Stream objects are computed on-demand.
8. We can iterate and consume elements from a Collection Object at any number of times. We can iterate and consume elements from a Stream Object only once.

Java SE 8 での Spliterator とは何ですか?Java SE 8 での Iterator と Spliterator の違いは何ですか?

Spliterator は Splitable Iterator の略で、Oracle Corporation によって Java SE 8 の一部として新しく導入されました。Iterator および ListIterator のように、これも Iterator インターフェースの一部です。

S.No. Spliterator Iterator
1. It is introduced in Java SE 8. It is available since Java 1.2.
2. Splitable Iterator Non-Splitable Iterator
3. It is used in Stream API. It is used for Collection API.
4. It uses Internal Iteration concept to iterate Streams. It uses External Iteration concept to iterate Collections.
5. We can use Spliterator to iterate Streams in Parallel and Sequential order. We can use Iterator to iterate Collections only in Sequential order.
6. We can get Spliterator by calling spliterator() method on Stream Object. We can get Iterator by calling iterator() method on Collection Object.
7. Important Method: tryAdvance() Important Methods: next(), hasNext()

Java 8 での Optional とは何ですか?Optional の使用法は何ですか?Java 8 Optional の利点は何ですか?

Optional: Optional は Java SE 8 の一環として導入された final クラスです。java.util パッケージで定義されています。存在するか存在しないかのオプション値を表すために使用されます。値を含むか含まないかのどちらかで、最大で一つの要素しか含むことができません。これは “null” 値の代替手段です。Optional の主な利点は次のとおりです:

  • null チェックを避けるために使用されます。
  • “NullPointerException” を回避するために使用されます。

タイプ推論とは何ですか?タイプ推論はJava 7や7より前の古いバージョンで利用可能ですか、それともJava SE 8でのみ利用可能ですか?

タイプ推論とは、コンパイル時にコンパイラが型を決定することを意味します。これはJava SE 8での新機能ではありません。Java 7やJava 7より前のバージョンでも利用可能です。Java 7より前:Java配列を探検しましょう。以下に示すように値が入ったStringの配列を定義します:

String str[] = { "Java 7", "Java 8", "Java 9" };

ここでは右側にいくつかのString値を割り当てていますが、その型を定義していません。Javaコンパイラは自動的にその型を推論し、Stringの配列を作成します。Java 7:Oracle CorporationはJava SE 7で不要なジェネリクスの型定義を避けるために「ダイヤモンド演算子」という新機能を導入しました。

Map<String,List<Customer>> customerInfoByCity = new HashMap<>();

ここでは右側に型情報を定義しておらず、単にJava SE 7のダイヤモンド演算子を定義しています。Java SE 8:Oracle CorporationはJava SE 8でこのタイプ推論の概念を大幅に強化しました。私たちはこの概念を使用して、ラムダ式、関数、メソッド参照などを定義します。

ToIntBiFunction<Integer,Integer> add = (a,b) -> a + b;

{
“error”: “Upstream error…”
}

Source:
https://www.digitalocean.com/community/tutorials/javase8-interview-questions-part1