Java9-Java11的主要新特性

发布时间:2024-03-10 16:20:59

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

它提供了一种叫做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

Epsilon 垃圾回收器是一种无操作的垃圾回收器,它不会进行任何垃圾回收操作。这意味着它将所有分配的对象保留在堆中,不会回收或整理任何对象的内存,因此不会发出任何与垃圾回收相关的声音。该回收器的目的是测试、性能分析和内存故障注入等短期任务。尽管Epsilon 回收器本身不执行任何操作,但当Java 堆使用 Epsilon 在回收器中,系统需要设置一些参数,如堆的最大值和系统退出的条件。

上一篇 Java 语法进阶
下一篇 java 中的并发

文章素材均来源于网络,如有侵权,请联系管理员删除。

标签: Java教程Java基础Java编程技巧面试题Java面试题