侧边栏壁纸
博主头像
ZHD的小窝博主等级

行动起来,活在当下

  • 累计撰写 79 篇文章
  • 累计创建 53 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

JDK 10 的新特性

江南的风
2018-06-15 / 0 评论 / 0 点赞 / 28 阅读 / 7227 字 / 正在检测是否收录...

JDK 10(Java Development Kit 10)是Java平台的一个短期支持版本,于2018年3月发布。它虽然不是一个长期支持(LTS)版本,但引入了一些重要的新特性和改进。以下是JDK 10的主要新特性:

1. 局部变量类型推断(var)

  • 引入:JDK 10 引入了局部变量类型推断的功能,允许使用 var 关键字作为局部变量的类型,编译器会根据变量的初始化表达式来推断其类型。

  • 优点:减少了代码的冗余,提高了代码的可读性和编写效率。

  • 使用限制var 只能用于局部变量,且必须有初始化表达式。它不能用于方法参数、返回类型、字段声明等场景。

例如:

import java.util.List;  
import java.util.Arrays;  
  
public class VarExample {  
    public static void main(String[] args) {  
        // 使用var声明并初始化一个整型变量  
        var number = 10;  
        System.out.println(number); // 输出: 10  
  
        // 使用var声明并初始化一个字符串变量  
        var greeting = "Hello, World!";  
        System.out.println(greeting); // 输出: Hello, World!  
  
        // 使用var声明并初始化一个List<String>变量  
        var list = Arrays.asList("Java", "Python", "C++");  
        // 注意:这里list的类型被推断为List<String>,而不是更泛化的List<?>  
        for (var item : list) {  
            System.out.println(item); // 依次输出列表中的字符串  
        }  
  
        // 尝试修改list的元素类型会导致编译错误  
        // list.add(123); // 编译错误,因为list的类型被推断为List<String>  
    }  
}

需要注意的是,虽然var可以简化代码,但它并不应该被滥用。特别是在变量类型不明确或容易引起混淆的情况下,显式指定类型可以提高代码的可读性和可维护性。此外,var只能用于局部变量,并且必须在使用时立即初始化。

2. 集合中的copyof()方法

  • 引入:JDK 10 在集合API中新增了 copyOf() 方法,用于创建集合的不可变副本。这个方法在JDK 9中通过 of() 方法引入了不可变集合的创建,而 copyOf() 方法提供了对已有集合的复制功能。

  • 用途:确保集合的不可变性,防止集合被修改,提高代码的安全性。

3. G1 并行全垃圾回收器

  • 改进:JDK 10 对G1垃圾回收器进行了改进,使其支持并行完整垃圾回收(GC)。这减少了在最坏情况下的GC停顿时间,提高了性能。

  • 背景:G1垃圾回收器在JDK 9中成为默认垃圾回收器,JDK 10进一步优化了其性能。

4. 应用类数据共享(Application Class Data Sharing)

  • 引入:JDK 10 增强了应用类数据共享的功能,允许在不同的JVM实例之间共享已加载的类数据。

  • 优点:这可以减少JVM启动时间和内存占用,提高应用程序的启动速度和性能。

5. 基于时间的版本控制

  • 引入:JDK 10 采用了基于时间的版本控制方案,使用 $FEATURE.$INTERIM.$UPDATE.$PATCH 的格式来标识版本。

  • 优点:这种版本控制方案提供了更清晰、更语义化的版本标识方式。

6. Unicode 语言标签扩展

JDK 10 扩展了Unicode语言标签的支持,增加了对货币类型、一周的第一天、区域覆盖和时区等标签的支持。

主要增加了以下方法:

java.time.temporal.WeekFields::of
java.util.Calendar::{getFirstDayOfWeek,getMinimalDaysInWeek}
java.util.Currency::getInstance
java.util.Locale::getDisplayName
java.util.spi.LocaleNameProvider
java.text.DateFormat::get*Instance
java.text.DateFormatSymbols::getInstance
java.text.DecimalFormatSymbols::getInstance
java.text.NumberFormat::get*Instance
java.time.format.DateTimeFormatter::localizedBy
java.time.format.DateTimeFormatterBuilder::getLocalizedDateTimePattern    
java.time.format.DecimalStyle::of

用例:

Currency chinaCurrency = Currency.getInstance(Locale.CHINA);
Currency usCurrency = Currency.getInstance(Locale.US);
System.out.println("本地货币:" + chinaCurrency); // 本地货币:CNY
System.out.println("US.货币:" + usCurrency); // US.货币:USD

String displayName = Locale.getDefault().getDisplayName();
String displayLanguage = Locale.getDefault().getDisplayLanguage();
String displayCountry = Locale.getDefault().getDisplayCountry();
System.out.println("本地名称:" + displayName); // 本地名称:中文 (中国)
System.out.println("本地语言:" + displayLanguage); // 本地语言:中文
System.out.println("本地国家:" + displayCountry); // 本地国家:中国
int firstDayOfWeek = Calendar.getInstance().getFirstDayOfWeek();
System.out.println("本地每周第一天:" + firstDayOfWeek); // 本地每周第一天:1

7. 实验性基于Java的JIT编译器(GraalVM)

  • 引入:JDK 10 引入了实验性的基于Java的JIT编译器GraalVM,这是一个用Java编写的编译器,旨在提高JVM的性能。

  • 目的:GraalVM旨在与现有的C++编写的JVM竞争,并可能在未来替代它们。

8. 移除 Native-Header 自动生成工具(javah)

  • 移除:JDK 10 移除了 javah 工具,该工具之前用于自动生成本地方法所需的头文件。

  • 替代:现在,这些头文件可以通过 javac 编译器自动生成,无需单独的 javah 工具。

9. 标准化HTTP客户端

  • 引入:JDK 10 引入了一个新的标准化HTTP客户端API(java.net.http.HttpClient),提供了更简单和灵活的API来发送HTTP请求和处理响应。

  • 优点:这有助于减少第三方HTTP客户端库的依赖,并提高Java平台在HTTP通信方面的标准化程度。

10. 改进的性能监控和Docker支持

  • 改进:JDK 10 改进了性能监控工具(如JVisualVM和JConsole)的集成度,提供了更详细和实时的性能数据。

  • Docker支持:同时,JDK 10 也改进了对Docker容器的支持,包括在Docker容器中运行Java程序时的动态内存分配和CPU管理。

这些新特性和改进为Java开发者提供了更好的开发体验和性能优化。然而,需要注意的是,由于JDK 10是一个短期支持版本,其某些特性和改进可能在后续版本中得到进一步的完善或替代。

0

评论区