Java 8 和 Java 9 的区别

2025年6月16日 | 阅读 5 分钟

Java 编程语言一直在不断发展,以满足现代软件开发的需求。Java 8 和 Java 9 是这一演进中的两个重要里程碑。这些版本为语言、库和运行时环境带来了实质性的变化和增强。

Java 8 与 Java 9 的主要区别

特性Java 8Java 9
Lambda 表达式和函数式接口引入了 lambda 表达式和函数式接口。继续支持 lambda 表达式和函数式接口。
Stream API引入了 Stream API,用于对集合进行函数式操作。添加了新方法(takeWhile()、dropWhile() 等)来增强 Stream API。
接口中的默认方法在接口中引入了默认方法,以实现向后兼容。接口中的私有方法以及改进的菱形问题解决方法。
Optional 类引入了 Optional 类,以更安全地处理 null 值。增强了 Optional 类,增加了 ifPresentOrElse()、stream() 和 or() 等方法。
日期和时间 API引入了新的日期和时间 API (java.time),以取代旧的 java.util.Date 和 java.util.Calendar 类。日期和时间 API 没有重大变化。
Nashorn JavaScript 引擎引入了 Nashorn JavaScript 引擎,以取代旧的 Rhino 引擎。继续支持 Nashorn,但标记为将在未来版本中删除。
PermGen 移除移除了 PermGen 内存空间,并用 Metaspace 取代,以改善内存管理。Java 9 中仍然保留了 PermGen 的移除,这有助于改善内存分配。
紧凑字符串Java 8 中不存在。引入了紧凑字符串,以优化仅包含 ASCII 字符的字符串的内存使用。
Project Jigsaw (模块系统)没有模块系统;应用程序使用 JAR 文件和类路径进行打包。引入了 Java Platform Module System (JPMS),以创建模块化应用程序。
接口私有方法接口只能包含抽象方法和静态常量。增加了对接口私有方法的支持,以改善代码组织。
Reactive Streams API没有内置的响应式编程和异步数据流处理支持。引入了 `java.util.concurrent.Flow` 包来支持 Reactive Streams API。
新的版本控制方案版本号如 Java 8、Java 7 等。引入了一种更可预测的版本控制方案,包含明确的版本号。
Try-with-resource变量必须在 try 块内声明。范围内任何有效的 final 变量都可以。

Java 8 示例:使用 Lambda 表达式和 Stream API

下面的程序演示了在 Java 8 中使用 lambda 表达式和 Stream API 来过滤和处理数字列表。

示例

编译并运行

输出

4
16
36
64
100

Java 9 示例:使用模块系统和接口私有方法

下面的程序展示了 Java 9 模块系统以及使用接口私有方法实现一个简单的计算器。

示例

输出

Main.java:13: error: cannot find symbol
        int product = example.multiply(5, 3); // Can't be accessed directly  
                             ^
  symbol:   method multiply(int,int)
  location: variable example of type Main
1 error

下面的 Java 程序演示了 Java 8 和 Java 9 中引入的一些功能的用法。该程序将展示 lambda 表达式、Stream API 和增强的 Optional 类的使用。

示例

编译并运行

输出

Hello, Alice
Hello, David
Hello, John
Even numbers: [2, 4, 6]

解释

在此示例中,程序首先演示了 Java 8 中 lambda 表达式和 Stream API 的使用。它使用 lambda 表达式过滤并打印以“A”或“D”开头的名称。

接下来,它展示了 Java 9 中增强的 Optional 类方法。`ifPresentOrElse()` 方法用于在 Optional 存在时打印名称,或在 Optional 为空时打印“No name available”。

最后,演示了 Java 9 中引入的 `takeWhile()` 方法。它创建了一个新列表,包含输入列表中的偶数,直到遇到第一个奇数。

此示例重点介绍了 Java 8 和 Java 9 中引入的功能的实际应用,并展示了它们如何有助于编写更具表现力和更简洁的代码。

结论

Java 8 和 Java 9 为语言及其生态系统带来了重大增强。Java 8 引入了 lambda 表达式、Stream API 和默认方法,彻底改变了开发者的编码方式。Java 9 则通过模块系统、Stream 改进和增强的 Optional 类等功能继续这一演进。

作为一名开发者,理解这些差异将使您能够利用每个版本的优势,编写更有效、更易于维护的代码,并及时了解不断发展的 Java 领域。

Java 8 和 Java 9 选择题

1. 用于 Reactive Streams API 的 `java.util.concurrent.Flow` 包是在 ______ 中引入的。

  1. Java 8
  2. Java 6
  3. Java 9
 

答案:c)

解释: `java.util.concurrent.Flow` 包用于 Reactive Streams API,是在 Java 9 中引入的。


2. Optional 类是在 __________________ 中引入的。

  1. Java 8
  2. Java 6
  3. Java 9
 

答案: a)

解释: Optional 类是在 Java 8 中引入的。


3. 用于增强 Java 9 Stream API 的新方法是 _________。

  1. takeWhile()
  2. dropWhile()
  3. 两者
 

答案:c)

解释: 在 Java 9 中,用于增强 Stream API 的新方法是 `takeWhile()`、`dropWhile()` 等。


4. Java 8 中引入接口默认方法的目的是什么?

  1. 减少对实用工具类的需求
  2. 提供向后兼容性
  3. 代码重用性
  4. 以上全部
 

答案: d)

解释: 接口中的默认方法是在 Java 8 中引入的,以提供向后兼容性。它还可以促进代码重用,并减少对实用工具类的需求。


5. Compact String 是在 _____________ 中引入的。

  1. Java 8
  2. Java 6
  3. Java 9
 

答案:c)

解释: Compact String 是在 Java 9 中引入的。