JDK各版本新特性(更新到Java15)

Hello,I'm Shendi

每当Java出新版本我会第一时间更新

 

目录

 

JDK 1.0

1996-01-23 Oak(橡树)

JDK 1.1

1997-02-19

JDK 1.2

1998-12-08 Playground(操场)

JDK 1.3

2000-05-08 Kestrel(红隼)

JDK 1.4

2004-02-06 Merlin(隼)

JDK 1.5新特性

2004-9-30(Tiger)老虎

JDK 1.6

2006-12-11 Mustang(野马)

JDK 7新特性:

2011-07-28 Dolphin(海豚)

JDK 1.8

2014-03-18

JDK 9新特性:

    2017-9-22

Java 10

2018-3-21

Java 11

2018-09-25

Java12

2019-3-19

Java13

2019-9-17

Java14

2020-3-17

Java15

2020-9-15


JDK 1.0

1996-01-23 Oak(橡树)

    初代版本,伟大的一个里程碑,但是是纯解释运行,使用外挂JIT,

    性能比较差,运行速度慢

JDK 1.1

1997-02-19

    JDBC(Java DataBase Connectivity)

    支持内部类

    RMI(Remote Method Invocation)

    反射

    Java Bean

JDK 1.2

1998-12-08 Playground(操场)

    集合框架

    JIT(Just In Time)编译器

    对打包的Java文件进行数字签名

    JFC(Java Foundation Classes)包括Swing1.0,拖放和Java2D类库

    Java插件

    JDBC中引入可滚动结果集,BLOB,CLOB,批量更新和用户自定义类型

    Applet中添加声音支持

JDK 1.3

2000-05-08 Kestrel(红隼)

    Java Sound API

    Jar文件索引

    对Java的各个方面都做了大量优化和增强

JDK 1.4

2004-02-06 Merlin(隼)

    XML处理

    Java打印服务

    Logging API

    Java Web Start

    JDBC 3.0API

    断言

    Preferences API

    链式异常处理

    支持IPV6

    支持正则表达式

    引入Image I/O API

JDK 1.5新特性

2004-9-30(Tiger)老虎

    泛型

    增强循环,可以使用迭代方式

    自动装箱与自动拆箱

    类型安全的枚举

    可变参数

        底层就是一个数组,根据参数个数不同,会创建不同长度的数组

        在传递时可以直接传递数组(传递数组后就不能再传递其余可变参数)

    静态引入

    元数据(注解)

    Instrumentation

JDK 1.6

2006-12-11 Mustang(野马)

    支持脚本语言

    JDBC 4.0API

    Java Compiler API

    可插拔注解

    增加对Native PKI(Public Key Infrastructure),Java GSS(Generic Security Service)

    Kerberos和LDAP(Lightweight Directory Access Protocol)支持

    继承Web Services

JDK 7新特性:

2011-07-28 Dolphin(海豚)

1.switch支持字符串变量

2.泛型实例化类型自动推断

    ArrayList<String> list = new ArrayList<>();

3.新的整数字面表达方式 "ob"前缀 和 "_"连接符

    1.表示二进制字面值的前缀ob

        以下三个值相同

        byte b1 = ob00100001;

        byte b2 = 0x21;

        byte b3 = 33;

    2.字面常量数字的下划线.用下划线连接整数提升其可读性,自身无含义,不可用在数字的起始和末尾

        Java编码语言对给数值型的字面值加下划线有严格的规定。如上所述,你只能在数字之间用下划线。你不能用把一个数字用下划线开头,或者已下划线结尾。这里有一些其它的不能在数值型字面值上用下划线的地方:

            在数字的开始或结尾

            对浮点型数字的小数点附件

            F或L下标的前面

            该数值型字面值是字符串类型的时候  

            float pi1 = 3_.1415F; // 无效的; 不能在小数点之前有下划线

            float pi2 = 3._1415F; // 无效的; 不能在小数点之后有下划线

            long socialSecurityNumber1=999_99_9999_L;//无效的,不能在L下标之前加下划线

            int a1 = _52; // 这是一个下划线开头的标识符,不是个数字

            int a2 = 5_2; // 有效

            int a3 = 52_; // 无效的,不能以下划线结尾

            int a4 = 5_______2; // 有效的

            int a5 = 0_x52; // 无效,不能在0x之间有下划线

            int a6 = 0x_52; // 无效的,不能在数字开头有下划线

            int a7 = 0x5_2; // 有效的 (16进制数字)

            int a8 = 0x52_; // 无效的,不能以下划线结尾

            int a9 = 0_52; // 有效的(8进制数)

            int a10 = 05_2; // 有效的(8进制数)

            int a11 = 052_; // 无效的,不能以下划线结尾

