Java 教程

Java 控制語句

面向物件程式設計

Java 內建類

Java 檔案處理

Java 錯誤與異常

Java 多執行緒

Java 同步

Java 網路

Java 集合

Java 介面

Java 資料結構

Java 集合演算法

高階 Java

Java 雜項

Java API 與框架

Java 類引用

Java 有用資源

Java 8 面試題及答案



這些 **Java 8 面試題及答案** 旨在讓您熟悉在 Java 程式設計 技術面試中可能遇到的問題型別。讓我們繼續瞭解 Java 8。

什麼是 Java 8?

Java 8 是 Java 程式語言開發的一個主要功能版本。其初始版本於 2014 年 3 月 18 日釋出。隨著 Java 8 的釋出,Java 提供了對函數語言程式設計的支援、一個新的 JavaScript 引擎、新的日期時間操作 API、新的流 API 等。

Java 8 面試題及答案

這些 **關於 Java 8 的面試題** 涵蓋了在新版本(即 Java 8)中新增的高階主題。通讀這些問題,學習並增強您對 Java 8 中新增的主題的瞭解,例如 Lambda 表示式方法引用預設方法流 API 等。

**先決條件:** 200+ Java 面試題及答案

Java 8 面試題 - 基礎級別

以下是一些 Java 8 基礎級別面試題及其答案。

1. Java 8 中引入了哪些新特性?

Java 8 添加了數十個特性,其中最重要的特性如下所示:

  • Lambda 表示式 - 為 Java 添加了函式式處理能力。

  • 方法引用 - 透過名稱引用函式,而不是直接呼叫它們。使用函式作為引數。

  • 預設方法 - 介面可以具有預設方法實現。

  • 新工具 - 添加了新的編譯器工具和實用程式,例如“jdeps”來確定依賴關係。

  • Stream API - 新的流 API 以便於管道處理。

  • 日期時間 API - 改進的日期時間 API。

  • Optional - 強調最佳實踐以正確處理空值。

  • Nashorn,JavaScript 引擎 - 一個基於 Java 的引擎,用於執行 JavaScript 程式碼。

除了這些新特性之外,在編譯器和 JVM 級別,還在幕後進行了大量特性增強。

2. 如何使用 Java 8 Lambda 表示式對字串列表進行排序?

以下程式碼使用 Java 8 Lambda 表示式對字串列表進行排序

//sort using java 8
private void sortUsingJava8(List<String> names) {
  Collections.sort(names, (s1, s2) -> s1.compareTo(s2));
}

3. Java 8 Lambda 表示式的特點是什麼?

Lambda 表示式的語法如下所示:

parameter −> expression body

以下是 Lambda 表示式的重要特徵:

  • 可選型別宣告 - 無需宣告引數的型別。編譯器可以從引數的值中推斷出型別。

  • 可選的引數圓括號 - 無需在圓括號中宣告單個引數。對於多個引數,需要使用圓括號。

  • 可選的花括號 - 如果表示式體包含單個語句,則無需使用花括號。

  • 可選的 return 關鍵字 - 如果主體只有一個表示式來返回值,則編譯器會自動返回值。需要使用花括號來指示表示式返回值。

4. 為什麼需要使用 Lambda 表示式?

Lambda 表示式主要用於定義 函式式介面 的內聯實現,即只有一個方法的介面。在上面的示例中,我們使用了各種型別的 Lambda 表示式來定義 MathOperation 介面的操作方法。然後我們定義了 GreetingService 的 sayMessage 方法的實現。

Lambda 表示式消除了對匿名類的需求,併為 Java 提供了一種非常簡單但功能強大的函數語言程式設計能力。

5. 在 Lambda 表示式中可以訪問哪種型別的變數?

使用 Lambda 表示式,您可以引用 final 變數或有效 final 變數(僅賦值一次)。如果變數第二次被賦值,則 Lambda 表示式會丟擲編譯錯誤。

6. 方法引用是什麼?

方法引用透過名稱指向方法。方法引用使用 ::(雙冒號)符號描述。方法引用可以用來指向以下型別的方法:

  • 靜態方法

  • 例項方法

  • 使用 new 運算子的建構函式(TreeSet::new)

7. 解釋 System.out::println 表示式。

System.out::println 方法是對 System 類中 out 物件的 println 方法的靜態方法引用。

8. 什麼是函式式介面?

函式式介面只有一種功能。例如,具有單個方法 'compareTo' 的 Comparable 介面用於比較目的。Java 8 定義了許多函式式介面,可在 lambda 表示式中廣泛使用。

9. BiConsumer<T,U> 函式式介面的目的是什麼?

