Java SE 8インタビューの質問と回答(Part-2)

以前の投稿では、いくつかの重要なJava SE 8の面接の質問と回答について議論しました。この投稿では、さらにいくつかのJava SE 8の面接の質問と回答について議論します。この投稿を読む前に、以下の投稿をご覧ください:「Java SE 8の面接の質問(パート1)」。

Java SE 8の面接の質問

  1. Java SE 8における内部反復とは何ですか?
  2. 外部反復と内部反復の違いは何ですか?
  3. 外部反復の主な欠点は何ですか?
  4. 内部反復の主な利点は外部反復に比べて何ですか?
  5. 内部反復の主な欠点は何ですか?
  6. 外部反復の主な利点は何ですか?
  7. いつ内部反復を使用する必要がありますか?いつ外部反復を使用する必要がありますか?
  8. Java 8のStream APIの中間操作と終端操作の違いは何ですか?
  9. Javaのインターフェースでメソッドの実装を提供することは可能ですか?可能な場合、どのように提供しますか?
  10. デフォルトメソッドとは何ですか?なぜJava 8のインターフェースでデフォルトメソッドが必要ですか?
  11. 静的メソッドとは何ですか?なぜJava 8のインターフェースで静的メソッドが必要ですか?
  12. 関数型プログラミングとオブジェクト指向プログラミングの違いは何ですか?
  13. 旧JavaのDate APIの問題を説明してください。Java 8のDate and Time APIは、旧Date APIおよびJoda Time APIに比べてどのような利点がありますか?
  14. なぜJava SE 8で新しいDate and Time APIが必要なのですか?Java SE 8のDate and Time APIは、旧JavaのDate APIの問題をどのように解決していますか?
  15. Javaの旧Date APIとJava 8のDate and Time APIの違いは何ですか?
  16. マルチプル継承とは何ですか?Java 8はどのようにマルチプル継承をサポートしていますか?
  17. デフォルトメソッドによるインターフェースのダイヤモンド問題とは何ですか?Java 8はこの問題をどのように解決していますか?

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

Java SE 8の内部イテレーションとは何ですか?

Java 8以前、内部反復の概念はありませんでした。Java 8では、「内部反復」という新しい機能が導入されました。Java 8以前、Java言語には、コレクション、配列などの集約オブジェクトの要素を反復するための外部反復しかありませんでした。内部反復とは、「Java APIによって集約オブジェクトの要素を内部的に1つずつ反復すること」を意味します。Javaアプリケーションが外部的に反復を行う代わりに、Java APIにこのジョブを内部的に行ってもらいます。

外部反復と内部反復の違いは何ですか?

S.No. External Iteration Internal Iteration
1. Available before Java 8 too. It is introduced in Java SE 8
2. Iterating an Aggregated Object elements externally. Iterating an Aggregated Object elements internally (background).
3. Iterate elements by using for-each loop and Iterators like Enumeration, Iterator, ListIterator. Iterate elements by using Java API like “forEach” method.
4. Iterating elements in Sequential and In-Order only. Not required to iterate elements in Sequential order.
5. It follows OOP approach that is Imperative Style. It follows Functional Programming approach that is Declarative Style.
6. It does NOT separate responsibilities properly that is, it defines both “What is to be done” and “How it is to be done”. It defines only “What is to be done”. No need to worry about “How it is to be done”. Java API takes care about “How to do”.
7. Less Readable Code. More Readable code.

外部反復の主な欠点は何ですか?

外部反復には以下のような欠点があります:

  • 命令形式のコードを書く必要があります。
  • 責任の明確な分離がありません。「何をするか」と「どのようにするか」のコードが密接に結び付いています。
  • 読みにくいコードです。
  • 冗長で手間のかかるコードです。
  • 要素を順次反復する必要があります。
  • 並行性と並列性を適切にサポートしていません。

内部反復の主な利点は何ですか?

外部反復と比較して、内部反復には以下の利点があります:

  • 関数型プログラミングスタイルに従っているため、宣言的なコードを書くことができます。
  • より読みやすく簡潔なコード。
  • 冗長なコードや定型コードの書き込みを避けることができます。
  • 要素を順次に反復する必要はありません。
  • 並行性と並列性を適切にサポートしています。
  • アプリケーションのパフォーマンスを向上させるために並列コードを書くことができます。
  • 責任の明確な分離。実行内容と実行方法のコード間の緩い結合。
  • 「実行内容」についてのコードのみを書き、Java APIが「実行方法」のコードを処理します。

内部反復の主な欠点は何ですか?

