JDK各版本特性

17 篇文章 2 订阅

目录

JDK各版本特性

老版本

JDK 1.4 (2002-02-13发布)

JDK 1.5 (2004年10月发布)

JDK 1.6 (2006年4月发布)

JDK 1.7 (2011年7月28日发布)

JDK 1.8 (2014年3月发布)

JDK 1.9 (2017年9月21日发布)

JDK 10 (2018年3月21日发布)

JDK 11 (2018年9月25日发布)

JDK 12 (2019年2月7日发布)

JDK 13 (2019年9月26日发布)

JDK 14 (2020年3月17日发布)

JDK 15 (2020年9月15日发布)

JDK 16(2021年3月16日发布)

JDK 17 (2021年9月 发布)


JDK各版本特性

老版本

       JDK 1.0 1996-01-23

  JDK 1.1.4 Sparkler 宝石 1997-09-12

  JDK 1.1.5 Pumpkin 南瓜 1997-12-13

  JDK 1.1.6 Abigail 阿比盖尔–女子名 1998-04-24

  JDK 1.1.7 Brutus 布鲁图–古罗马政治家和将军 1998-09-28

  JDK 1.1.8 Chelsea 切尔西–城市名 1999-04-08

  J2SE 1.2 Playground 运动场 1998-12-04

  J2SE 1.2.1 none 无 1999-03-30

  J2SE 1.2.2 Cricket 蟋蟀 1999-07-08

  J2SE 1.3 Kestrel 美洲红隼 2000-05-08

  J2SE 1.3.1 Ladybird 瓢虫 2001-05-17

  J2SE 1.4.0 Merlin 灰背隼 2002-02-13

  J2SE 1.4.1 grasshopper 蚱蜢 2002-09-16

  J2SE 1.4.2 Mantis 螳螂 2003-06-26

JDK 1.4 (2002-02-13发布)

1.NIO

JDK 1.5 (2004年10月发布)

1.泛型 Java Generics  (语法糖)

2.foreach (语法糖)

3.自动拆箱装箱 (语法糖)

4.枚举 (语法糖)

5.静态导入(Static import)

6.元数据(Metadata)

7.线程池

8.新增java.util.concurrent 并发包

9.可变参数 (语法糖)

10.新增java.lang.annotaion,引入java注解 (语法糖)

JDK 1.6 (2006年4月发布)

1.Desktop类和SystemTray类

2.使用JAXB2来实现对象与XML之间的映射

3.StAX

4.使用Compiler API

5.轻量级Http Server API

6.插入式注解处理API(Pluggable Annotation Processing API)

7.用Console开发控制台程序

8.对脚本语言的支持

9.Common Annotations

JDK 1.7 (2011年7月28日发布)

1.对集合类的语言支持

2.自动资源管理 

3.改进的通用实例创建类型推断; 

4.数字字面量下划线支持; 

5.switch中使用string

6.二进制字面量

7.简化可变参数方法调用

8.For/join 框架

9.单个catch捕获多个异常,如 catch(IOException|SQLException|Exception e)

10. try-with-resources语句

    try-with-resources语句是一个声明一个或多个资源的try语句。一个资源作为一个对象,必须在程序结束之后关闭。try-with-resources语句确保在语句的最后每个资源都被关闭,任何实现了Java.lang.AutoCloseable和java.io.Closeable的对象都可以使用try-with-resource来实现异常处理和关闭资源。

    下面通过对比来体会这个新特性。

    JDK1.7之前:

/** 
 * JDK1.7之前我们必须在finally块中手动关闭资源,否则会导致资源的泄露 
 * 
 */  
public class PreJDK7 {  
 
    public static String readFirstLingFromFile(String path) throws IOException {  
        BufferedReader br = null;  
 
        try {  
            br = new BufferedReader(new FileReader(path));  
            return br.readLine();  
        } catch (IOException e) {  
            e.printStackTrace();  
        } finally {//必须在这里关闭资源  
            if (br != null) {
                br.close(); 
            } 
        }  
        return null;  
    }  
}

    JDK1.7及以后版本:

/** 
 * JDK1.7之后就可以使用try-with-resources,不需要 
 * 我们在finally块中手动关闭资源 
 */  
public class AboveJDK7 {  
 
    static String readFirstLineFromFile(String path) throws IOException {  
 
        try (BufferedReader br = new BufferedReader(new FileReader(path))) {  
            return br.readLine();  
        }  
    }  
}