4.在单个catch块中捕获多个异常,以及用升级版的类型检查重新抛出异常

    catch代码块得到了升级,用以在单个catch块中处理多个异常,如果你要捕获多个异常并且它们包含相似的代码,使用这一特性会减少代码重复

    catch(IOException | SQLException | Exception ex) {

    

    }

    这种情况下ex变量是final的

5.try-with-resources语句

    try-with-resources语句是一个声明一个或多个资源的try语句,一个资源作为一个对象,必须在程序结束后关闭

    try-with-resources语句确保在语句的最后每个资源都被关闭,任何实现了Java.lang.AutoCloseable和java.io.Closeable的对象都可以使用try-with-resource来实现异常处理和关闭资源

    try-with-resource可以声明多个资源(声明语句之间用分好分割,最后一个可忽略分号)

    try (流创建等需要关闭的资源打开操作,多个之间用;隔开) {操作} catch(Exception 这里可加catch可不加) {}

引入JavaNIO.2开发包

null值的自动处理

JDK 1.8

2014-03-18

    Lambda表达式 

        Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)

    方法引用 

        方法引用提供了非常有用的语法,可以直接引用已有的Java类或对象(实例)的方法或构造器.

        与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码

    默认方法

        默认方法就是一个在接口里面有了一个实现的方法

    新工具

        新的编译工具 如:Nashorn引擎 jjs 类依赖分析器jdeps

    Stream API

        新添加的Stream API(java.utils.stream)把真正的函数式编程风格引入到Java中

    Data Time API

        加强对日期与时间的处理

    Optional类

        Optional类已经成为Java8类库的一部分,可用来解决空指针异常

    Nashorn,JavaScript引擎

        Java8提供了一个新的Nashorn JavaScript引擎,它允许我们在JVM上运行特定的JavaScript应用

JDK 9新特性:

    2017-9-22

    模块系统

        模块是一个包的容器,Java9最大的变化之一是引入了模块系统(Jigsaw项目)

    REPL(JShell)

        交互式编程环境

        在cmd中输入JShell 可以帮你自动创建类

        以及运行一些简单的方法

    HTTP2客户端

        HTTP/2标准是HTTP协议的最新版本,新的HTTPClient API支持WebSocket和HTTP2流以及服务器推送特性

    改进的Javadoc

        Javadoc现在支持在API文档中的进行搜索,另外Javadoc的输出现在符合兼容HTML5标准

    多版本兼容Jar包

        多版本兼容Jar功能能让你创建仅在特定版本的Java环境中运行库程序时选择使用的class版本

    集合工厂方法

        List,Set和Map接口中,新的静态工厂方法可以创建这些集合的不可变实例

    私有接口方法

        在接口中使用private私有方法.我们可以使用private访问修饰符在接口中编写私有方法

    进程API

        改进的API来控制和管理操作系统进程.改进java.lang.ProcessHandle及其嵌套接口info来让开发者逃离时常因为要获取一个本地进程的PID而不得不适用本地代码的窘境

    改进的Stream API

        改进的Stream API添加了一些便利的方法,使流处理更容易,并使用收集器编写复杂的查询

    改进 try-with-resources

        如果你已经有一个资源是final或等效于final变量,您可以在try-with-resources语句中使用该变量,而无需再try-with-resources语句中声明一个新变量

    改进的弃用注解@Deprecated

        可以标记Java API的状态 可以表示被标记的API将会被移除,或者已被破坏

    改进钻石操作符(Diamond Operator)

        匿名类可以使用钻石操作符(Diamond Operator)

    改进Optional类

        java.util.Optional添加了很多新的有用方法,Optional可以直接转为stream

    多分辨率图像API

        定义多分辨率图像API,开发者可以很容易的操作和展示不同分辨率的图像了

    改进的CompletableFuture API

        CompletableFuture类的异步机制可以在ProcessHandle.onExit方法退出时执行操作

    轻量级的JSON API

        内置了一个轻量级的JSON API

    响应式流(Reactive Streams)API

        Java9中引入了新的响应式流API来支持Java9中的响应式编程

    模块化

        可定制JRE:更小的运行时镜像

        更确定的模块依赖关系:避免Jar Hell问题

        与 OSGI 的比较

    模块的定义:

        模块是一个命名的,自我描述的代码和数据的集合

        模块的代码被组织成多个包,每个包中包含Java类和接口

        模块的数据则包括资源文件和其他静态信息

    模块声明文件

        模块声明文件:module-info.java

        新的关键字:module 声明一个模块

        模块名称的规则 与Java包的命名规则相似

