Java9-Java11的主要新特性
2024-03-10 16:20:59
官网公开的17个JEP (JDK Enhancement Proposal 特征增强提议)
181: Nest-Based Access Control(基于嵌套的访问控制)
309: Dynamic Class-File Constants(动态类文件常量)
315: Improve Aarch64 Intrinsics(改进 Aarch64 Intrinsics)
318: Epsilon: A No-Op Garbage Collector( Epsilon 垃圾回收器又称“垃圾回收器”No-Op(无操作回收器,又称“”No-Op(无操作)“回收器)
320: Remove the Java EE and CORBA Modules(移除 Java EE 和 CORBA 模块, JavaFX也已被移除。
321: HTTP Client (Standard)
323: Local-Variable Syntax for Lambda Parameters(用于 Lambda 参数局部变量语法)
324: Key Agreement with Curve25519 and Curve448 Curve25519 和 Curve448 算法实现的密钥协议)
327: Unicode 10
328: Flight Recorder(飞行记录仪)
329: ChaCha20 and Poly1305 Cryptographic Algorithms(实现 ChaCha20 和 Poly1305 加密算法)
330: Launch Single-File Source-Code Programs(启动单个 Java 源代码文件的程序)
331: Low-Overhead Heap Profiling(低成本堆分配采样方法)
332: Transport Layer Security (TLS) 1.3(对 TLS 1.3 的支持)
335: Deprecate the Nashorn JavaScript Engine(弃用 Nashorn JavaScript 引擎)
336: Deprecate the Pack200 Tools and API(弃用 Pack200 工具及其 API)
Java列在下面 8后到Java11的一些主要新特征。
Java 9 模块系统(Module System)Java平台模块系统将代码包装在可重用和自包含的模块单元中,使代码更加安全可靠。以下是一个模块示例:
module com.example.foo {
requires java.base;
requires java.sql;
requires httpclient;
}
JShell
它提供了一种叫做JShell的交互式Shell工具。它允许用户执行Java代码,而不需要类别或方法的复杂性和结构。
交互式执行// JShell中的示例
jshell> int a = 10;
a ==> 10
jshell> int b = 20;
b ==> 20
jshell> int c = a + b;
c ==> 30
脚本执行
编辑测试jsh脚本:
echo 'System.out.println("print 1~4:");
for (int i = 1; i <= 4; i++) {
System.out.println(i);
}
/exit' > test.jsh
执行:
jshell test.jsh
执行结果:
print 1~4:
1
2
3
4
私有方法和私有接口
允许界面包含私有方法,这有助于降低公共方法的复杂性,提高代码的可读性和可重用性。
public interface MInterface {
default void myPublicMethod() {
// 公有方法可以调用私有方法
myPrivateMethod();
}
private void myPrivateMethod() {
// 私有方法只能在接口内部调用
}
Stream的改进 API
添加了一些Stream 新的API方法,如:dropWhile()
,takeWhile()
和ofNullable()
。
List<Integer> numbers = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
List<Integer> result = numbers.stream()
.dropWhile(n -> n < 5)
.collect(Collectors.toList());
// 输出: [5, 6, 7, 8, 9]
Try的改进-With-Resources语句
通过改进Try-With-自动关闭Resources语句,减少冗余代码,提高代码可读性。
// Java 7 或 8中
try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {
System.out.println(reader.readLine());
} catch (IOException e) {
e.printStackTrace();
}
// Java 9中
BufferedReader reader = new BufferedReader(new FileReader("file.txt"));
try (reader) {
System.out.println(reader.readLine());
} catch (IOException e) {
e.printStackTrace();
}
HTTP/2 客户端API(JAVA11有所改进)
添加内置HTTP/2客户端API,用于发送和接收HTTP2请求。
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("http://example.com"))
.GET()
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
工厂集合方法
增加了一些方便的集合工厂方法:List/Set/Map都添加了of和copyof来创建不可变集合,使其更加简单易用。
//Java 8
List<Integer> list = Arrays.asList(一、二、三、四、五);
//Java 9
var list = List.of(Java9), Java10, "Java11");
var copy = List.copyOf(list);
System.out.println(list == copy); // true
Java 10
推断局部变量类型
引入局部变量类型推断,允许我们在没有明确指定类型的情况下使用var关键字声明局部变量。这使得代码更简单、更容易读取。不要担心它会影响程序的运行速度,编译器会为我们处理。
//Java 10
var name = "java 10";
共享应用程序类数据(Application Class-Data Sharing,ACDS)扩展为非默认容器
扩展了ACDS特性,允许用户在使用自定义容器时共享类元数据。
java -Xshare:off //关闭ACDS
java -Xshare:on ///打开ACDS
java -Xshare:auto //自动检测ACDS是否打开,如果没有,则打开共享。
增加操作符
Java 10添加了两个新的操作符,<=>
,instanceof
模式匹配操作符。
//如果两个值相等,则返回0
System.out.println(1<=>1); //0
如果左边大于右边,则返回1,否则返回-1
System.out.println(2<=>3);//-1
if (object instanceof String value) {
System.out.println(value.length());
}
Optional类改进
Java 10添加了一些新的方法,如:orElseThrow()
、or()
和ifPresentOrElse()
,以使 Optional API 更完美。使代码更加紧凑和可读。
//为 Optional 实例提供默认值
String s = Optional.ofNullable(null).orElse("Other");
System.out.println("Default value: " + s); ///输出Defaultt value: Other
Java 11
HTTP Client API 改进
Java HTTP改进了11 Client API,HTTP请求可以更容易地发送和接收。
//设置http client 参数
HttpClient httpClient = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_2)
.connectTimeout(Duration.ofSeconds(10))
.build();
////发送http请求
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://www.baidu.com"))
.GET()
.header("User-Agent", "Java 11 HttpClient")
.build();
// 同步
HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
// 异步
httpClient.sendAsync(httpRequest, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(System.out::println);
推断升级局部变量类型
在var上添加注释语法格式。
(@Deprecated var x, @Nullable var y) -> x.process(y);
字符串新方法
Java 添加了一些新的操作字符串的方法。
String str = " Hello, Java 11! ";
//删除首尾空格
System.out.println(str.strip()); //输出: Hello, Java 11!
//去除前置空间
System.out.println(str.stripLeading()); //输出:Hello, Java 11!
///去除后置空间
System.out.println(str.stripTrailing()); //输出: Hello, Java 11!
//重复自己的字符串
System.out.println("Java ".repeat(3)); //输出: Java Java Java
构造函数得到了改进
Java 为构造函数增加了新的特性,可以更容易地创建实例。
public class Person {
private String name;
private int age;
public Person(){ }
public Person(String name){
this.name = name;
}
public Person(String name, int age){
this(name);
this.age = age;
}
}
编译操作更加简化
// Java11前 操作前先编译
javac Javastack.java
java Javastack
// Java11后
java Javastack.java
ZGC(实验性)
Java 11 与以前版本相同的垃圾回收器,如Serial、Parallel Scavenge、Parallel Old和CMS。但是,Java 11 还引入了一种新的垃圾收集器,即 Z Garbage Collector(ZGC),垃圾收集器旨在实现低停顿时间和高吞吐量。
Z Garbage Collector 是 HotSpot VM 后台垃圾回收器旨在暂停时间小于给定阈值 GC 暂停时间缩短到最小。Z Garbage Collector 默认启用,可在 JDK 11 中使用。
Epsilon