外部反復と比較して、内部反復には1つの主な欠点があります:

  • 内部反復では、Java APIが内部で要素を反復処理するため、反復処理に対する制御はありません。

外部反復に比べて、内部反復の主な利点は何ですか?

内部反復と比較して、外部反復には主な利点があります:

  • 外部反復では、Java APIが要素の反復処理を行わないため、反復処理に対して制御が多く可能です。

いつ内部反復を使用する必要がありますか?いつ外部反復を使用する必要がありますか?

内部反復または外部反復を使用する状況を理解する必要があります。

  • 反復処理に対してより多くの制御を必要とする場合は、外部反復を使用できます。
  • 反復処理に対してより多くの制御を必要としない場合は、内部反復を使用できます。
  • 高い並行性と並列性を持つアプリケーションを開発する必要がある場合は、内部反復を使用する必要があります。

Java 8のStream APIの中間操作と終端操作の違いは何ですか?

S.No. Stream Intermediate Operations Stream Terminal Operations
1. Stream Intermediate operations are not evaluated until we chain it with Stream Terminal Operation. Stream Terminal Operations are evaluated on it’s own. No need other operations help.
2. The output of Intermediate Operations is another Stream. The output of Intermediate Operations is Not a Stream. Something else other than a Stream.
3. Intermediate Operations are evaluated Lazily. Terminal Operations are evaluated Eagerly.
4. We can chain any number of Stream Intermediate Operations. We can NOT chain Stream Terminal Operations.
5. We can use any number of Stream Intermediate Operations per Statement. We can use only one Stream Terminal Operation per Statement.

Javaのインターフェースでは、メソッドの実装を提供することは可能ですか?可能な場合、どのように提供しますか?

Java 7以前では、インターフェースでメソッドの実装を提供することはできませんでした。しかし、Java 8以降では可能になりました。Java SE 8では、以下の2つの新しい概念を使用してインターフェースにメソッドの実装を提供することができます:

  • デフォルトメソッド
  • 静的メソッド

デフォルトメソッドとは何ですか?なぜJava 8のインターフェースでデフォルトメソッドが必要なのですか?

A Default Method is a method which is implemented in an interface with “default” keyword. It’s new featured introduced in Java SE 8. We need Default Methods because of the following reasons:

  • インターフェースでメソッドの実装を提供することができます。
  • インターフェースに新しい機能を追加することで、そのインターフェースを実装するクラスを壊すことなく機能を追加することができます。
  • 優れた後方互換性の機能を提供します。
  • 既存の機能を簡単に拡張することができます。
  • 既存の機能を維持しやすくすることができます。

スタティックメソッドとは何ですか?なぜJava 8のインターフェースでスタティックメソッドが必要なのですか?

A Static Method is an Utility method or Helper method, which is associated to a class (or interface). It is not associated to any object. We need Static Methods because of the following reasons:

  • インターフェース固有のヘルパーメソッドやユーティリティメソッドを別のユーティリティクラスではなく同じインターフェースに保持することができます。
  • コレクション、配列などのユーティリティメソッドを保持するために別個のユーティリティクラスが必要ありません。
  • 責任の明確な分離です。つまり、Collection APIのユーティリティメソッドを保持するためにCollectionsなどのユーティリティクラスが必要ありません。
  • APIの拡張が容易です。
  • APIのメンテナンスが容易です。

関数型プログラミングとオブジェクト指向プログラミングの違いは何ですか?

Functional Programming OOP
Does not exist State Exists State
Uses Immutable data Uses Mutable data
It follows Declarative Programming Model It follows Imperative Programming Model
Stateless Programming Model Stateful Programming Model
Main Fcous on: “What you are doing” Main focus on “How you are doing”
Good for Parallel (Concurrency) Programming Poor for Parallel (Concurrency) Programming
Good for BigData processing and analysis NOT Good for BigData processing and analysis
Supports pure Encapsulation It breaks Encapsulation concept
Functions with No-Side Effects Methods with Side Effects
Functions are first-class citizens Objects are first-class citizens
Primary Manipulation Unit is “Function” Primary Manipulation Unit is Objects(Instances of Classes)
Flow Controls: Function calls, Function Calls with Recursion Flow Controls: Loops, Conditional Statements
It uses “Recursion” concept to iterate Collection Data. It uses “Loop” concept to iterate Collection Data. For example:-For-each loop in Java
Order of execution is less importance. Order of execution is must and very important.
Supports both “Abstraction over Data” and “Abstraction over Behavior”. Supports only “Abstraction over Data”.
We use FP when we have few Things with more operations. We use OOP when we have few Operations with more Things. For example: Things are classes and Operations are Methods in Java.

