JavaSe:java9 10 11新特性
一、Java9中的新特性
1.1 JDK和JRE目录结构的改变
1.2 模块化系统
模块之间包的调用
现有两个模块,结构如下
现在希望在第一个块的MoudleTest中使用第二个模块中的Person类,直接使用是不行的,使用需要引入暴露和导入的概念
如图:
首先在第二个模块中的src
下。新建 moudle-info.java
文件
并指明向外暴露的包
1 | module java9test { |
然后再需要引用的模块的src
下同样新建 moudle-info.java
文件
指明需要引入的模块
1 | module guigu20210918 { |
1.3 Java的REPL工具
1.3.1 jShell命令
产生背景
向Python 和Scala之类的语言早就有交互式编程环境(read - evaluate - print - loop)
了,以交互式的方式对语句和表达式进行求值。开发者只需要输入一些代码,就可以在编译前获得对程序的反馈。而之前Java版本想执行代码,必须创建文件、声明类、提供测试方法方可实现
。
设计理念
即写即得
实现目标
- Java 9中拥有的jShell。可以让Java可以像脚本语言一样运行,从控制台启动jShell,利用jShell可以在没有声明类的情况下直接声明变量,计算表达式,执行语句。即开发时可以在命令行里直接运行java代码,而无需创建Java文件。
- jShell也可以从文件中加载语句或将语句保存到文件中
- jShell也可以是tab建进行自动补全和自动添加分号
在命令行直接输入 jshell就可以开始写语句了
在shell中编写Java代码也会有相应的提示
/edit
命令可以调出JShell Edit Pad,可以在窗口看见已经成功的输出
也可以在JShell Edit Pad中进行修改,修改完成后点击Accept按钮提交修改后在shell内会有修改成功的提示
直接在shell命令内再次定义同名的变量或方法,后建的变量方法会覆盖之前的变量和方法
其他jshell命令
1.4 语法改进:接口的私有方法
Java 9 中,接口中可以定义访问权限为private的方法。
1.5 语法改进:钻石操作符使用升级
在Java8中
与匿名实现类共同使用钻石操作符
(diamond operator)是会报错的
编译报错信息:Cannot use '<>' with anonymous inner classes
.
1 | Comparator<Object> com = new Comparator<>() { |
1.6 try结构的语法升级
Java8中try的资源关闭是自动的
java8自动关闭的前提要求,执行后必须关闭的资源的初始化必须在try子句中初始化
1 | //java8之前的资源关闭都是在finally中完成 |
Java9中try
执行后必须关闭的资源的初始化可以在try子句中之外
此时的reader是声明为final的,在try内部不可修改
1 | //java9 |
1.7 集合工厂方法 :快速创建只读集合
1 | List<Integer> list1 = List.of(1,2,3,4,5); |
1.8 InputStream 加强
InputStream有了一个非常有用的方法,
transferTo
,可以用来将数据直接传输带OutputStream,这是在处理原始数据流时非常常见的一种用法,如下示例:
1 | ClassLoader c1 = this.getClass().getClassLoader(); |
1.9 增强的 StreamAPI
四个方法:
takeWhile()
从开头开始返回尽可能的多的满足条件的元素,一旦遇到不满足条件的就停止
1 | List<Integer> list = Arrays.asList(12, 432, 654, 23, 765, 55, 28, 88); |
输出:
1 | ***** |
dropWhile()
与takeWhile相反,从开头开始遇到不满足条件的元素后,返回剩下的元素
1 | List<Integer> list = Arrays.asList(23,43,45,55,56,54,32,2,45,89,7); |
输出:
1 | 55 56 54 32 2 45 89 7 |
ofNullable()
形参变量是可以为null值的单个元素
1 | Stream<Integer> stream = Stream.ofNullable(null); |
输出
1 | 0 |
重载方法iterate
1 | // java8中创建无限流 |
1.10 Optional获取Stream的方法
1 | //Java9给Optional类提供新方法stream() |
输出·
1 | Tom |
二、Java10中的新特性
2.1 局部变量类型推断
要使用类型推断那么局部变量必须赋值。
1 | //1、声明变量时,根据所赋的值,推断变量类型 |
不能推断的情况
① 没有初始化的局部变量声明
②方法的返回类型
③方法的参数类型
④构造器的参数类型
⑤属性
⑥catch块
2.2 集合新增copyOf()
用于创建只读集合
1 | var list1 = List.of("java","Python","C"); |
上述两种输出不同的原因:
1 | copyOf(Xxx coll): 如果参数coll本身是一个只读集合,则copyOf()返回值即为coll本身 |
三、Java11 中的新特性(LTS)
3.1 String中新增的方法
空白操作
方法 | 作用 |
---|---|
isBlank |
判断当前字符串是否空白 |
strip() |
去除首尾空白 |
stripTrailing() |
去除尾部空白 |
stripLeading() |
去除首部空白 |
代码测试:
1 | //boolean isBlank |
输出·:
1 | true |
复制操作 repeat(int count)
将当前字符串复制count次并返回复制后的字符
1 | //当字符串复制count次 |
行数统计
lines().count()
:统计当前字符串的行数
1 | System.out.println("abc\ndefg".lines().count()); |
3.2 Optional加强
加强后的Optional,可以很方便地将一个Optional转换成一个Stream,或者当一个空Optional时给它一个替代的
新增方法 | 描述 | 新增的版本 |
---|---|---|
boolean isEmpty() | 判断value是否为空 | JDK11 |
isPresentOrElse(Consumer<? super T>action,Runnable emptyAction) | value非空,执行参数1功能;如果是value为空,执行参数2功能 | JOK9 |
Optional or (Supplier<? extends Optional<? extends T>>supplier) | value非空,返回对应Optional:value为空,返回形参封装的Optional | JDK9 |
Stream stream() | value非空,返回仅包含此value的Stream;否则,返回一个空的Stream | JDK9 |
T orElseThrow() | value非空,返回value;否则抛异常:NoSuchElementException | JDK10 |
部分方法代码举例
isPresent()
,isEmpty()
1 | Optional<Object> op = Optional.empty(); |
3.3 局部变量类型推断的升级
在var上添加注解的语法格式在jdk中是不能实现的。在JDK11中加入了这样的语法
1 | //错误形式:必须要有类型,可以加上var |
3.4 全新的Http客户端API
HttpClient
它将替代仅适用于blocking模式的HttpURLCollection
,并提供对WebSocket 和 HTTP/2的支持
javaWeb详述
3.5 更简化的编译运行程序 java Javastack.java
Java11以前Java文件编译运行的步骤
1 | //编译· |
在之前的学习中我们一直有要运行一个Java源代码必须先编译,再运行,两步执行操作,在java11里,通过一个java命令:java Javastack.java
就可以直接解决
一个命令编译运行源代码的注意点
- 执行源文件中的第一个类,所以第一个类
必须包含主方法
- 并且不可以使用其他源文件中的自定义的类,本文件中的自定义类是可以使用的。
3.6 ZGC
GC是Java主要优势之一
。然而GC(垃圾回收机制)停顿太长,就会开始影响应用的响应时间。消除或减少GC停顿时长,Java将对更广泛的应用场景是一个更有吸引力的平台。ZGC,A Scalable Low-Latency Garbage Collection(Experimental)
,ZGC大概是JDK11最为瞩目的特性。但是后面带来Experimental,说明这不建议用到生产环境- ZGC是一个是一个并发,基于region,压缩性的垃圾收集器,只有root扫描阶段会STW(stop the world),因此GC停顿时间不会随着堆的增长和存活对象的增长而变长。