Java 10

2018-3-21

    JEP286,var局部变量类型推断

    JEP296,将原来用Mercurial管理的众多JDK仓库代码,合并到一个仓库中,简化开发和管理过程

    JEP304,统一的垃圾回收接口

    JEP307,G1垃圾回收器的并行完整垃圾回收,实现并行性来改善最坏情况下的延迟

    JEP310,应用程序类数据(AppCDS)共享,通过跨进共享通用类元数据来减少内存占用空间,和减少启动时间

    JEP312,ThreadLocal握手交互.在不进入到全局JVM安全点(Safepoint)的情况下,对线程执行回调,优化可以只停止单个线程,而不是停全部线程或一个都不停

    JEP313,移除JDK中附带的javah工具,可以使用javac -h代替

    JEP314,使用附加的Unicode语言标记扩展

    JEP317,能将堆内存占用分配给用户指定的备用内存设备

    JEP317,使用Graal基于Java的编译器,可以预先把Java代码编译成本地代码来提升效能

    JEP318,在OpenJDK中提供一组默认的根证书颁发机构证书,开源目前Oracle提供的JavaSE的根证书,这样OpenJDK对开发人员使用起来更方便

    JEP322,基于时间定义的发布版本,即上述提到的发布周期,版本号为...分别是大版本,中间版本,升级包和补丁版本

Java 11

2018-09-25

    181:Nest_Based访问控制

    309:动态类文件常量

    315:改善Aarch64 intrinsic

    318:无操作垃圾收集器ZGC

    320:消除Java EE和CORBA模块

    321:HTTP客户端(标准)

    323:局部变量的语法?参数

    324:Curve25519和Curve448关键协议

    327:Unicode 10

    328:飞行记录器

    329:ChaCha20和Poly1305加密算法

    330:发射一列纵队源代码程序

    331:低开销堆分析

    332:传输层安全性(Transport Layer Security,TLS)1.3

    333:动作,一个可伸缩的低延迟垃圾收集器(实验)

    335:反对Nashorn JavaScript引擎

    336:反对Pack200工具和API

Java12

2019-3-19

    在Java12中,switch可以有返回值 并且使用->直接

    break可以携带返回值,如果需要break返回值,则需每一个case后都有返回值或者抛出一个异常

    int num = switch(value) {

    case 1 ->1;

    case 2 ->2;

    case 3,4 ->3;

    case 5: break 5;

    case 6 -> {System.out.println("hello world");//没有返回则抛出异常}

    }

Java13

2019-9-17

    Java13中,switch支持如下写法

        int date = switch (day) {

        case MONDAY, FRIDAY, SUNDAY : yield 6;

        case TUESDAY                : yield 7;

        case THURSDAY, SATURDAY     : yield 8;

        case WEDNESDAY              : yield 9;

        default                     : yield 1; // default条件是必须的

        };

    支持文本块 使用三个"""

        起始的"""结尾必须换行

        String text = """

        hello world

        ! """

        文本块是在13中是预览功能,使用前需要先启用

        手动编译:

            javac --release 13 --enable-preview ...

        手动运行

            java --enable-preview ...

Java14

2020-3-17

    改进的switch表达式在14中获得了完全的支持

    instanceof支持模式匹配(语言特性 预览特性)

        使用instanceof和instanceof里的对象不用强转了

    NullPointerException(JVM特性)

        14的这个异常更加详细,精确到某个属性

    Record(预览功能)

        java14提供了解决get,set,toString等代码冗余,

        Record会提供equals,hashCode,toString方法的实体,可以重构如下

        public record Clazz(int a,double b,String c) {}

        通过record,可以自动地得到equals,hashCode,toString的实现,还有构造器和getter方法

    文本块中加入 \ 可以不换行

Java15

2020-9-15

    文本块转正

    ZGC垃圾回收器转正

    Shenandoah转正

    移除 Nashorn JavaScript Engine(JDK脚本执行引擎)

        在JDK11标记过期,15完全移除

    CharSequence新增isEmpty默认方法

持续更新中...

猜你喜欢

转载自blog.csdn.net/qq_41806966/article/details/108647463