它表示一個接受兩個輸入引數且不返回結果的操作。

10. BiFunction<T,U,R> 函式式介面的目的是什麼?

它表示一個接受兩個引數併產生結果的函式。

11. BinaryOperator<T> 函式式介面的目的是什麼?

它表示對相同型別的兩個運算元進行的操作,併產生與運算元型別相同的型別的結果。

12. BiPredicate<T,U> 函式式介面的目的是什麼?

它表示一個有兩個引數的謂詞(布林值函式)。

13. BooleanSupplier 函式式介面的目的是什麼?

它表示布林值結果的供應商。

14. Consumer<T> 函式式介面的目的是什麼?

它表示一個接受單個輸入引數且不返回結果的操作。

15. DoubleBinaryOperator 函式式介面的目的是什麼?

它表示對兩個雙精度值運算元進行的操作,併產生雙精度值結果。

16. DoubleConsumer 函式式介面的目的是什麼?

它表示一個接受單個雙精度值引數且不返回結果的操作。

17. DoubleFunction<R> 函式式介面的目的是什麼?

它表示一個接受雙精度值引數併產生結果的函式。

18. DoublePredicate 函式式介面的目的是什麼?

它表示一個具有一個雙精度值引數的謂詞(布林值函式)。

19. DoubleSupplier 函式式介面的目的是什麼?

它表示雙精度值結果的供應商。

20. DoubleToIntFunction 函式式介面的目的是什麼?

它表示一個接受雙精度值引數併產生整數值結果的函式。

21. DoubleToLongFunction 函式式介面的目的是什麼?

它表示一個接受雙精度值引數併產生長整數值結果的函式。

22. DoubleUnaryOperator 函式式介面的目的是什麼?

它表示對單個雙精度值運算元進行的操作,併產生雙精度值結果。

23. Function<T,R> 函式式介面的目的是什麼?

它表示一個接受一個引數併產生結果的函式。

24. IntBinaryOperator 函式式介面的目的是什麼?

它表示對兩個整數值運算元進行的操作,併產生整數值結果。

25. IntConsumer 函式式介面的目的是什麼?

它表示一個接受單個整數值引數且不返回結果的操作。

26. IntFunction<R> 函式式介面的目的是什麼?

它表示一個接受整數值引數併產生結果的函式。

27. IntPredicate 函式式介面的目的是什麼?

它表示一個具有一個整數值引數的謂詞(布林值函式)。

28. IntSupplier 函式式介面的目的是什麼?

它表示整數值結果的供應商。

29. IntToDoubleFunction 函式式介面的目的是什麼?

它表示一個接受整數值引數併產生雙精度值結果的函式。

30. IntToLongFunction 函式式介面的目的是什麼?

它表示一個接受整數值引數併產生長整數值結果的函式。

31. IntUnaryOperator 函式式介面的目的是什麼?

它表示對單個整數值運算元進行的操作,併產生整數值結果。

32. LongBinaryOperator 函式式介面的目的是什麼?

它表示對兩個長整數值運算元進行的操作,併產生長整數值結果。

33. LongConsumer 函式式介面的目的是什麼?

它表示一個接受單個長整數值引數且不返回結果的操作。

34. LongFunction<R> 函式式介面的目的是什麼?

它表示一個接受長整數值引數併產生結果的函式。

35. LongPredicate 函式式介面的目的是什麼?

它表示一個具有一個長整數值引數的謂詞(布林值函式)。

36. LongSupplier 函式式介面的目的是什麼?

它表示長整數值結果的供應商。

37. LongToDoubleFunction 函式式介面的目的是什麼?

它表示一個接受長整數值引數併產生雙精度值結果的函式。

38. LongToIntFunction 函式式介面的目的是什麼?

它表示一個接受長整數值引數併產生整數值結果的函式。

39. LongUnaryOperator 函式式介面的目的是什麼?

它表示對單個長整數值運算元進行的操作,併產生長整數值結果。

40. ObjDoubleConsumer<T> 函式式介面的目的是什麼?

它表示一個接受物件值和雙精度值引數且不返回結果的操作。

41. ObjIntConsumer<T> 函式式介面的目的是什麼?

它表示一個接受物件值和整數值引數且不返回結果的操作。

42. ObjLongConsumer<T> 函式式介面的目的是什麼?

它表示一個接受物件值和長整數值引數且不返回結果的操作。

43. Predicate<T> 函式式介面的目的是什麼?

它表示一個具有一個引數的謂詞(布林值函式)。

44. Supplier<T> 函式式介面的目的是什麼?

