Java 8 面试问题
原文:https://www.studytonight.com/java-examples/java-8-interview-questions
Java 是一种非常流行的编程语言,应用非常广泛。 Java 8 于 2014 年发布,增加了很多新功能,克服了之前版本的局限性。在本教程中,我们将讨论一些关于 Java 8 的最常见的面试问题。
Q1。简要说明 Java 8 中增加的新特性
- Lambda 表达式 -用于定义可以作为对象引用的函数。
- 函数式接口 -仅用一个抽象方法进行接口。
- 方法引用 -允许我们使用函数作为调用方法的参数。
- 可选 -用于检查空值的包装类。
- 默认方法 -允许我们在接口内部添加方法的实现。
- 流 API -允许数据流水线处理的特殊迭代器类。
- 日期 API -受 JodaTime 启发而改进的 API。
Q2。解释一下 Java 8 的优点?
- 增加代码的可读性和可重用性。
- 较小的样板代码。
- 稳定性更高。
- 操作的并行执行。
- 紧凑代码
Q3。Java 8 中的方法引用是什么意思?
方法引用是一种在不调用方法的情况下引用方法的方式。双冒号(::)用于方法引用。方法引用用于将方法视为 Lambda 表达式。
Q4。什么是函数式接口?
函数式接口是一个只有一个抽象方法的接口。它们也被称为 SAM 接口。SAM 代表单一抽象方法。可以使用@FunctionalInterface 注释,但它是可选的。默认、静态和覆盖方法的数量没有限制。功能界面的示例如下所示。
@FunctionalInterface
interface FunctionalDemo
{
abstract public void someAbstractMethod();
default public void defaultMethod()
{
System.out.print("Default");
}
}
Q5。什么是 Lambda 表达式?
Lambda 表达式是一个匿名函数,可以被引用并用作对象。以下是 Lambda 表达式的一些关键特征。Lambda 表达式也可以用作其他方法的参数。
Q6。如何创建 Lambda 表达式?解释基本语法。
Lambda 表达式包含三个部分。
- 参数列表用圆括号()括起来。
- 表达式主体用花括号{}括起来。
- 箭头符号(- > ) 将参数列表和正文分开。
下面的代码显示了一个基本的 lambda 表达式。
interface DemoInterface{
abstract void add(int i, int j);
}
public class Demo
{
public static void main(String[] args) throws Exception
{
DemoInterface i = (int a, int b) -> {
System.out.print("Sum is: " + (a + b));
};
i.add(10, 20);
}
}
总和是:30
以下是 Lambda 表达式的一些关键特征。
Optional
类型声明-我们不需要声明参数的类型。编译器可以从它们的值和用法来推断类型。- 参数周围的可选圆括号-如果我们只有一个参数,那么我们不需要用圆括号把它括起来。
- 可选的大括号-如果表达式只包含一行代码,那么我们不需要用大括号把它括起来。
- 可选的 return 关键字-如果表达式返回值并且用花括号包装,那么我们不需要使用 return 语句。
Q7。什么是 Java 8 Streams?
流就像是从一个源获得的一系列对象,就像集合。它们用于以流水线方式对数据执行聚合操作。它们被用来使数据处理变得更简单、更容易。
Q8。解释日期和时间 API 的一些特性。
新的日期和时间 API 解决了以前的日期 API 的一些缺点。日期和时间 API 的主要功能如下所述。
- 类是不可变的
- 提供线程安全以避免并发问题。
- 时区支持
- 符合国际标准化组织标准
- 灵感来自 JodaTime
- 支持时区
Q9。如何使用本地日期、本地时间和本地日期时间 API 获取当前日期和时间?
我们可以对所有这些类使用 now()方法来获取当前日期和时间。
import java.time.*;
public class Demo
{
public static void main(String[] args) throws Exception
{
LocalDate currLocalDate = LocalDate.now();
LocalTime currLocalTime = LocalTime.now();
LocalDateTime currLocalDateTime = LocalDateTime.now();
System.out.println("Local Date: " + currLocalDate);
System.out.println("Local Time: " + currLocalTime);
System.out.println("Local Date and Time: " + currLocalDateTime);
}
}
当地时间:2021-08-06 当地时间:16:06:52.498893400 当地日期和时间:2021-08-06T16:06:52.498893400
Q10。解释纳斯霍恩?
Nashorn 是 Java 8 附带的一个新的 JavaScript 处理引擎。它取代了 JDK 7 附带的 Mozilla Rhino。它提供了更好的运行时性能。它还提供了更好的符合 ECMA(欧洲计算机制造商协会)规范的 JavaScript 规范。
Q11。默认方法是什么意思?
在接口内部实现的方法称为默认方法。默认关键字用在它们的声明中。它们被添加到 Java 8 中,以提供“向后兼容性”。这意味着如果 JDK 修改了一个接口,那么实现它的类将会中断。但是使用默认方法,对实现类不会有任何影响。
interface DemoInterface
{
abstract void print(int i, int j);
abstract String concat(String s1, String s2);
//Default method
default void defaultMethod()
{
System.out.print("Default method called!");
}
}
Q12。什么是 JJS?
JJS 代表 Java JavaScript,它是一个命令行工具,用于在控制台中执行 JavaScript。
Q13。借助一个例子解释 forEach()方法。
forEach()方法是流 API 的一部分。它用于迭代流的每个元素并执行一个操作。让我们尝试添加 10 个元素,并使用 forEach()方法打印一个流的所有元素。
import java.util.stream.Stream;
public class Demo
{
public static void main(String[] args) throws Exception
{
Stream s = Stream.of(1, 2, 3, 4, 5);
s.forEach(i -> System.out.println((int)i + 10));
}
}
11 12 13 14 15
Q14。PermGen 和 MetaSpace 有什么区别?
永久生成的缩写,是 Java 8 之前存储类信息和元数据的地方。这是一个连续的堆内存空间,大小是固定的。MetaSpace 是在 Java 8 中引入的,它提供了一个动态的或可调整大小的本机内存来存储类元数据。它改进了元数据的取消分配和垃圾收集,并且不受大小限制。
Q15。您将如何使用流来查找和打印数组中的偶数?
我们可以使用流的 filter()方法来找到偶数。然后,我们可以使用 forEach()方法简单地PrintStream
元素。
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class Demo
{
public static void main(String[] args) throws Exception
{
List<Integer> list = Arrays.asList(7, 9, 10, 1, 2, 5, 12, 11, 3, 4);
Stream<Integer> evenNums = list.stream().filter(i -> i % 2 == 0);
evenNums.forEach(System.out::println);
}
}
10 2 12 4
Q16。Java 8 中什么是 Spliterator?
Spliterator 是 Java 8 中引入的迭代器接口。就像普通的迭代器一样,它可以迭代或遍历集合或流的每个元素。与普通迭代器不同,Spliterator 支持并行和顺序遍历。
Q17。流和集合有什么区别?
| 流 | 集合 | | 用于处理数据。 | 用于存储数据。 | | 可以处理无限多的元素。 | 可以存储有限数量的元素。 | | 不能直接访问元素。 | 更容易接触到元素。 |
Q18。解释 Java 8 中的流流水线。
流水线是将多个操作链接在一起的概念。操作可以有两种类型——中间操作和终端操作。中间操作返回流的一个实例,终端操作用于终止管道。
Q19。借助示例解释中间和终端操作。
流流水线通过使用中间和终端操作来完成。中间操作返回流的一个实例,用于链接多个操作。中间操作是懒惰的,因为它们不会开始执行,直到终端操作被调用。中间操作大多使用 lambda 表达式来处理流。一些常见的中间操作有 map、flatMap、filter、peek 等。
顾名思义,终端操作用于终止流流水线操作。它们用于启动流处理。一些常见的终端操作包括 forEach()、forEachOrdered()、collect()、reduce()等。
例如,在下面的代码中,我们首先使用两个中间操作(map()和 filter()),然后使用终端 forEach()方法打印结果。
import java.util.Arrays;
import java.util.List;
public class Demo
{
public static void main(String[] args) throws Exception
{
List<String> list = Arrays.asList("Hello", "Hola", "Ola");
list.stream().map(s -> s.toUpperCase()) //Intermediate
.filter(s -> s.startsWith("H")) //Intermediate
.forEach(System.out::println); //Terminal
}
}
你好 你好
Q20。什么是可选的,为什么使用它?
可选是可以包含零(空)或一个值的容器或包装类。此类包含检查值是否存在的方法。此类用作可能返回 null 的方法的返回类型。该方法需要返回一个对象而不是一个值。这有助于我们避免空指针异常。
Q21。谓词和函数有什么区别?
谓词和函数都是函数接口,它们存在于 java.util.function 包中。谓词用于测试某些东西,而函数用于更通用的目的。谓词根据测试返回真或假。函数返回一个对象。
Q22。如何使用 LocalDate 和 LocalDateTime API 在当前日期的基础上增加一年?
plusYears()方法用于向 LocalDate 或 LocalDateTime 对象添加年数。我们还有 plusDays()和 plusMonths()方法来为我们的日期添加天数或月数。使用负年数()、负月数()或负日数()方法从日期中减去年、月或日。
import java.time.*;
public class Demo
{
public static void main(String[] args) throws Exception
{
LocalDate currLocalDate = LocalDate.now();
System.out.println("Current Date: " + currLocalDate);
LocalDate dateAfterOneYear = currLocalDate.plusYears(1);
System.out.println("Date after one year: " + dateAfterOneYear);
}
}
当前日期:2021-08-06 一年后日期:2022-08-06
摘要
Java 仍然是使用最广泛的编程语言之一,人们必须精通 Java 的基础知识才能在技术面试中胜出。Java 8 引入了几个新特性,在本教程中,我们讨论了与 Java 技术访谈相关的一些最重要的主题。