在这篇文章中,我们将讨论一些重要的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?
- 解释集合API和流API之间的区别?
- Java SE 8中的Spliterator是什么?Iterator和Spliterator在Java SE 8中的区别是什么?
- Java 8中的Optional是什么?Optional的用途是什么?Java 8 Optional的优势是什么?
- 什么是类型推断?类型推断在旧版本如Java 7及7之前是否可用,还是仅在Java SE 8中可用?
Java 8面试问题和答案
在本节中,我们将逐个回答前一节中的每个问题,并提供详细的描述。如果您需要更多信息和示例,请查看JournalDEV中提供的之前的Java SE 8文章。
为什么我们需要再次改变Java?
Oracle Corporation在Java SE 8中引入了许多新概念,以实现以下好处:
- 近期,我们可以观察到硬件方面发生了巨大变化。如今,所有系统都在使用多核 CPU(2、4、8、16 核等)来部署和运行它们的应用程序。我们需要新的 Java 编程结构来高效利用这些多核处理器,以开发高并发和高可伸缩性的应用程序。- 为了充分利用函数式编程(FP)特性,Oracle 公司在 Java SE 8 中引入了许多 FP 概念。
Java SE 8 的新特性?
- – Lambda 表达式
- – 函数式接口
- – Stream 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
- 网络
- 安全性变化
Java SE 8 新特性的优势?
我们可以从 Java SE 8 新特性中获得以下好处:
- 更简洁易读的代码
- 更可重用的代码
- 更易测试和维护的代码
- 高并发和高可扩展的代码
- 编写并行代码
- 编写类似数据库的操作
- 更好性能的应用程序
- 更高生产力的代码
什么是 Lambda 表达式?
Lambda表达式是一种匿名函数,接受一组输入参数并返回结果。Lambda表达式是一段没有名称的代码块,可以有或没有参数,可以有或没有结果。此代码块根据需要执行。
Lambda表达式的三个部分是什么?Lambda表达式的类型是什么?
A Lambda Expression contains 3 parts:
- 参数列表
Lambda表达式可以包含零个、一个或多个参数。这是可选的。- Lambda箭头运算符
“->”被称为Lambda箭头运算符。它分隔参数列表和主体。- Lambda表达式主体
“Journal Dev”的类型是java.lang.String。“true”的类型是Boolean。同样,Lambda表达式的类型是什么?Lambda表达式的类型是一个函数接口。例如:下面Lambda表达式的类型是什么?
() -> System.out.println("Hello World");
这个Lambda表达式没有参数,也不返回任何结果。因此,它的类型是“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以获得许多好处:
- 当我们想要执行类似数据库的操作时,比如我们想要执行groupby操作、orderby操作等。
- 当我们想要进行惰性操作时。
- 当我们想要编写函数式编程时。
- 当我们想要执行并行操作时。
- 当我们想要使用内部迭代时。
- 当我们想要执行流水线操作时。
- 当我们想要实现更好的性能时。
解释Collection 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中引入的一个final类。它被定义在java.util包中。它用于表示可选的值,这些值可以存在也可以不存在。它可以包含一个值或零个值。如果它包含一个值,我们可以获取它。否则,我们什么也得不到。它是一个有界的集合,即它最多只包含一个元素。它是“null”值的替代品。Optional的主要优点是:
- 它用于避免空指针检查。
- 它用于避免“NullPointerException”。
类型推断是什么?类型推断在旧版本中,比如Java 7及7之前版本是否可用,还是仅在Java SE 8中可用?
类型推断是指在编译时由编译器确定类型。这不是Java SE 8中的新功能。它在Java 7及Java 7之前版本也是可用的。Java 7之前:让我们探讨Java数组。定义一个带有以下值的String数组:
String str[] = { "Java 7", "Java 8", "Java 9" };
在这里,我们在右侧分配了一些String值,但没有定义其类型。Java编译器会自动推断其类型并创建一个String数组。Java 7:Oracle Corporation在Java SE 7中引入了“Diamond Operator”新功能,以避免在泛型中不必要地定义类型。
Map<String,List<Customer>> customerInfoByCity = new HashMap<>();
在这里,我们没有在右侧定义类型信息,只是定义了Java SE 7的Diamond Operator。Java SE 8:Oracle Corporation在Java SE 8中大大增强了这个类型推断概念。我们使用这个概念来定义Lambda表达式、函数、方法引用等。
ToIntBiFunction<Integer,Integer> add = (a,b) -> a + b;
在这里,Java编译器观察到左侧可用的类型定义,并确定Lambda表达式参数a和b的类型为整数。这就是关于Java 8面试问题的全部内容。我在这篇文章中讨论了一些Java SE 8面试问题,并将在接下来的文章中讨论更多Java SE 8面试问题。如果您喜欢我的文章或有任何问题/建议,请给我留言。
Source:
https://www.digitalocean.com/community/tutorials/javase8-interview-questions-part1