它表示結果的供應商。

45. ToDoubleBiFunction<T,U> 函式式介面的目的是什麼?

它表示一個接受兩個引數併產生雙精度值結果的函式。

46. ToDoubleFunction<T> 函式式介面的目的是什麼?

它表示一個產生雙精度值結果的函式。

47. ToIntBiFunction<T,U> 函式式介面的目的是什麼?

它表示一個接受兩個引數併產生整數值結果的函式。

48. ToIntFunction<T> 函式式介面的目的是什麼?

它表示一個產生整數值結果的函式。

49. ToLongBiFunction<T,U> 函式式介面的目的是什麼?

它表示一個接受兩個引數併產生長整數值結果的函式。

50. ToLongFunction<T> 函式式介面的目的是什麼?

它表示一個產生長整數值結果的函式。

Java 8 面試問題 - 經驗級別

以下是一些高階(經驗)級別的 Java 8 面試問題及其答案

51. UnaryOperator<T> 函式式介面的目的是什麼?

它表示對單個運算元進行的操作,併產生與其運算元型別相同的型別的結果。

52. 什麼是預設方法?

使用 Java 8,介面可以在介面中具有函式的預設實現。

53. 什麼是靜態預設方法?

從 Java 8 開始,介面也可以具有靜態輔助方法。

public interface vehicle {
   default void print() {
      System.out.println("I am a vehicle!");
   }
 
   static void blowHorn() {
      System.out.println("Blowing horn!!!");
   }
}

54. 如何在類中呼叫介面的預設方法?

使用 super 關鍵字以及介面名稱。

interface Vehicle {
   default void print() {
      System.out.println("I am a vehicle!");
   }
}
class Car implements Vehicle {
   public void print() {
      Vehicle.super.print();                  
   }
}

55. 如何在類中呼叫介面的靜態方法?

使用介面名稱。

interface Vehicle {
   static void blowHorn() {
      System.out.println("Blowing horn!!!");
   }
}
class Car implements Vehicle {
   public void print() {
      Vehicle.blowHorn();                  
   }
}

56. Java 8 中的流是什麼?

流表示來自源的物件序列,支援聚合操作。

57. Java 8 中的流管道是什麼?

大多數流操作返回流本身,以便可以對其結果進行管道化。這些操作稱為中間操作,其功能是獲取輸入、處理它們並將輸出返回到目標。collect() 方法是一個終端操作,通常位於管道操作的末尾以標記流的結束。

58. Java 8 中集合和流有什麼區別?

流操作在內部對提供的源元素進行迭代,而集合則需要顯式迭代。

59. Java 8 中流的 forEach 方法的目的是什麼?

流提供了一種新的方法 'forEach' 來迭代流的每個元素。

60. 如何使用 Java 8 的 forEach 列印 10 個隨機數?

以下程式碼段顯示瞭如何使用 forEach 列印 10 個隨機數。

Random random = new Random();
random.ints().limit(10).forEach(System.out::println);

61. Java 8 中流的 map 方法的目的是什麼?

'map' 方法用於將每個元素對映到其對應的結果。

62. 如何在 Java 8 中列印數字的唯一平方?

以下程式碼段使用 map 列印數字的唯一平方。

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
//get list of unique squares
List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());

63. Java 8 中流的 filter 方法的目的是什麼?

'filter' 方法用於根據條件消除元素。

64. 如何在 Java 8 中列印空字串的數量?

以下程式碼段使用 filter 列印空字串的數量。

List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
//get count of empty string
int count = strings.stream().filter(string −> string.isEmpty()).count();

65. Java 8 中流的 limit 方法的目的是什麼?

'limit' 方法用於減少流的大小。

66. 如何在 Java 8 中列印 10 個隨機數?

以下程式碼段顯示瞭如何列印 10 個隨機數。

Random random = new Random();
random.ints().limit(10).forEach(System.out::println);

67. Java 8 中流的 sorted 方法的目的是什麼?

'sorted' 方法用於對流進行排序。

68. 如何在 Java 8 中按排序順序列印 10 個隨機數?

以下程式碼段顯示瞭如何按排序順序列印 10 個隨機數。

Random random = new Random();
random.ints().limit(10).sorted().forEach(System.out::println);

69. Java 8 中的並行處理是什麼?

parallelStream 是流的替代方案,用於並行處理。請檢視以下使用 parallelStream 列印空字串數量的程式碼段。

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
//get count of empty string
int count = strings.parallelStream().filter(string −> string.isEmpty()).count();
//It is very easy to switch between sequential and parallel streams.

70. Java 8 中的收集器是什麼?