注意:FP、IP、OOPの比較についての詳細情報は、以前の投稿「FP、OOP(IP)の比較」をご覧ください。

古いJavaのDate APIの問題を説明してください。Java 8のDate and Time APIとJoda Time APIに比べてJava 8のDate and Time APIの利点は何ですか?

Javaの古いDate APIとは、Java SE 8より前に利用可能なDate、Calendar、SimpleDateFormatなどのAPIのことです。Javaの古いDate APIは、次のような問題や欠点があります。Java 8のDate and Time APIやJoda Time APIと比較して。

  • ほとんどのAPIが非推奨です。
  • 可読性が低いです。
  • java.util.Dateは変更可能でスレッドセーフではありません。
  • java.text.SimpleDateFormatはスレッドセーフではありません。
  • パフォーマンスが低いです。

Java SE 8のDate and Time APIには、次のような利点があります。Javaの古いDate APIと比較して。

  • 非常に使いやすいです。
  • 人間に読みやすい構文で、可読性が高いです。
  • すべてのAPIはスレッドセーフです。
  • パフォーマンスが向上しています。

なぜJava SE 8で新しいDate and Time APIが必要なのですか?Java SE 8のDate and Time APIは、古いJavaのDate APIの問題をどのように解決していますか?

Java 8のDate and Time APIを使用することで、高性能でスレッドセーフでスケーラブルなJavaアプリケーションを開発することができます。Java 8のDate and Time APIは、不変性とスレッドセーフの原則に従うことで、古いDate APIの問題を解決しています。

Javaの古いDate APIとJava 8のDate and Time APIの違いは何ですか?

Javaの古いDate APIとJava 8のDate and Time APIの違いは以下の通りです。

S.No. Java’s OLD Java Date API Java 8’s Date and Time API
1. Available before Java 8 too. It is introduced in Java SE 8
2. Not Thread Safe. Thread Safe.
3. Mutable API. Immutable API.
4. Less Performance. Better Performance.
5. Less Readability. More Readability.
6. It’s not recommended to use as its deprecated. It’s always recommended to use.
7. Not Extendable. Easy to Extend.
8. It defines months values from 0 to 11, that is January = 0. It defines months values from 1 to 12, that is January = 1.
9. It’s an old API. It’s a new API.

複数継承とは何ですか?Java 8は複数継承をどのようにサポートしていますか?

複数継承とは、クラスが複数の親クラスから特性や機能を継承または拡張することを意味します。Java 7以前では、複数継承は不可能でした。なぜなら、Javaは「クラスは一つのクラスまたは抽象クラスをのみ継承すべき」というルールに従っているからです。しかし、Javaは「クラスは任意の数のインターフェースを継承できる」というルールに従っているため、インターフェースを使用して複数の実装継承を提供することは可能です。しかし、Java 8では新機能であるデフォルトメソッドを導入することで、「インターフェースでのメソッドの実装」をサポートしています。この機能により、Java 8は一定の制限付きで複数継承をサポートしています。

デフォルトメソッドによるインターフェースのダイヤモンド問題とは何ですか?Java 8はこの問題をどのように解決していますか?

Java 8のデフォルトメソッドは、クラスが複数のインターフェースを実装する場合にダイヤモンド問題を引き起こす可能性があります。これは、クラスが同じメソッド実装(デフォルトメソッド)を持つ複数のインターフェースを拡張する場合に発生します。ダイヤモンド問題を示すためのJava SE 8のコードの例:

interface A {
	default void display() {
		System.out.println("A");
	}
}

interface B extends A {
	default void display() {
		System.out.println("B");
	}
}

interface C extends A {
	default void display() {
		System.out.println("C");
	}
}

class D implements B, C {
}

上記のコードスニペットでは、クラスDはコンパイル時エラーが発生します。「Duplicate default methods named display with the parameters () and () are inherited from the types C and B」というエラーメッセージです。これは、JavaコンパイラがクラスDでどのdisplay()を使用するか混乱するためです。クラスDは、インターフェースBとCの両方からdisplay()メソッドを継承しています。この問題を解決するために、Java 8では以下の解決策が提供されています。

class D implements B, C {

	@Override
	public void display() {
		B.super.display();
	}
	
}

これにより、Diamond Problemが解決されます。Cインターフェースのデフォルトメソッドを使用したい場合は、C.super.display();を使用します。これがJava 8のインタビューの質問のすべてです。今後の投稿でさらにJava SE 8のインタビューの質問について議論します。投稿が気に入ったり、問題や提案がある場合は、コメントを残してください。

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