侧边栏壁纸
博主头像
ZHD的小窝博主等级

行动起来,活在当下

  • 累计撰写 79 篇文章
  • 累计创建 53 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

JDK 11 的新特性(LTS)

江南的风
2018-12-22 / 0 评论 / 0 点赞 / 18 阅读 / 8668 字 / 正在检测是否收录...

Java 11 的新特性

JDK 11(Java Development Kit 11)作为Java平台的一个重要版本,带来了许多令人振奋的新特性和改进。Java 11 是 Java 8 之后的第一个 LTS 版本,于 2018 年 9 月 25 日正式发布,但是也自从 Java 11 开始, Oracle JDK 不再可以免费的用于商业用途,当然如果你是个人使用,或者是使用 Open JDK ,那么还是可以免费使用的。

参考链接:https://openjdk.org/projects/jdk/11/

以下是JDK 11的主要新特性归纳:

1. 字符串处理增强

JDK 11增加了一系列的字符串处理方法,使得字符串操作更加便捷。

  • isBlank()

isBlank()方法用于判断字符串是否为空或仅包含空白字符(包括空格、制表符、换行符等)。这个方法比传统的 trim().isEmpty() 调用更加简洁和直观。

例如:

String str = "   ";  
boolean isEmptyOrBlank = str.isBlank(); // true
  • strip(), stripLeading(), stripTrailing()

这些方法用于去除字符串前后的空白字符。与 trim() 方法不同的是,strip() 方法可以去除包括Unicode空格在内的所有空白字符,而 trim() 方法只能去除ASCII空格。stripLeading()stripTrailing() 分别用于去除字符串首部和尾部的空白字符。

例如:

String str = "  Java  ";  
String stripped = str.strip(); // "Java"  
String strippedLeading = str.stripLeading(); // "Java  "  
String strippedTrailing = str.stripTrailing(); // "  Java"
  • repeat(n)

repeat(n) 方法用于将字符串重复n次并返回结果。这在需要重复拼接字符串时非常有用。

例如:

String str = "Java";  
String repeated = str.repeat(3); // "JavaJavaJava"
  • lines()

lines()方法将字符串按照行终止符(如换行符\n或回车符\r)分割成多个字符串,并返回一个Stream<String>流。这使得对多行字符串的处理变得更加容易。

例如:

String str = "Hello\nWorld\nJava 11";  
long count = str.lines().count(); // 3  
str.lines().forEach(System.out::println);    
// Hello  
// World  
// Java 11

2. File API改动

读写文件变得更加方便。

// 创建临时文件
Path path = Files.writeString(Files.createTempFile("temp", ".txt"),  "abc123");

// 读取文件
String s = Files.readString(path);
System.out.println(s); // abc123

3. HTTP Client API的标准化

  • 正式支持:Http Client API在JDK 11中得到了标准化的支持,替代了老旧的HttpURLConnection。

  • 功能:支持HTTP/1.1和HTTP/2协议,也支持WebSockets。

  • 优势:新的HttpClient提供了更加简洁、灵活且易于使用的接口,能够与现代的Web服务相互操作。

例子:

// 创建 HttpClient 实例  
HttpClient client = HttpClient.newHttpClient();  

// 创建 HttpRequest 实例,指定请求方法和 URL  
HttpRequest request = HttpRequest.newBuilder()  
		.uri(URI.create("https://httpbin.org/get")) // 这里我们使用 httpbin.org 来模拟请求  
		.header("User-Agent", "Java 11 HttpClient Bot") // 添加请求头  
		.GET() // 这是一个 GET 请求  
		.build();  

// 发送请求并获取响应  
try {  
    // 同步请求
	HttpResponse<String> response = client.send(request, BodyHandlers.ofString()); 

    // 异步请求
    client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
        .thenApply(HttpResponse::body)
        .thenAccept(System.out::println)
        .join();

	// 处理响应  
	if (response.statusCode() == 200) {  
		System.out.println("请求成功!");  
		System.out.println("响应体: " + response.body());  
	} else {  
		System.out.println("请求失败,状态码: " + response.statusCode());  
	}  
} catch (IOException | InterruptedException e) {  
	System.err.println("请求发生错误: " + e.getMessage());  
}  

4. Lambda 局部变量类型推断

Java 10 引入了 var 语法,用于自动推断变量类型,使代码更简洁。而在 Java 11 中,这个方便的语法糖被扩展到了 Lambda 表达式中,进一步简化了代码编写。

例子:

// 使用 var 声明 List 集合  
var list = Arrays.asList("apple", "banana", "cherry");  

// 使用 var 在 Lambda 表达式中声明局部变量  
// 这里我们过滤出列表中所有长度大于 5 的字符串  
var filteredList = list.stream()  
		.filter(s -> {  
			// 在 Lambda 表达式内部使用 var 声明局部变量  
			var length = s.length();  
			return length > 5;  
		})  
		.toList();

5. 编译和运行简化

从学习Java之初,我们通常遵循先使用javac命令编译Java文件,随后通过java命令来运行编译后的字节码。但现在,借助Java11的新特性,我们只需一个java命令就能直接运行Java文件,简化了过程。

例子:

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

$ java Main.java // 不用 javac Main.java 编译成Main.class 后再 java Main了
Hello World

7. Java飞行记录器(Flight Recorder)

  • 功能:Java飞行记录器是一种低开销的事件信息收集框架,类似于飞机上的黑盒子,用于对应用程序和JVM进行故障检查、分析。

  • 开源:在JDK 11中,Java飞行记录器从Oracle JDK开源到了OpenJDK,成为JDK 11的一部分。

8. 其他改进

  • Unicode 10.0支持:JDK 11支持Unicode 10.0版本,包括16018个新的字符、18个新的Block和10个新的Script。

  • 支持TLS 1.3协议:DK 11实现了TLS协议1.3版本,替换了之前的TLS版本(包括TLS 1.2),并改进了其他TLS功能,在安全性和性能方面都做了提升。

  • 加密算法更新:JDK 11增加了ChaCha20和Poly1305加密算法(JEP 329),提供了更安全的加密选项。

9. 预测性GC(Predictive GC)

  • 实验性功能:基于过去的GC数据和分析算法,预测出垃圾收集的最佳时间,以提高系统的性能和吞吐量。

10. 新的垃圾回收器

  • Epsilon GC:一个实验性的低开销垃圾回收器,仅分配有限的内存资源,最大限度地降低内存占用和内存吞吐延迟时间。它主要用于性能测试或内存压力测试。

  • ZGC:一个可扩展的低延迟垃圾收集器(JEP 333),旨在实现极短的GC停顿时间,同时支持大内存堆的处理。虽然目前还是实验特性,但为特定生产环境的苛刻需求提供了一个可能的选择。

0

评论区