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 技术访谈相关的一些最重要的主题。