收集器用於組合對流元素進行處理的結果。收集器可用於返回列表或字串。

List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
System.out.println("Filtered List: " + filtered);
String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));
System.out.println("Merged String: " + mergedString);

71. Java 8 中的統計收集器是什麼?

在 Java 8 中,引入了統計收集器,用於在進行流處理時計算所有統計資料。

72. 如何使用 Java 8 獲取列表中最大的數字?

以下程式碼將列印列表中最大的數字。

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
IntSummaryStatistics stats = integers.stream().mapToInt((x) −> x).summaryStatistics();
System.out.println("Highest number in List : " + stats.getMax());

73. 如何使用 Java 8 獲取列表中最小的數字?

以下程式碼將列印列表中最大的數字。

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
IntSummaryStatistics stats = integers.stream().mapToInt((x) −> x).summaryStatistics();
System.out.println("Lowest number in List : " + stats.getMin());

74. 如何使用 Java 8 獲取列表中所有數字的總和?

以下程式碼將列印列表中所有數字的總和。

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
IntSummaryStatistics stats = integers.stream().mapToInt((x) −> x).summaryStatistics();
System.out.println("Sum of all numbers : " + stats.getSum());

75. 如何使用 Java 8 獲取列表中所有數字的平均值?

以下程式碼將列印列表中所有數字的平均值。

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
IntSummaryStatistics stats = integers.stream().mapToInt((x) −> x).summaryStatistics();
System.out.println("Average of all numbers : " + stats.getAverage());

76. Java 8 中的 Optional 是什麼?

Optional 是一個容器物件,用於包含非空物件。Optional 物件用於表示空值(null)作為缺失值。此類具有各種實用程式方法,以方便程式碼處理值是否“可用”或“不可用”,而不是檢查空值。它是在 Java 8 中引入的,類似於 Guava 中的 Optional。

77. Java 8 中的 Nashorn 是什麼?

在 Java 8 中,引入了 Nashorn,一個改進的 JavaScript 引擎,以取代現有的 Rhino。Nashorn 提供了 2 到 10 倍的效能提升,因為它直接在記憶體中編譯程式碼並將位元組碼傳遞給 JVM。Nashorn 使用 Java 7 中引入的 invokedynamics 功能來提高效能。

78. JAVA 8 中的 jjs 是什麼?

對於 Nashorn 引擎,JAVA 8 引入了一個新的命令列工具 jjs,用於在控制檯中執行 JavaScript 程式碼。

79. 你可以從 Java 8 程式碼庫中執行 JavaScript 程式碼嗎?

是的!使用 ScriptEngineManager,可以在 Java 中呼叫和解釋 JavaScript 程式碼。

80. JAVA 8 中的本地日期時間 API 是什麼?

Local - 簡化的日期時間 API,沒有處理時區的複雜性。

81. JAVA 8 中的帶有時區的日期時間 API 是什麼?

Zoned - 用於處理各種時區的專門日期時間 API。

82. java8 中的 chromounits 是什麼?

java.time.temporal.ChronoUnit 列舉是在 Java 8 中新增的,用於替換舊 API 中用於表示天、月等值的整數值。

83. 如何使用 Java 8 的本地日期時間 API 獲取當前日期?

以下程式碼使用本地日期時間 API 獲取當前日期:

//Get the current date
LocalDate today = LocalDate.now();
System.out.println("Current date: " + today);

84. 如何使用 Java 8 的本地日期時間 API 將當前日期增加 1 周?

以下程式碼使用本地日期時間 API 將當前日期增加 1 周:

//add 1 week to the current date
LocalDate today = LocalDate.now();
LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS);
System.out.println("Next week: " + nextWeek);

85. 如何使用 Java 8 的本地日期時間 API 將當前日期增加 1 個月?

以下程式碼使用本地日期時間 API 將當前日期增加 1 個月。

//add 1 month to the current date
LocalDate today = LocalDate.now();
LocalDate nextMonth = today.plus(1, ChronoUnit.MONTHS);
System.out.println("Next month: " + nextMonth);

86. 如何使用 Java 8 的本地日期時間 API 將當前日期增加 1 年?

以下程式碼使用本地日期時間 API 將當前日期增加 1 年:

//add 1 year to the current date
LocalDate today = LocalDate.now();
LocalDate nextYear = today.plus(1, ChronoUnit.YEARS);
System.out.println("Next year: " + nextYear);

87. 如何使用 Java 8 的本地日期時間 API 將當前日期增加 10 年?

以下程式碼使用本地日期時間 API 將當前日期增加 10 年:

