Java SE 8面试问题和答案(部分一)
在这篇文章中,我们将讨论一些与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的流API?为什么我们需要在项目中使用Java 8的流API?
-
- 解释集合API和流API之间的区别?
-
- Java SE 8中的Spliterator是什么?Iterator和Spliterator在Java SE 8中有什么区别?
-
- Java 8中Optional是什么?Optional的用途是什么?Java 8 Optional的优点是什么?
- 什么是类型推断?类型推断在旧版本(如Java 7及更早版本)中是否可用,还是仅在Java SE 8中可用?
Java 8面试问题和答案
在这个部分,我们将从之前的部分中选择每个问题,并通过详细的描述来回答。如果您需要更多的信息和示例,请查阅《JournalDEV》上提供的之前的Java SE 8帖子。
我们为什么需要再次转换为Java呢?
Oracle公司在Java SE 8中引入了许多新概念,旨在带来以下的好处:
- To Utilize Current Multi-Core CPUs Efficiently
Recently, we can observe drastic changes in Hardware. Nowadays, all systems are using Multi-Core CPUs (2,4,8,16-Core, etc.) to deploy and run their applications. We need new Programming Constructs in Java to utilize these Multi-Core Processors efficiently to develop Highly Concurrently and Highly Scalable applications.- To Utilize FP Features
Oracle Corporation has introduced a lot of FP(Functional Programming) concepts as part of Java SE 8 to utilize the advantages of FP.
Java SE 8的新特性是什么?
- Lambda Expressions
- Functional Interfaces
- Stream API
- Date and Time API
- Interface Default Methods and Static Methods
- Spliterator
- Method and Constructor References
- Collections API Enhancements
- Concurrency Utils Enhancements
- Fork/Join Framework Enhancements
- Internal Iteration
- Parallel Array and Parallel Collection Operations
- Optional
- Type Annotations and Repeatable Annotations
- Method Parameter Reflection
- Base64 Encoding and Decoding
- IO and NIO2 Enhancements
- Nashorn JavaScript Engine
- javac Enhancements
- JVM Changes
- Java 8 Compact Profiles: compact1,compact2,compact3
- JDBC 4.2
- JAXP 1.6
- Java DB 10.10
- Networking
- Security Changes
Java SE 8新功能的好处是什么?
从Java SE 8新特性中,我们可以获得以下好处:
- More Concise and Readable code
- More Reusable code
- More Testable and Maintainable Code
- Highly Concurrent and Highly Scalable Code
- Write Parallel Code
- Write Database Like Operations
- Better Performance Applications
- More Productive code
Lambda表达式是什么?
Lambda表达式是一种匿名函数,它接受一组输入参数并返回结果。Lambda表达式是一段没有任何名称的代码块,可以有或没有参数,可以有或没有结果。这段代码在需要时执行。
Lambda表达式有哪三个部分?Lambda表达式的类型是什么?
一个Lambda表达式包含3个部分。
- Parameter List
A Lambda Expression can contain zero or one or more parameters. It is optional.- Lambda Arrow Operator
“->” is known as Lambda Arrow operator. It separates the parameters list and body.- Lambda Expression Body
“Journal Dev” 的类型是 java.lang.String。”true” 的类型是 Boolean。同样地,一个 Lambda 表达式的类型是函数式接口。例如:下述 Lambda 表达式的类型是什么?
() -> System.out.println("Hello World");
这个Lambda表达式没有参数,并且不返回任何结果。因此它的类型是“java.lang.Runnable”函数式接口。
什么是函数式接口?什么是SAM(单一抽象方法)接口?
一个功能接口是一个只包含一个抽象方法的接口。功能接口也被称为SAM接口,因为它只包含一个抽象方法。SAM接口代表单一抽象方法接口。Java SE 8 API定义了许多功能接口。
我们是否可以定义自己的函数式接口?有关@FunctionalInterface是什么?定义函数式接口的规则是什么?
是的,我们可以定义自己的函数式接口。我们使用Java SE 8的@FunctionalInterface注解来标记一个接口作为函数式接口。我们需要遵循以下规则来定义一个函数式接口:
- Define an interface with one and only one abstract method.
- We cannot define more than one abstract method.
- Use @FunctionalInterface annotation in interface definition.
- We can define any number of other methods like Default methods, Static methods.
- If we override java.lang.Object class’s method as an abstract method, which does not count as an abstract method.
在Java中,是否需要使用@FunctionalInterface注解来定义函数式接口?@FunctionalInterface注解的作用是什么?为什么我们需要函数式接口?
在Java中不是强制使用@FunctionalInterface注解来定义函数式接口。如果不想使用,我们可以省略这个注解。然而,如果在函数式接口定义中使用了它,Java编译器会强制在该接口中只使用一个抽象方法。为什么我们需要函数式接口?在Java SE 8中,Lambda表达式的类型是函数式接口。无论我们在哪里使用Lambda表达式,就意味着我们正在使用函数式接口。
我们什么时候开始使用Java 8 Stream API?为什么我们需要在我们的项目中使用Java 8 Stream API?
当我们的Java项目需要执行以下操作时,最好使用Java 8 Stream API来获得许多好处。
- When we want perform Database like Operations. For instance, we want perform groupby operation, orderby operation etc.
- When want to Perform operations Lazily.
- When we want to write Functional Style programming.
- When we want to perform Parallel Operations.
- When want to use Internal Iteration
- When we want to perform Pipelining operations.
- When we want to achieve better performance.
解释 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是什么?迭代器和Spliterator在Java SE 8中的区别是什么?
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的主要优势是:
- It is used to avoid null checks.
- It is used to avoid “NullPointerException”.
什么是类型推断?类型推断在旧版本的Java 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公司在Java SE 7中引入了“钻石操作符”新功能,以避免在泛型中进行不必要的类型定义。
Map<String,List<Customer>> customerInfoByCity = new HashMap<>();
在这里,我们没有在右侧定义类型信息,只是定义了Java SE 7的Diamond运算符。在Java SE 8中,Oracle Corporation在类型推断的概念方面进行了许多改进。我们使用这个概念来定义Lambda表达式、函数、方法引用等。
ToIntBiFunction<Integer,Integer> add = (a,b) -> a + b;
这里,Java编译器在左侧观察到类型定义,并将Lambda表达式参数a和b的类型确定为整数。这就是关于Java 8面试问题的全部内容。我在这篇文章中讨论了一些Java SE 8面试问题,并将在我的下篇文章中继续讨论一些Java SE 8面试问题。如果您喜欢我的文章或有任何问题/建议,请给我留言。