Java9 - 面试题

亲爱的读者,这些 Java9 面试问题 是专门设计的,目的是让您了解在面试过程中可能遇到的 Java9 问题。根据我的经验,优秀的面试官几乎不打算在你的面试中问任何特定的问题,通常问题从主题的一些基本概念开始,然后他们根据进一步的讨论和你的回答继续 −

Java9(又名 jdk 1.9)是 JAVA 编程语言开发的主要版本。 它的初始版本于 2017 年 9 月 21 日发布。Java9 发布的主要目标是 −

  • 使 JDK 和 Java 标准版平台模块化,因为它可以很好地缩小到小型计算设备。

  • 提高 JDK 和 Java 实现的整体安全性。

  • 使 JAVA SE 和 EE 平台的 Java 代码库和大型应用程序的构建过程和维护变得容易。

  • 为 Java 平台设计和实现一个标准的模块系统,可以轻松地应用于平台和 JDK。

Java 8 添加了 90 多项增强功能,最重要的增强功能如下所述 −

  • 模块 − 作为模块引入的一种新型 Java 编程组件,它是一种命名的、自描述的代码和数据集合。

  • REPL (JShell) − Read-Eval-Print Loop (REPL) 功能添加到 Java 平台。

  • HTTP 2 Client − 新的 HTTPClient API 支持 websockets 和 HTTP 2 流和服务器推送功能。

  • 改进的 JavaDocs − 支持 HTML5 输出生成。 提供用于生成 API 文档的搜索框。

  • 多版本 JAR − 增强了 JAR 格式,以便类文件的多个特定于 Java 版本的版本可以共存于单个存档中。

在 Java9 中,引入了一种称为模块的新型编程组件。 模块是代码和数据的自描述集合,并有一个名称来标识它。

对于模块组件,Java9 中添加了以下增强功能 −

  • 引入了一个新的可选阶段,链接时间。 此阶段介于编译时和运行时之间。 在此阶段,可以组装和优化一组模块,使用 jlink 工具制作自定义运行时映像。

  • javac、jlink 和 java 有额外的选项来指定模块路径,进一步定位模块的定义。

  • JAR 格式更新为模块化 JAR,其根目录中包含 module-info.class 文件。

  • JMOD 格式介绍,一种打包格式(类似于 JAR),可以包含本机代码和配置文件。

按照惯例,模块的源代码位于与模块名称相同的目录中。

REPL 代表读取-评估-打印循环。

有了JShell,java就有了REPL能力。 使用 JShell,我们可以编写和测试基于 java 的逻辑,而无需使用 javac 进行编译,并直接查看计算结果。

使用 -html5 标志运行 jdk 9 的 javadoc 工具以生成新类型的文档。

在 Java9 中,引入了一项新功能,增强了 jar 格式,可以根据平台维护和使用不同版本的 Java 类或资源。

是的! 以下命令将为 java 7 和 Java9 版本创建一个多版本 jar。

$ jar -c -f test.jar -C java7 . --release 9 -C java9 .

两个 java 版本的语法相同,结果会有所不同。 使用 JDK 7 运行。

C:\JAVA > java -cp test.jar com.tutorialspoint.Tester
Inside Java 7

使用 JDK 9 运行。

C:\JAVA > java -cp test.jar com.tutorialspoint.Tester
Inside Java9

在 Java9 中,新的工厂方法被添加到 List、Set 和 Map 接口以创建不可变实例。 这些工厂方法是方便的工厂方法,以更简洁的方式创建集合。

在 Java9 中,以下方法被添加到 List、Set 和 Map 接口以及它们的重载对应方法中。

static <E> List<E> of(E e1, E e2, E e3);
static <E> Set<E>  of(E e1, E e2, E e3);
static <K,V> Map<K,V> of(K k1, V v1, K k2, V v2, K k3, V v3);
static <K,V> Map<K,V> ofEntries(Map.Entry<? extends K,? extends V>... entries)

