在這篇文章中,我們將討論一些重要的Java SE 8面試問題及其答案。我將寫另一篇文章來討論剩餘的Java SE 8面試問題。
Java 8面試問題
- 為什麼我們需要再次改變Java?
- Java SE 8的新特性是什麼?
- Java SE 8的新特性有哪些優點?
- 什麼是Lambda表達式?
- Lambda表達式的三個部分是什麼?Lambda表達式的類型是什麼?
- 什麼是功能性接口?什麼是SAM接口?
- 我們是否可以定義自己的功能性接口?什麼是@FunctionalInterface?定義功能性接口的規則是什麼?
- 定義功能性接口是否需要@FunctionalInterface註釋?@FunctionalInterface註釋的用途是什麼?為什麼我們需要在Java中使用功能性接口?
- 什麼時候使用Java 8 Stream API?為什麼我們需要在項目中使用Java 8 Stream API?
- 解釋Collection 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?
Oracle Corporation在Java SE 8中引入了許多新概念,以實現以下好處:
- 充分利用目前的多核心CPU
最近,我們可以觀察到硬體方面發生了劇變。現今,所有系統都在使用多核心CPU(2、4、8、16核心等)來部署和運行它們的應用程式。我們需要在Java中引入新的編程概念,以有效地利用這些多核處理器,以開發高度並行和高度可擴展的應用程式。- 充分利用函數式編程功能
Oracle Corporation在Java SE 8中引入了許多函數式編程(FP)概念,以充分利用FP的優勢。
Java SE 8的新功能?
- Lambda表達式
- 函數式介面
- 流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
- Networking
- Security 更改
Java SE 8 新特性的优势?
我们可以从 Java SE 8 新特性中获得以下好处:
- 更简洁和可读的代码
- 更可重用的代码
- 更易测试和维护的代码
- 高度并发和可扩展的代码
- 编写并行代码
- 编写类似数据库操作的代码
- 更好性能的应用程序
- 更高生产率的代码
什么是 Lambda 表达式?
Lambda Expression是一個匿名函數,接受一組輸入參數並返回結果。Lambda Expression是一段沒有名稱的代碼塊,可以有或沒有參數,也可以有或沒有結果。這段代碼根據需要執行。
Lambda Expression的三個部分是什麼?Lambda Expression的類型是什麼?
A Lambda Expression contains 3 parts:
- 參數列表
Lambda Expression可以包含零個、一個或多個參數。這是可選的。- Lambda Arrow運算符
“->”被稱為Lambda Arrow運算符。它分隔參數列表和主體。- Lambda Expression主體
“Journal Dev”的類型是java.lang.String。“true”的類型是Boolean。同樣,Lambda Expression的類型是什麼?Lambda Expression的類型是一個Functional Interface。例如:以下Lambda Expression的類型是什麼?
() -> System.out.println("Hello World");
這個Lambda Expression沒有參數,也不返回任何結果。因此,它的類型是“java.lang.Runnable”功能接口。
什麼是功能介面?什麼是SAM介面?
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.
我們可以定義自己的功能介面嗎?什麼是@FunctionalInterface?定義功能介面的規則是什麼?
是的,我們可以定義自己的功能介面。我們使用Java SE 8的@FunctionalInterface注釋來標記介面為功能介面。我們需要遵循以下規則來定義功能介面:
- 定義一個具有一個且僅有一個抽象方法的介面。
- 我們不能定義多於一個抽象方法。
- 在介面定義中使用@FunctionalInterface注釋。
- 我們可以定義任意數量的其他方法,如默認方法、靜態方法。
- 如果我們覆寫java.lang.Object類的方法作為抽象方法,這並不算是抽象方法。
是否 @FunctionalInterface 注釋是定義函數接口的必需品?@FunctionalInterface 注釋的用途是什麼?為什麼我們在Java中需要函數接口?
定義函數接口時不是必須使用 @FunctionalInterface 注釋。如果不想使用,我們可以省略此注釋。但是,如果在函數接口定義中使用它,Java編譯器會強制使用該接口中的一個且僅有一個抽象方法。我們為什麼需要函數接口?Java SE 8的Lambda表達式的類型是函數接口。無論我們在哪裡使用Lambda表達式,這意味著我們正在使用函數接口。
我們何時使用 Java 8 Stream API?為什麼我們需要在我們的項目中使用 Java 8 Stream API?
當我們的 Java 項目想要執行以下操作時,最好使用 Java 8 Stream API 以獲得許多好處:
- 當我們想要執行類似於數據庫的操作時。例如,我們想要執行分組操作、排序操作等。
- 當我們想要執行惰性操作時。
- 當我們想要編寫函數式編程時。
- 當我們想要執行並行操作時。
- 當我們想要使用內部迭代時。
- 當我們想要執行管道操作時。
- 當我們想要達到更好的性能時。
解釋集合 API 和 Stream 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代表可分割的迭代器。它是由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的一部分引入。它在java.util包中定義。它用於表示可選值,可能存在或不存在。它可以包含一個值或零個值。如果包含一個值,我們可以獲取它。否則,我們什麼都得不到。它是一個有界集合,即它最多只能包含一個元素。它是“null”值的替代品。Optional的主要優點是:
- 它用於避免空值檢查。
- 它用於避免“NullPointerException”。
什麼是類型推斷?類型推斷在舊版本中,如Java 7及7之前是否可用,還是僅在Java SE 8中可用?
類型推斷是指在編譯時由編譯器確定類型。這並不是Java SE 8中的新功能,而是在Java 7及Java 7之前就已經存在。 在Java 7之前:讓我們探索Java數組。定義一個字符串數組,其值如下所示:
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在Java SE 8中大大增強了這種類型推斷的概念。我們使用這個概念來定義Lambda表達式、函數、方法引用等。
ToIntBiFunction<Integer,Integer> add = (a,b) -> a + b;
{
“error”: “Upstream error…”
}
Source:
https://www.digitalocean.com/community/tutorials/javase8-interview-questions-part1