Java SE 8の面接の質問と回答(パート1)
この投稿では、重要なJava SE 8のインタビューの質問と回答について話し合います。私はもう1つの投稿を書いて、残りのJava SE 8のインタビューの質問について話し合います。
Java 8 インタビューの質問
-
- なぜ再びJavaに変更する必要があるのですか?
-
- Java SE 8の新機能とは?
-
- Java SE 8の新機能の利点は何ですか?
-
- ラムダ式とは何ですか?
-
- ラムダ式の3つのパーツとは何ですか?ラムダ式の型は何ですか?
-
- 関数インターフェースとは何ですか?SAMインターフェースとは何ですか?
-
- 独自の関数インターフェースを定義することは可能ですか?@FunctionalInterfaceとは何ですか?関数インターフェースを定義するためのルールは何ですか?
-
- 関数インターフェースを定義するために@FunctionalInterfaceアノテーションは必須ですか?@FunctionalInterfaceアノテーションの利用目的は何ですか?なぜJavaで関数インターフェースが必要なのですか?
-
- いつJava 8のStream APIを使用しますか?プロジェクトでJava 8のStream APIを使用する理由は何ですか?
-
- コレクションAPIとStream APIの違いを説明してください。
-
- Java SE 8のSpliteratorとは何ですか?Java SE 8のIteratorとSpliteratorの違いは何ですか?
-
- Java 8のOptionalとは何ですか?Optionalの利用目的は何ですか?Java 8のOptionalの利点は何ですか?
- 型の推論とは何ですか?型の推論はJava 7やそれ以前のバージョンでも利用できますか、それともJava SE 8でのみ利用できますか?
Java 8 インタビューの質問と回答
このセクションでは、前のセクションから各質問を取り上げ、詳細な説明を用いて回答します。もしもっと情報や例が必要な場合は、JournalDEVで利用可能なJava SE 8の以前の投稿を参照してください。
なぜ私たちは再びJavaに変更する必要があるのですか?
オラクル株式会社は、Java SE 8で新しいコンセプトを導入し、以下の利点を導入しました。
- To Utilize Current Multi-Core CPUs Efficiently
Recently, we can observe drastic changes in Hardware. Nowadays, all systems are using Multi-Core CPUs (2,4,8,16-Core, etc.) to deploy and run their applications. We need new Programming Constructs in Java to utilize these Multi-Core Processors efficiently to develop Highly Concurrently and Highly Scalable applications.- To Utilize FP Features
Oracle Corporation has introduced a lot of FP(Functional Programming) concepts as part of Java SE 8 to utilize the advantages of FP.
Java SE 8の新機能は何ですか?(Java SE 8 no shinkinou wa nan desu ka?)
- Lambda Expressions
- Functional Interfaces
- Stream API
- Date and Time API
- Interface Default Methods and Static Methods
- Spliterator
- Method and Constructor References
- Collections API Enhancements
- Concurrency Utils Enhancements
- Fork/Join Framework Enhancements
- Internal Iteration
- Parallel Array and Parallel Collection Operations
- Optional
- Type Annotations and Repeatable Annotations
- Method Parameter Reflection
- Base64 Encoding and Decoding
- IO and NIO2 Enhancements
- Nashorn JavaScript Engine
- javac Enhancements
- JVM Changes
- Java 8 Compact Profiles: compact1,compact2,compact3
- JDBC 4.2
- JAXP 1.6
- Java DB 10.10
- Networking
- Security Changes
Java SE 8の新機能の利点は何ですか? (Java SE 8の新機能のメリットは何ですか?)
Java SE 8の新機能によって、以下の利点を得ることができます。
- More Concise and Readable code
- More Reusable code
- More Testable and Maintainable Code
- Highly Concurrent and Highly Scalable Code
- Write Parallel Code
- Write Database Like Operations
- Better Performance Applications
- More Productive code
ラムダ式とは何ですか? (Ramuda-shiki to wa nan desu ka?)
ラムダ式は、一連の入力パラメータを受け入れ、結果を返す匿名関数です。ラムダ式は名前を持たず、パラメータの有無、結果の有無に関わらず、要求された時にコードブロックが実行されます。
ラムダ式の3つのパートは何ですか?ラムダ式のタイプは何ですか?
ラムダ式には3つのパートが含まれています。 (Ramuda-shiki ni wa mitsu no pāto ga fukumareteimasu.)
- Parameter List
A Lambda Expression can contain zero or one or more parameters. It is optional.- Lambda Arrow Operator
“->” is known as Lambda Arrow operator. It separates the parameters list and body.- Lambda Expression Body
「Journal Dev」のタイプはjava.lang.Stringです。「true」のタイプはBooleanです。同様に、ラムダ式のタイプは何ですか?ラムダ式のタイプはFunctional Interfaceです。例:以下のラムダ式のタイプは何ですか?
() -> System.out.println("Hello World");
このラムダ式はパラメータを持たず、結果も返さないので、その型は「java.lang.Runnable」という関数型インターフェースです。
機能インターフェースとは何ですか?SAMインターフェースとは何ですか?
関数型インターフェースは、1つだけの抽象メソッドを含むインターフェースです。関数型インターフェースは、1つだけの抽象メソッドを含むため、SAMインターフェースとも呼ばれます。SAMインターフェースは、単一の抽象メソッドインターフェースを意味します。Java SE 8のAPIには、多くの関数型インターフェースが定義されています。
自分自身のファンクショナルインターフェースを定義することは可能ですか? @FunctionalInterfaceとは何ですか?ファンクショナルインターフェースを定義するためのルールは何ですか?
はい、自分自身でファンクショナルインターフェースを定義することが可能です。Java SE 8の@FunctionalInterfaceアノテーションを使用して、インターフェースをファンクショナルインターフェースとしてマークします。ファンクショナルインターフェースを定義するためには、次のルールに従う必要があります。
- Define an interface with one and only one abstract method.
- We cannot define more than one abstract method.
- Use @FunctionalInterface annotation in interface definition.
- We can define any number of other methods like Default methods, Static methods.
- If we override java.lang.Object class’s method as an abstract method, which does not count as an abstract method.
関数型インターフェースを定義するためには、@FunctionalInterfaceアノテーションは必須ですか?@FunctionalInterfaceアノテーションの用途は何ですか?なぜJavaでは関数型インターフェースが必要なのですか?
@FunctionalInterfaceの注釈を使用して、Functional Interfaceを定義する必要はありません。希望しない場合は、この注釈を省略することができます。ただし、Functional Interfaceの定義でこれを使用する場合、Javaコンパイラはそのインターフェース内で1つだけの抽象メソッドを使用することを強制します。なぜFunctional Interfaceが必要なのでしょうか?Java SE 8のLambda式の型はFunctional Interfaceです。Lambda式を使用する場所では、つまりFunctional Interfaceを使用していることを意味します。
Java 8 の Stream API を使うタイミングはいつですか?なぜ Java 8 の Stream API をプロジェクトで使用する必要があるのでしょうか?
私たちのJavaプロジェクトが次の操作を行いたい場合、Java 8 Stream APIを使用する方が多くの利点が得られます。
- When we want perform Database like Operations. For instance, we want perform groupby operation, orderby operation etc.
- When want to Perform operations Lazily.
- When we want to write Functional Style programming.
- When we want to perform Parallel Operations.
- When want to use Internal Iteration
- When we want to perform Pipelining operations.
- When we want to achieve better performance.
コレクション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とは何ですか?IteratorとSpliteratorの違いは何ですか?
Spliteratorは、Splitable Iteratorの略です。オラクルコーポレーションによって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の利点は何ですか?
オプショナル:オプショナルは、Java SE 8の一部として導入されたファイナルクラスです。java.utilパッケージで定義されています。存在するか存在しないかのオプショナルな値を表すために使用されます。値を1つだけ含むか、0つだけを含むことができます。値が含まれている場合、それを取得することができます。それ以外の場合は何も取得できません。最大で1つの要素しか含まれないバウンドされたコレクションです。それは「null」値の代替です。オプショナルの主な利点は:
- It is used to avoid null checks.
- It is used to avoid “NullPointerException”.
型推論とは何ですか?型推論は、Java 7やそれ以前のバージョンでも利用できますか、それともJava SE 8でのみ利用できますか?
型推論とは、コンパイル時にコンパイラが型を決定することを意味します。これはJava SE 8で新しい機能ではありません。Java 7では利用でき、Java 7よりも前のバージョンでも利用できました。Java 7よりも前のバージョンでは、Javaの配列を探索しましょう。以下のように値を持つStringの配列を定義します。
String str[] = { "Java 7", "Java 8", "Java 9" };
ここでは、右側にいくつかの文字列の値が割り当てられていますが、その型が定義されていません。Javaコンパイラは自動的にその型を推論し、文字列の配列を作成します。Java 7:Oracle CorporationはJava SE 7で「ダイヤモンドオペレーター」という新しい機能を導入しました。これにより、ジェネリクスで不要な型定義を回避できます。
Map<String,List<Customer>> customerInfoByCity = new HashMap<>();
ここでは、右側での型情報は定義されていませんが、ただ単にJava SE 7のダイヤモンドオペレーターが定義されています。Java SE 8では、Oracle Corporationがこの型推論の概念を大幅に強化しています。この概念を使って、ラムダ式、関数、メソッド参照などを定義しています。
ToIntBiFunction<Integer,Integer> add = (a,b) -> a + b;
以下のJavaコンパイラは、左側で利用可能な型定義を見て、Lambda式のパラメータaとbの型をIntegerとして決定します。これがJava 8のインタビューの質問です。この投稿でいくつかのJava SE 8のインタビューの質問について話しましたが、今後の投稿でさらにいくつかのJava SE 8のインタビューの質問について話します。私の投稿が気に入ったり、問題や提案があればコメントを残してください。