Java SE 8面试问题和答案(部分一)

在这篇文章中,我们将讨论一些与Java SE 8面试相关的重要问题和答案。我将写另一篇文章来讨论其他的Java SE 8面试问题。

Java 8 面试问题

    1. 我们为什么需要再次转向Java?

 

    1. Java SE 8的新特性是什么?

 

    1. Java SE 8的新特性有什么优点?

 

    1. Lambda表达式是什么?

 

    1. Lambda表达式由哪三个部分组成?Lambda表达式的类型是什么?

 

    1. 函数接口是什么?SAM接口是什么?

 

    1. 我们可以定义自己的函数接口吗?@FunctionalInterface是什么?定义函数接口的规则是什么?

 

    1. 定义函数接口是否需要使用@FunctionalInterface注解?@FunctionalInterface注解的作用是什么?为什么我们需要Java中的函数接口?

 

    1. 什么时候使用Java 8的流API?为什么我们需要在项目中使用Java 8的流API?

 

    1. 解释集合API和流API之间的区别?

 

    1. Java SE 8中的Spliterator是什么?Iterator和Spliterator在Java SE 8中有什么区别?

 

    1. 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面试问题。如果您喜欢我的文章或有任何问题/建议,请给我留言。

bannerAds