Java 11是2018年由Oracle发布的第二个主要Java版本。此版本也是自Java 8之后,首个LTS(长期支持)版本,这意味着Oracle将至少在2026年之前为其提供安全性和错误修复更新。
官网公开的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 的支持)
333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)( ZGC:可伸缩的低延迟垃圾回收器,处于实验性阶段)
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
提供了一个交互式的Shell工具,称为JShell。它允许用户在不需要类或方法的复杂性和结构的情况下执行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(1,2,3,4,5);
//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); //输出Default value: Other
Java 11
HTTP Client API 改进
Java 11改进了HTTP 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 11添加了一些新方法来操作字符串。
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 11为构造函数添加了新的特性,能够更轻松地创建实例。
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
Epsilon 垃圾回收器是一种无操作垃圾回收器,它不会执行任何垃圾回收操作。这意味着它将所有分配的对象都保留在堆中,不会进行任何对象回收或内存整理,因此不会发出与垃圾回收相关的任何声音。此回收器的目的是为了测试、性能分析和一些短期的任务,例如内存故障注入等。尽管Epsilon 回收器本身不执行任何操作,但是当Java 堆使用 Epsilon 回收器时,系统需要设置一些参数,如堆的最大值和系统退出的条件等。