注意事项

  • 对于 List 和 Set 接口,of(...) 方法被重载为具有 0 到 10 个参数和一个带有 var args 参数。

  • 对于 Map 接口,of(...) 方法被重载为具有 0 到 10 个参数。

  • 如果 Map 接口的参数超过 10 个,可以使用 ofEntries(...) 方法接受 var args 参数。

以下是默认的项目结构:

  • 数据库脚本存储在db文件夹中。

  • java源代码存放在src文件夹中。

  • 图片、js、META-INF、样式(css)存放在war文件夹中。

  • JSP 存储在 jsp 文件夹中。

  • 第三方 jar 文件存储在 lib 文件夹中。

  • java 类文件存储在WEB-INF\classes 文件夹中。

Java9 接口可以有以下类型的变量/方法。

  • 常量变量
  • 抽象方法
  • 默认方法
  • 静态方法
  • 私有方法
  • 私有静态方法

在 Java9 中,负责控制和管理操作系统进程的 Process API 得到了显着改进。 ProcessHandle 类现在提供进程的本机进程 ID、启动时间、累计 CPU 时间、参数、命令、用户、父进程和后代。

ProcessHandle 类提供了检查进程活跃度和销毁进程的方法。 它有 onExit 方法,CompletableFuture 类可以在进程退出时异步执行操作。

Streams 是在 Java 中引入的,用于帮助开发人员从一系列对象执行聚合操作。 在 Java9 中,添加了一些方法来使流更好。

  • takeWhile
  • dropWhile
  • iterate
  • ofNullable

takeWhile 方法获取所有值,直到谓词返回 false。 在有序流的情况下,它返回一个流,该流由从该流中获取的与给定谓词匹配的元素的最长前缀组成。

dropWhile 方法在开始时丢弃所有值,直到谓词返回 true。 在有序流的情况下,它在删除与给定谓词匹配的元素的最长前缀后返回由该流的剩余元素组成的流。

iterate 方法现在有 hasNext 谓词作为参数,一旦 hasNext 谓词返回 false 就会停止循环。

ofNullable 方法的引入是为了防止 NullPointerExceptions 并避免对流进行空检查。 此方法返回一个包含单个元素的顺序 Stream,如果非空,则返回一个空 Stream。

try-with-resources 语句是一个带有一个或多个资源的 try 语句。 这里的资源是一个对象,一旦不再需要它就应该关闭。 try-with-resources 语句确保每个资源在需求完成后关闭。 任何实现 java.lang.AutoCloseable 或 java.io.Closeable 接口的对象都可以用作资源。

在 Java9 中,对 @Deprecated 注解进行了两项新的增强。

  • forRemoval − 指示带注解的元素是否会在未来版本中删除。 默认值为 false。

  • since − 返回已弃用注解元素的版本。 默认值为空字符串。

在Java9中,它也可以与匿名类一起使用,以简化代码并提高可读性。

Optional 类是在 Java 8 中引入的,以避免 null 检查和 NullPointerException 问题。 在 Java9 中,增加了三个新方法来改进其功能。

  • stream()
  • ifPresentOrElse()
  • or()

在 Java9 中,引入了一个新的多分辨率图像 API,它支持具有不同分辨率变体的多个图像。 此 API 允许将一组具有不同分辨率的图像用作单个多分辨率图像。 以下是多分辨率图像的主要操作。

  • Image getResolutionVariant(double destImageWidth, double destImageHeight) − 获取一个特定的图像,它是以指定大小表示此逻辑图像的最佳变体。

  • List<Image> getResolutionVariants() − 获取所有分辨率变体的可读列表。

CompletableFuture 类是在 Java 8 中引入的,用于表示可以通过显式设置其值和状态来完成的 Future。 它可以用作 java.util.concurrent.CompletionStage。 它支持在未来完成时触发的相关功能和动作。 在 Java9 中,CompletableFuture API 得到了进一步增强。 以下是对 API 所做的相关更改。

  • 支持延迟和超时。
  • 改进了对子类的支持。
  • 添加了新的工厂方法。