Java SE 8 面試問題和答案(第二部分)

在我之前的帖子中,我討論了一些重要的Java SE 8面試問題和答案。在這篇帖子中,我們將討論一些更多的Java SE 8面試問題和答案。在閱讀本帖子之前,請先閱讀我的上一篇帖子:“Java SE 8 面試問題(第一部分)”。

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日期API的問題?Java 8的日期和時間API相對於舊版日期API和Joda Time API的優勢是什麼?
  14. 為什麼我們需要Java SE 8中的新日期和時間API?解釋Java SE 8日期和時間API如何解決舊版Java日期API的問題?
  15. Java的舊版日期API和Java 8的日期和時間API之間有什麼區別?
  16. 什麼是多重繼承?Java 8如何支持多重繼承?
  17. 介面中由於默認方法而導致的鑽石問題是什麼?Java 8如何解決這個問題?

Java SE 8面試問題與答案

什麼是Java SE 8中的內部迭代?

在Java 8之前,我們沒有內部迭代的概念。Java 8引入了一個新功能,稱為“內部迭代”。在Java 8之前,Java語言只有外部迭代來迭代聚合對象的元素,如集合,數組等。內部迭代意味著“通過Java API在內部逐個迭代聚合對象的元素”。我們不是讓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 將負責 “如何做” 的代碼。

內部迭代相對於外部迭代的主要缺點是什麼?

相較於外部迭代,內部迭代有一個主要缺點:

  • 在內部迭代中,由於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 中,我們可以使用以下兩個新概念在介面中提供方法實現:

  • 默認方法
  • 靜態方法

什麼是默認方法?為什麼我們需要 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:

  • 我們可以將特定於介面的輔助或工具方法保留在同一介面中,而不是在單獨的實用程序類中。
  • 我們不需要單獨的實用程序類,如Collections,Arrays等來保留實用程序方法。
  • 責任的明確分離。這意味著我們不需要一個實用程序類來保留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日期API的問題?Java 8的日期和時間API相對於舊日期API和Joda Time API有什麼優勢?

Java的舊Java日期API指的是Java SE 8之前提供的日期API,即Date、Calendar、SimpleDateFormat等。Java的舊日期API與Java 8的日期和時間API以及Joda Time API相比有以下問題或缺點。

  • 大多數API已被棄用。
  • 可讀性較差。
  • java.util.Date是可變的且不是線程安全的。
  • java.text.SimpleDateFormat不是線程安全的。
  • 性能較差。

Java SE 8的日期和時間API相對於Java的舊日期API具有以下優勢。

  • 使用非常簡單。
  • 人類可讀的語法,可讀性更高。
  • 所有API都是線程安全的。
  • 性能更好。

為什麼我們需要 Java SE 8 中的新日期和時間 API?解釋一下 Java SE 8 的日期和時間 API 如何解決舊的 Java Date API 的問題?

我們需要 Java 8 的日期和時間 API 來開發高性能、線程安全和高度可擴展的 Java 應用程序。Java 8 的日期和時間 API 通過遵循不可變性和線程安全的原則解決了所有舊的 Java 日期 API 的問題。

Java 舊日期 API 與 Java 8 的日期和時間 API 有哪些不同之處?

Java 舊日期 API 與 Java 8 的日期和時間 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 通過引入新功能:介面中的預設方法「Implementing Methods in Interfaces」來支援多重繼承。由於這個功能,Java 8 支援了多重繼承,但有一些限制。

介面中的菱形問題是什麼?Java 8 如何解決這個問題?

Java 8 默認方法在一個類實現多個接口時可能會引入“diamond problem”。當一個類擴展多個具有相同方法實現(默認方法)的接口時,這種情況就會發生。以下是展示介面默認方法中Diamond Problem的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給出編譯時錯誤:“從類型C和B繼承的重複的默認方法display的名稱相同,帶有參數()和()”。這是因為Java編譯器將混淆在類D中使用哪個display()。類D從接口B和C都繼承了display()方法。為了解決這個問題,Java 8 提供了以下解決方案。

class D implements B, C {

	@Override
	public void display() {
		B.super.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