11.新增G1收集器

JDK 1.8 (2014年3月发布)

1.接口的默认方法

2.Lambda 表达式

3.函数式接口

4.方法与构造函数引用

5.Lambda 作用域

6.访问局部变量

7.访问对象字段与静态变量

8.访问接口的默认方法

9.Date API

10.Annotation 注解

11.Stream

HashMap优化,当链表长度>=8时,链表转换为红黑树。当红黑树元素个数<=6个时,会把树形结构缩小或者还原为链表。

JDK 1.9 (2017年9月21日发布)

1.Java 平台级模块系统

        Java9模块化(Jigsaw)初识 - 知乎

2.Linking

3.JShell : 交互式 Java REPL

4.改进的 Javadoc

5.集合工厂方法

以前大多使用Guava类库集合类的工厂,比如

Lists.newArrayList(1,2,3,4,5);
Sets.newHashSet(1,2,3,4,5);
Maps.newHashMap();
注意,上面这种返回的集合是mutable的

现在java9可以直接利用jdk内置的集合工厂,比如

List.of(1,2,3,4,5);
Set.of(1,2,3,4,5);
Map.of("key1","value1","key2","value2","key3","value3");

注意,jdk9上面这种集合工厂返回的是immutable的

6.改进的 Stream API

7.私有接口方法

8.HTTP/2

9.多版本兼容 JAR

其他:

1.默认使用G1收集器

2.下划线标识符命名的限制 _ 不允许了

3.String底层存储结构的变更(char数组变成byte字节数组)

        JDK9对String底层存储的优化 - JaxYoun - 博客园

        关于String底层使用的是char数组还是byte数组以及一点String面试问题 | 码农家园

JDK 10 (2018年3月21日发布)

1.局部变量类型推断

2.将JDK多存储库合并为单储存库

3.垃圾回收接口

4.并行Full GC 的G1

5.应用数据共享

6.线程局部管控

7.移除Native-Header Generation Tool (javah)

8.Unicode 标签扩展

9.备用内存设备上分配堆内存

10.基于实验JAVA 的JIT 编译器

11.Root 证书

12.基于时间的版本控制

Java SE 10 (18.3) ( JSR 383)

其他

1.APIs for Creating Unmodifiable Collections

java9新增的of工厂方法的接口参数是一个个元素,java10新增List.copyOf, Set.copyOf,及Map.copyOf用来从已有集合创建ImmutableCollections。

JDK 11 (2018年9月25日发布)

  • 增加一些符串处理方法
  • 用于 Lambda 参数的局部变量语法
  • Http Client重写,支持HTTP/1.1和HTTP/2 ,也支持 websockets
  • 可运行单一Java源码文件,如:java Test.java
  • ZGC:可伸缩低延迟垃圾收集器
  • 支持 TLS 1.3 协议

JDK 12 (2019年2月7日发布)

  • Switch 表达式扩展
  • 新增NumberFormat对复杂数字的格式化
  • 字符串支持transform、indent操作
  • 新增方法Files.mismatch(Path, Path)
  • Teeing Collector
  • 支持unicode 11

