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 8之后目录改变
.
.
二、模块化系统
.
-
exports
:控制着哪些包可以被其它模块访问到。所有不被导出的包默认都被封装在模块里面。 -
requires
:指明对其它模块的依赖。
.
.
三、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 中,用资源语句编写try将更容易,我们可以在try子句中
使用已经初始 化过的资源
,此时的资源是final
的(在try语句中不能修改属性的值
)。
.
.
七、String存储结构变更
- 结论:String 再也不用 char[] 来存储啦,
改成了 byte[] 加上编码标记,节约了一些空间
。 -
并且StringBuffer、StringBuilder也变成用byte[]存储了!
.
.
八、集合工厂方法:快速创建只读集合
-
Java 9之前要创建一个只读、不可改变的集合,就要
包装成一个不可修改的集合
–>Collections类的静态方法unmodifiableXxx(Xxx)
。 -
Java 9因此引入了方便的方法
" 集合.of() "
,创建的就是一个只读、不可改变的集合,这使得类似的事情更容易表达。
.
.
九、InputStream 加强
- InputStream 终于有了一个非常有用的方法:
transferTo
,可以用来将数据直接传输到 OutputStream!!!
.
.
十、增强的StreamAPI
-
takeWhile()
:在有序的Stream 中,takeWhile 返回从开头开始
的尽量多的元素(遇到不满足条件的就不在遍历下去,即使后面的数据满足条件
)。 -
dropWhile()
:dropWhile 的行为与 takeWhile 相反,返回剩余的元素(遇到第一个不满足的情况就获取后面所有的元素
)。 -
ofNullable()
:Java 8 中 Stream 的参数不能只有单个null元素
,否则会报空指针异常。
而 Java 9 中的ofNullable 方法
允许我们创建一个单元素 Stream,可以包含一个非空元素,也可以创建一个空Stream。 -
iterate()重载
(无限流):这个 iterate 方法的新重载方法,可以让你提供一个 Predicate (判断条件)来指定什么时候结束迭代。
.
.
十一、Optional获取Stream的方法
- Optional类中添加了
stream()的使用
.
.
.
Java 10 新特性
LTS (Long-Term-Support) 版本:长期稳定性版本!!!!!!!!!
- Java 9 和 Java 10 都不是
LTS (Long-Term-Support) 版本
。和过去的 Java 大版本升级不同,这两个只有半年左右的开发和维护期。而 Java 11,也就是 18.9 LTS,才是 Java 8 之后第一个 LTS 版本。
.
主要新特性
.
.
一、局部变量类型推断
var:只适用于局部变量,不适用于类变量
-
适用于以下情况:
-
在局部变量中使用时,如下情况不适用:
情况0:Lambda表达式
.
.
工作原理
在处理 var时,编译器先是查看表达式右边部分,并根据右边变量值的类型进行推断,作为左边变量的类型,然后将该类型写入字节码当中。
- var不是一个关键字:意味着可以当变量名使用,
但不可以当类名使用
- var
并不会改变Java是一门静态类型语言的事实
.
.
二、集合新增创建不可变集合的方法
- Java 9 开始,Jdk 里面为集合(List / Set / Map)都添加了
of (jdk9新增)和copyOf (jdk10新增)
方法,它们两个都用来创建不可变的集合。
- of()和copyOf()区别:
-
总结 :copyOf 方法会先
判断来源集合是不是AbstractImmutableList 类型的
,如果是,就直接返回,如果不是,则调用 of 创
建一个新的集合。
.
.
.
Java 11 新特性
-
JDK 11 是一个长期支持版本(LTS, Long-Term-Support)
.
.
一、新增了一系列字符串处理方法
.
.
二、Optional 加强
- Optional 也增加了几个非常酷的方法,现在可以很方便的将一个 Optional 转换成一个 Stream, 或者当一个空 Optional 时给它一个替代的。
.
.
三、局部变量类型推断升级
- 在
var上添加注解的语法格式
,在jdk10中是不能实现的。在JDK11中加入了这样的语法
.
.
四、全新的HTTP 客户端API
.
.
五、更简化的编译运行程序
-
在我们的认知里面,要运行一个 Java 源代码必须先编译,再运行,两步执行动作。而在未来的 Java 11 版本中,通过一个 java 命令就直接搞定了,如以下所示:
java Javastack.java
-
一个命令编译运行源代码的注意点:
执行源文件中的第一个类,第一个类必须包含主方法。
并且不可以使用其它源文件中的自定义类
, 本文件中的自定义类是可以使用的。