searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Java9-Java11的主要新特性

2023-03-30 08:48:52
15
0

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 回收器时,系统需要设置一些参数,如堆的最大值和系统退出的条件等。

0条评论
0 / 1000
张****权
5文章数
0粉丝数
张****权
5 文章 | 0 粉丝
原创

Java9-Java11的主要新特性

2023-03-30 08:48:52
15
0

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 回收器时,系统需要设置一些参数,如堆的最大值和系统退出的条件等。

文章来自个人专栏
JAVA
3 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0