一、前言
上一期讲了JDK10的一些新特性,需要回顾的朋友们可以去该专栏回顾一下
这一期讲一讲JDK11的一些新功能
二、新增特性
以下是JDK 11的一些新增或变化的特性:
1. 纯字符串类型的 HTTP 客户端:
JDK 11 引入了一个新的 HTTP 协议的客户端 API,它提供了一种简单的方式来发送 HTTP 请求并处理响应。下面是一个简单的例子:
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;public class HttpClientExample {public static void main(String[] args) {HttpClient client = HttpClient.newHttpClient();HttpRequest request = HttpRequest.newBuilder().uri(URI.create("https://api.example.com/users")).build();client.sendAsync(request, HttpResponse.BodyHandlers.ofString()).thenApply(HttpResponse::body).thenAccept(System.out::println).join();}
}
2. 局部变量类型推断的增强:
JDK 11 支持在 lambda 表达式中使用 var
关键字,并且在更多的场景中可以进行类型推断。例如:
import java.util.List;public class VarExample {public static void main(String[] args) {List<String> names = List.of("Alice", "Bob", "Charlie");names.forEach((var name) -> {System.out.println(name);});}
}
3. 废弃的 G1 垃圾收集器:
JDK 11 废弃了 G1 垃圾收集器中的一些标志选项,这些选项已经不再推荐使用。
4. String 类的新方法:
JDK 11 在 String
类中新增了一些方法,例如 isBlank()
、lines()
、strip()
、stripLeading()
、stripTrailing()
等,用于方便地处理字符串。
当然,还有其他一些变化和新增的特性,继续如下:
5. JDK 11 允许在 lambda 表达式的参数中使用 var
Local-Variable Syntax for Lambda Parameters
:JDK 11 允许在 lambda 表达式的参数中使用 var
,以简化代码。例如:
import java.util.function.Predicate;public class LambdaExample {public static void main(String[] args) {Predicate<String> startsWithA = (var s) -> s.startsWith("A");System.out.println(startsWithA.test("Apple")); // trueSystem.out.println(startsWithA.test("Banana")); // false}
}
6. 嵌套访问控制
Nest-Based Access Control
:JDK 11 引入了一种新的访问控制方式,即嵌套访问控制,在嵌套类中,可以访问外部类的私有成员。例如:
public class Outer {private static String message = "Hello";public static class Inner {public void printMessage() {System.out.println(message);}}public static void main(String[] args) {Inner inner = new Inner();inner.printMessage();}
}
7. 新的垃圾收集器 Epsilon
Epsilon: A No-Op Garbage Collector
:JDK 11 引入了一个新的垃圾收集器,称为 Epsilon,它实际上是一个无操作(no-op)的垃圾收集器,用于性能调优和测试目的。
8. Unicode 10:
Unicode 10
:JDK 11 更新了 Unicode 版本,支持更多的字符和符号。
9. HTTP Client (Standard):
HTTP Client (Standard)
:JDK 11 引入了一个新的标准 HTTP 客户端,取代了过时的 HttpURLConnection
。新的 HTTP 客户端 API 提供了更简洁、更灵活的方式来进行 HTTP 请求和处理响应。
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;public class HttpClientExample {public static void main(String[] args) throws Exception {HttpClient client = HttpClient.newHttpClient();HttpRequest request = HttpRequest.newBuilder().uri(URI.create("https://api.example.com/data")).build();HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());System.out.println(response.body());}
}
10. 允许直接运行单个源文件,无需先进行编译
Launch Single-File Source Code
:JDK 11 允许直接运行单个源文件,无需先进行编译,这对于简单的脚本和小型应用程序非常方便。
public class HelloWorld {public static void main(String[] args) {System.out.println("Hello, World!");}
}
可以直接运行:java HelloWorld.java
11. 引入了 ZGC垃圾收集器
ZGC: A Scalable Low-Latency Garbage Collector
:JDK 11 引入了 ZGC(Z Garbage Collector),它是一种低延迟的垃圾收集器,适用于大内存应用程序和需要快速响应的场景。
12.JDK 11 废弃了安全管理器(Security Manager)和 Java EE 模块
Deprecate the Security Manager and the Java EE Modules
:JDK 11 废弃了安全管理器(Security Manager)和 Java EE 模块,鼓励开发者使用更现代的安全框架和技术。
以上是 JDK 11 中的一些重要特性和改进,这个版本还包含了许多其他小的改进和修复。
三、移除和废弃项
在 JDK 11 中,有一些功能被移除或废弃。以下是一些详细说明和示例代码:
- 移除的功能
Java EE
模块:JDK 11 移除了一些 Java EE 相关的模块,如java.xml.ws
、java.xml.bind
、java.xml.ws.annotation
、java.corba
等。这些模块在 JDK 9 中已经被废弃。如果你需要使用这些功能,你可以考虑使用 Jakarta EE 或其他的替代方案。
示例代码:在 JDK 11 中,如果你的代码中使用了下面的导入语句,那么将会编译错误:
import javax.xml.ws.WebServiceClient;
import javax.xml.bind.annotation.XmlRootElement;
- 废弃的功能
Security Manager
:在 JDK 11 中,Security Manager 被废弃了。Security Manager 是一种安全机制,用于控制 Java 应用程序的访问权限。在 JDK 11 中,鼓励开发者使用更现代的安全框架和技术,如 Security Manager 和 Security Policy 文件的组合。
示例代码:在 JDK 11 中,如果你的代码中使用了 Security Manager 相关的 API,如下面的代码,编译时会出现警告:
System.setSecurityManager(new SecurityManager());
Pack200
工具和 API:Pack200 是一种压缩和解压缩 JAR 文件的工具。在 JDK 11 中,Pack200 工具和相关的 API 被废弃了。这是因为 Pack200 工具在实际使用中并不常见,并且有更好的替代方案。
示例代码:在 JDK 11 中,如果你的代码中使用了 Pack200 相关的类和方法,如下面的代码,编译时会出现警告:
import java.util.jar.Pack200;public class Example {public static void main(String[] args) {Pack200.Unpacker unpacker = Pack200.newUnpacker();// ...}
}
- 其他废弃的方法和类:JDK 11 还废弃了一些废弃已久的方法和类,如
Runtime.runFinalizersOnExit()
和Thread.stop(Throwable)
。这些方法和类已经不推荐使用,并且在未来的 JDK 版本中可能会被移除。
示例代码:在 JDK 11 中,如果你的代码中使用了废弃的方法和类,如下面的代码,编译时会出现警告:
Runtime.runFinalizersOnExit(true);
Thread.stop(new Throwable());
请注意,以上示例代码仅用于说明在 JDK 11 中移除和废弃的功能,并不一定适用于所有的场景。在实际使用中,请参考 JDK 11 的官方文档和更具体的示例代码。