Java 9&10&11新特性

Java 9 的新特性

  • 从Java 9 这个版本开始,Java 的计划发布周期是 6 个月

  • 这意味着Java的更新从传统的以特性驱动的发布周期,转变为以时间驱动的(6 个月为周期)发布模式,并逐步的将 Oracle JDK 原商业特性进行开源。

  • 针对企业客户的需求,Oracle 将以三年为周期发布长期支持版本(long term support)

  • Java 9 提供了超过150项新功能特性,包括备受期待的模块化系统、可交互的 REPL 工具:jshell,JDK 编译工具,Java 公共 API 和私有代码,以及安全增强、扩展提升、性能管理改善等。可以说Java 9是一个庞大的系统工程,完全做了一个整体改变。

  • 主要新特性
    Java 9&10&11新特性
    .
    .

一、Java 8之后目录改变
Java 9&10&11新特性
Java 9&10&11新特性

.
.

二、模块化系统
Java 9&10&11新特性
Java 9&10&11新特性
Java 9&10&11新特性

.

  • exports:控制着哪些包可以被其它模块访问到。所有不被导出的包默认都被封装在模块里面。
    Java 9&10&11新特性

  • requires:指明对其它模块的依赖。

Java 9&10&11新特性

.
.

三、Java的REPL工具: jShell命令

  • 设计理念:即写即得、快速运行
  • Java 9 中终于拥有了 REPL工具:jShell。让Java可以像脚本语言一样运行,从控制台启动jShell,利用jShell在没有创建类的情况下直接声明变量,计算表达式,执行语句。即开发时可以在命令行里直接运行Java的代码,而无需创建Java文件,无需跟人解释”public static void main(String[] args)”这句废话。
  • jShell也可以从文件中加载语句或者将语句保存到文件中。
  • jShell也可以是tab键进行自动补全和自动添加分号

.
.

四、语法改进:接口的私有方法

  • Java 8中规定接口中的方法除了抽象方法之外,还可以定义静态方法和默认的方法。
  • 在Java 9中,接口更加的灵活和强大,连方法的访问权限修饰符都可以声明为private的了,此时方法将不会成为你对外暴露的API的一部分

.
.

五、语法改进:钻石操作符使用升级

  • 我们将能够与匿名实现类共同使用钻石操作符(diamond operator),在Java 8中,赋的值必须要显示的在<>定义类型,但Java 9不用了。

.
.

六、语法改进:try语句

  • Java 8 中,可以实现资源的自动关闭,但是要求执行后必须关闭的所有资源必须在try子句中初始化,否则编译不通过。
    Java 9&10&11新特性
  • Java 9 中,用资源语句编写try将更容易,我们可以在try子句中使用已经初始 化过的资源,此时的资源是final的(在try语句中不能修改属性的值)。
    Java 9&10&11新特性
    .
    .

七、String存储结构变更

  • 结论:String 再也不用 char[] 来存储啦,改成了 byte[] 加上编码标记,节约了一些空间
  • 并且StringBuffer、StringBuilder也变成用byte[]存储了!
    Java 9&10&11新特性
    .
    .

八、集合工厂方法:快速创建只读集合

  • Java 9之前要创建一个只读、不可改变的集合,就要包装成一个不可修改的集合–>Collections类的静态方法unmodifiableXxx(Xxx)
    Java 9&10&11新特性

  • Java 9因此引入了方便的方法" 集合.of() ",创建的就是一个只读、不可改变的集合,这使得类似的事情更容易表达。
    Java 9&10&11新特性

.
.

九、InputStream 加强

  • InputStream 终于有了一个非常有用的方法:transferTo,可以用来将数据直接传输到 OutputStream!!!
    Java 9&10&11新特性
    .
    .

十、增强的StreamAPI

  • takeWhile():在有序的Stream 中,takeWhile 返回从开头开始的尽量多的元素(遇到不满足条件的就不在遍历下去,即使后面的数据满足条件)。

  • dropWhile():dropWhile 的行为与 takeWhile 相反,返回剩余的元素(遇到第一个不满足的情况就获取后面所有的元素)。

  • ofNullable():Java 8 中 Stream 的参数不能只有单个null元素,否则会报空指针异常。
    而 Java 9 中的 ofNullable 方法允许我们创建一个单元素 Stream,可以包含一个非空元素,也可以创建一个空Stream。

  • iterate()重载(无限流):这个 iterate 方法的新重载方法,可以让你提供一个 Predicate (判断条件)来指定什么时候结束迭代。
    Java 9&10&11新特性

.
.

十一、Optional获取Stream的方法

  • Optional类中添加了stream()的使用
    Java 9&10&11新特性

.
.
.

Java 10 新特性

  • LTS (Long-Term-Support) 版本:长期稳定性版本!!!!!!!!!
  • Java 9 和 Java 10 都不是 LTS (Long-Term-Support) 版本。和过去的 Java 大版本升级不同,这两个只有半年左右的开发和维护期。而 Java 11,也就是 18.9 LTS,才是 Java 8 之后第一个 LTS 版本。

.

主要新特性
Java 9&10&11新特性

.
.

一、局部变量类型推断

var:只适用于局部变量,不适用于类变量

  • 适用于以下情况:
    Java 9&10&11新特性
  • 在局部变量中使用时,如下情况不适用:
    情况0:Lambda表达式
    Java 9&10&11新特性

.
.

工作原理
在处理 var时,编译器先是查看表达式右边部分,并根据右边变量值的类型进行推断,作为左边变量的类型,然后将该类型写入字节码当中。

  • var不是一个关键字:意味着可以当变量名使用,但不可以当类名使用
  • var并不会改变Java是一门静态类型语言的事实

.
.

二、集合新增创建不可变集合的方法

  • Java 9 开始,Jdk 里面为集合(List / Set / Map)都添加了of (jdk9新增)和copyOf (jdk10新增)方法,它们两个都用来创建不可变的集合。
  • of()和copyOf()区别:
    Java 9&10&11新特性
  • 总结 :copyOf 方法会先判断来源集合是不是AbstractImmutableList 类型的,如果是,就直接返回,如果不是,则调用 of 创
    建一个新的集合。

.
.
.

Java 11 新特性

  • JDK 11 是一个长期支持版本(LTS, Long-Term-Support)
    Java 9&10&11新特性

.
.

一、新增了一系列字符串处理方法
Java 9&10&11新特性

.
.

二、Optional 加强

  • Optional 也增加了几个非常酷的方法,现在可以很方便的将一个 Optional 转换成一个 Stream, 或者当一个空 Optional 时给它一个替代的。
    Java 9&10&11新特性

.
.

三、局部变量类型推断升级

  • var上添加注解的语法格式,在jdk10中是不能实现的。在JDK11中加入了这样的语法
    Java 9&10&11新特性

.
.

四、全新的HTTP 客户端API
Java 9&10&11新特性

.
.

五、更简化的编译运行程序

  • 在我们的认知里面,要运行一个 Java 源代码必须先编译,再运行,两步执行动作。而在未来的 Java 11 版本中,通过一个 java 命令就直接搞定了,如以下所示:java Javastack.java

  • 一个命令编译运行源代码的注意点:
    执行源文件中的第一个类, 第一个类必须包含主方法。
    并且不可以使用其它源文件中的自定义类, 本文件中的自定义类是可以使用的。

上一篇:「工具」Optional处理非空判断


下一篇:JDK1.8新特性