//add 10 years to the current date
LocalDate today = LocalDate.now();
LocalDate nextDecade = today.plus(1, ChronoUnit.DECADES);
System.out.println("Date after ten year: " + nextDecade);

88. 如何使用 Java 8 獲取下一個星期二?

以下程式碼使用 Java 8 獲取下一個星期二:

//get the next tuesday
LocalDate today = LocalDate.now();
LocalDate nextTuesday = today.with(TemporalAdjusters.next(DayOfWeek.TUESDAY));
System.out.println("Next Tuesday on : " + nextTuesday);

89. 如何使用 Java 8 獲取下個月的第二個星期六?

以下程式碼使用 Java 8 獲取下個月的第二個星期六:

//get the second saturday of next month
LocalDate firstInYear = LocalDate.of(date1.getYear(),date1.getMonth(), 1);
LocalDate secondSaturday = firstInYear.with(TemporalAdjusters.nextOrSame(DayOfWeek.SATURDAY)).with(TemporalAdjusters.next(DayOfWeek.SATURDAY));
System.out.println("Second Saturday on : " + secondSaturday);

90. 如何使用 Java 8 獲取當前日期的以毫秒為單位的時間戳?

以下程式碼獲取當前日期的以毫秒為單位的時間戳:

//Get the instant of current date in terms of milliseconds
Instant now = currentDate.toInstant();

91. 如何使用 Java 8 獲取本地日期時間的以毫秒為單位的時間戳?

以下程式碼獲取本地日期時間的以毫秒為單位的時間戳:

Instant now = currentDate.toInstant();
ZoneId currentZone = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(now, currentZone);
System.out.println("Local date: " + localDateTime);

92. 如何使用 Java 8 獲取帶有時區的日期時間的以毫秒為單位的時間戳?

以下程式碼獲取帶有時區的日期時間的以毫秒為單位的時間戳:

Instant now = currentDate.toInstant();
ZoneId currentZone = ZoneId.systemDefault();
ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(now, currentZone);
System.out.println("Zoned date: " + zonedDateTime);

93. 在 Java 8 中,哪個類實現了用於使用 Base64 編碼方案解碼位元組資料的解碼器?

靜態類 Base64.Decoder - 此類實現了用於使用 Base64 編碼方案解碼位元組資料的解碼器,如 RFC 4648 和 RFC 2045 中所指定。

94. 在 Java 8 中,哪個類實現了用於使用 Base64 編碼方案編碼位元組資料的編碼器?

靜態類 Base64.Encoder - 此類實現了用於使用 Base64 編碼方案編碼位元組資料的編碼器,如 RFC 4648 和 RFC 2045 中所指定。

95. 如何建立 Base64 解碼器?

Base64 類的 getDecoder() 方法返回一個 Base64.Decoder,它使用 Basic 型別 base64 編碼方案進行解碼。

96. 如何建立 Base64 編碼器?

Base64 類的 getEncoder() 方法返回一個 Base64.Encoder,它使用 Basic 型別 base64 編碼方案進行編碼。

97. 如何建立使用 MIME 型別 base64 編碼方案解碼的 Base64 解碼器?

Base64 類的 getMimeDecoder() 方法返回一個 Base64.Decoder,它使用 MIME 型別 base64 解碼方案進行解碼。

98. 如何建立使用 MIME 型別 base64 編碼方案編碼的 Base64 編碼器?

Base64 類的 getMimeEncoder() 方法返回一個 Base64.Encoder,它使用 MIME 型別 base64 編碼方案進行編碼。

99. 如何建立使用 URL 和檔名安全型別 base64 編碼方案解碼的 Base64 解碼器?

Base64 類的 getUrlDecoder() 方法返回一個 Base64.Decoder,它使用 URL 和檔名安全型別 base64 編碼方案進行解碼。

100. 如何建立使用 URL 和檔名安全型別 base64 編碼方案編碼的 Base64 編碼器?

Base64 類的 getUrlEncoder() 方法返回一個 Base64.Encoder,它使用 URL 和檔名安全型別 base64 編碼方案進行編碼。

下一步是什麼?

接下來,您可以回顧一下您之前完成的與該主題相關的作業,並確保您可以自信地談論它們。如果您是應屆畢業生,面試官不會期望您回答非常複雜的問題,而是您必須使您的基礎概念非常牢固。

其次,如果您無法回答一些問題,這實際上並不重要,但重要的是,無論您回答了什麼,都必須自信地回答。所以在面試時要充滿自信。我們在 tutorialspoint 祝您面試順利,並祝您未來的事業一切順利。乾杯!:-)

java8_questions_answers.htm
廣告