JDK 13 (2019年9月26日发布)

  • Switch 表达式扩展(引入 yield 关键字)
  • 文本块升级 """
  • SocketAPI 重构
  • FileSystems.newFileSystem新方法
  • 增强 ZGC 释放未使用内存

JDK 14 (2020年3月17日发布)

  • instanceof模式匹配
  • Record类型,类似于Lombok 的@Data注解
  • Switch 表达式-标准化
  • 改进 NullPointerExceptions提示信息
  • 删除 CMS 垃圾回收器

JDK 15 (2020年9月15日发布)

  • EdDSA 数字签名算法
  • Sealed Classes(封闭类,预览)
  • Hidden Classes(隐藏类)
  • 移除 Nashorn JavaScript引擎
  • 改进java.net.DatagramSocket 和 java.net.MulticastSocket底层实现

JDK 16(2021年3月16日发布)

JEP394,适用于instanceof的模式匹配

模式匹配(PatternMatching)最早在Java14中作为预览特性引入,在Java15中还是预览特性。模式匹配通过对instacneof运算符进行模式匹配来增强Java编程语言。

模式匹配使程序中的通用逻辑(即从对象中有条件地提取组件)得以更简洁、更安全地表示。

JEP395,记录

记录(Records)在Java14和Java15中作为预览特性引入。它提供了一种紧凑的语法来声明类,这些类是浅层不可变数据的透明持有者。这将大大简化这些类,并提高代码的可读性和可维护性。

JVM改进

JEP376,ZGC并发线程处理

JEP376将ZGC线程栈处理从安全点转移到一个并发阶段,甚至在大堆上也允许在毫秒内暂停GC安全点。消除ZGC垃圾收集器中最后一个延迟源可以极大地提高应用程序的性能和效率。

JEP387,弹性元空间

此特性可将未使用的HotSpot类元数据(即元空间,metaspace)内存更快速地返回到操作系统,从而减少元空间的占用空间。具有大量类加载和卸载活动的应用程序可能会占用大量未使用的空间。新方案将元空间内存按较小的块分配,它将未使用的元空间内存返回给操作系统来提高弹性,从而提高应用程序性能并降低内存占用。

新工具和库

JEP380,Unix-Domain套接字通道

Unix-domain套接字一直是大多数Unix平台的一个特性,现在在Windows10和WindowsServer2019也提供了支持。此特性为java.nio.channels包的套接字通道和服务器套接字通道API添加了Unix-domain(AF_UNIX)套接字支持。它扩展了继承的通道机制以支持Unix-domain套接字通道和服务器套接字通道。Unix-domain套接字用于同一主机上的进程间通信(IPC)。它们在很大程度上类似于TCP/IP,区别在于套接字是通过文件系统路径名而不是Internet协议(IP)地址和端口号寻址的。对于本地进程间通信,Unix-domain套接字比TCP/IP环回连接更安全、更有效。

JEP392,打包工具

此特性最初是作为Java14中的一个孵化器模块引入的,该工具允许打包自包含的Java应用程序。它支持原生打包格式,为最终用户提供自然的安装体验,这些格式包括Windows上的msi和exe、macOS上的pkg和dmg,还有Linux上的deb和rpm。它还允许在打包时指定启动时参数,并且可以从命令行直接调用,也可以通过ToolProviderAPI以编程方式调用。注意jpackage模块名称从jdk.incubator.jpackage更改为jdk.jpackage。这将改善最终用户在安装应用程序时的体验,并简化了“应用商店”模型的部署。

为未来做好准备

JEP390,对基于值的类发出警告

此特性将原始包装器类(java.lang.Integer、java.lang.Double等)指定为基于值的(类似于java.util.Optional和java.time.LocalDateTime),并在其构造器中添加forRemoval(自JDK9开始被弃用),这样会提示新的警告。在Java平台中尝试在任何基于值的类的实例上进行不正确的同步时,它会发出警告。

许多流行的开源项目已经在其源中删除了包装构造器调用来响应Java9的弃用警告,并且鉴于“弃用移除”警告的紧迫性,我们可以期望更多开源项目跟上这一步伐。

JEP396,默认强封装JDK内部元素

此特性会默认强封装JDK的所有内部元素,但关键内部API(例如sun.misc.Unsafe)除外。默认情况下,使用早期版本成功编译的访问JDK内部API的代码可能不再起作用。鼓励开发人员从使用内部元素迁移到使用标准API的方法上,以便他们及其用户都可以无缝升级到将来的Java版本。强封装由JDK9的启动器选项–illegal-access控制,到JDK15默认改为warning,从JDK16开始默认为deny。(目前)仍然可以使用单个命令行选项放宽对所有软件包的封装,将来只有使用–add-opens打开特定的软件包才行。

孵化器和预览特性

JEP338,向量API(孵化器)

该孵化器API提供了一个API的初始迭代以表达一些向量计算,这些计算在运行时可靠地编译为支持的CPU架构上的最佳向量硬件指令,从而获得优于同等标量计算的性能,充分利用单指令多数据(SIMD)技术(大多数现代CPU上都可以使用的一种指令)。尽管HotSpot支持自动向量化,但是可转换的标量操作集有限且易受代码更改的影响。该API将使开发人员能够轻松地用Java编写可移植的高性能向量算法。

JEP389,外部链接器API(孵化器)

该孵化器API提供了静态类型、纯Java访问原生代码的特性,该API将大大简化绑定原生库的原本复杂且容易出错的过程。Java1.1就已通过Java原生接口(JNI)支持了原生方法调用,但并不好用。Java开发人员应该能够为特定任务绑定特定的原生库。它还提供了外来函数支持,而无需任何中间的JNI粘合代码。

JEP393,外部存储器访问API(第3个孵化器)

在Java14和Java15中作为孵化器API引入的这个API使Java程序能够安全有效地对各种外部存储器(例如本机存储器、持久性存储器、托管堆存储器等)进行操作。它提供了外部链接器API的基础。

JEP397,密封类(第二预览)

这个预览特性可以限制哪些类或接口可以扩展或实现它们;它允许类或接口的作者控制负责实现它的代码;它还提供了比访问修饰符更具声明性的方式来限制对超类的使用。它还通过对模式进行详尽的分析来支持模式匹配的未来发展。

提升OpenJDK开发人员的生产力

其余更改对Java开发人员(使用Java编写代码和运行应用程序的人员)不会直接可见,而只对Java开发人员(参与OpenJDK开发的人员)可见。

JEP347,启用C++14语言特性(在JDK源代码中)

它允许在JDKC++源代码中使用C++14语言特性,并提供在HotSpot代码中可以使用哪些特性的具体指导。在JDK15中,JDK中C++代码使用的语言特性仅限于C++98/03语言标准。它要求更新各种平台编译器的最低可接受版本

JEP357,从Mercurial迁移到Git;JEP369,迁移到GitHub

这些JEP将OpenJDK社区的源代码存储库从Mercurial(hg)迁移到Git,并将它们托管在GitHub上以供JDK11及更高版本使用,其中包括将jcheck、webrev和defpath工具等工具更新到Git。Git减小了元数据的大小(约1/4),可节省本地磁盘空间并减少克隆时间。与Mercurial相比,现代工具链可以更好地与Git集成。

JEP386,AlpineLinux移植;JEP388,Windows/AArch64移植

这些JEP的重点不是移植工作本身,而是将它们集成到JDK主线存储库中;JEP386将JDK移植到AlpineLinux和其他使用musl作为x64上主要C库的发行版上。此外,JEP388将JDK移植到WindowsAArch64(ARM64)。

JDK 17 (2021年9月发布)

JDK17 是继jdk11后的长期支持版本,中间 12到16都是非长期支持版本,17支持到 2029 年 9 月。

JDK17免费商用截止到2024年9月。

对于从oracle下载的jdk8:JDK8u202(含)以下版本不收费。

对于从oracle下载的jdk11:JDK 11.0.0不收费,JDK 11.0.1不收费。

Oracle开始用JDK赚钱了,免费用户想享受新特性和长期支持可以考虑OpenJDK了。

JEP 356:增强型伪随机数发生器

增加了伪随机数相关的类和接口来让开发者使用stream流进行操作,

  • RandomGenerator
  • RandomGeneratorFactory

之前的java.util.Random和java.util.concurrent.ThreadLocalRandom都是RandomGenerator接口的实现类

RandomGenerator generator = RandomGeneratorFactory.all()
    .filter(RandomGeneratorFactory::isJumpable)
    .filter(factory -> factory.stateBits() > 128)
    .findAny()
    .map(RandomGeneratorFactory::create)
//  if you need a `JumpableGenerator`:
//  .map(JumpableGenerator.class::cast)
    .orElseThrow();

JEP 398:标记Applet API为废弃方便后续移除

Deprecate, for removal, these classes and interfaces of the standard Java API:

java.applet.Applet
java.applet.AppletStub
java.applet.AppletContext
java.applet.AudioClip
javax.swing.JApplet
java.beans.AppletInitializer

Deprecate, for removal, any API elements that reference the above classes and interfaces, including methods and fields in:

java.beans.Beans
javax.swing.RepaintManager
javax.naming.Context

JEP 406:switch的模式匹配(预览)

引入switch模式匹配的preview版本,instanceof的模式匹配在JDK14作为preview,在JDK15作为第二轮的preview,在JDK16转正

// Old code
if (o instanceof String) {
    String s = (String)o;
    ... use s ...
}

// New code
if (o instanceof String s) {
    ... use s ...
}

然后就有了

static String formatterPatternSwitch(Object o) {
    return switch (o) {
        case Integer i -> String.format("int %d", i);
        case Long l    -> String.format("long %d", l);
        case Double d  -> String.format("double %f", d);
        case String s  -> String.format("String %s", s);
        default        -> o.toString();
    };
}

JEP 409:密封类

详解 Java 17中的新特性:“密封类”

参考:Java17的新特性 - SegmentFault 思否

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值