在我之前的帖子中,我討論了一些重要的Java SE 8面試問題和答案。在這篇帖子中,我們將討論一些更多的Java SE 8面試問題和答案。在閱讀本帖子之前,請先閱讀我的上一篇帖子:“Java SE 8 面試問題(第一部分)”。
Java SE 8 面試問題
- 什麼是Java SE 8中的內部迭代?
- 外部迭代和內部迭代之間的區別?
- 外部迭代的主要缺點是什麼?
- 內部迭代相對於外部迭代的主要優勢是什麼?
- 內部迭代相對於外部迭代的主要缺點是什麼?
- 外部迭代相對於內部迭代的主要優勢是什麼?
- 我們什麼時候需要使用內部迭代?什麼時候需要使用外部迭代?
- Java 8的Stream API中的中間操作和終端操作之間的區別?
- 在Java介面中是否可以提供方法實現?如果可以,我們如何提供它們?
- 什麼是默認方法?為什麼我們需要Java 8介面中的默認方法?
- 什麼是靜態方法?為什麼我們需要Java 8介面中的靜態方法?
- 差異在於函數式編程和面向對象編程?
- 解釋舊版Java日期API的問題?Java 8的日期和時間API相對於舊版日期API和Joda Time API的優勢是什麼?
- 為什麼我們需要Java SE 8中的新日期和時間API?解釋Java SE 8日期和時間API如何解決舊版Java日期API的問題?
- Java的舊版日期API和Java 8的日期和時間API之間有什麼區別?
- 什麼是多重繼承?Java 8如何支持多重繼承?
- 介面中由於默認方法而導致的鑽石問題是什麼?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