随着时间的推移,Java 平台一直在不断演进和改进,为开发人员提供更好的工具和功能。JDK 11 是 Java 平台的一个重要版本,引入了许多新的特性和改进,为开发人员带来了全新的体验和可能性。本文将介绍 JDK 11 中一些重要的新特性,以及它们对 Java 开发的影响。
1.局部变量类型推断(Var 关键字)
JDK 11 引入了局部变量类型推断,允许使用 var
关键字声明局部变量而无需显式指定变量类型。这样可以简化代码,提高开发效率,同时不会影响代码的可读性和健壮性。例如:
package cn.qiang.tmall.admin.mall.demo;
/**
* @author :Nan Yang
* @version :V1.0
* @program :Software development
* @date :2024/3/26 23:06
* @description :新的变量定义
*/
public class VariableDefinitions {
public static void main(String[] args) {
//以前的变量定义
int a = 40;
int b = 50;
//基于jdk11的变量定义,编译器会自动推断变量的类型
var x = 40;
var y = 50;
}
}
在上面的示例中,var
关键字用于声明一个 ArrayList 类型的变量 list
,编译器会根据右侧的表达式自动推断出变量的类型。
当然针对初始化也有一些区别,如下所示:
注意成员变量的定义是不允许的:
这样循环也行:
import java.util.List;
/**
* @author :Nan Yang
* @version :V1.0
* @program :Software
* @date :2024/3/27 0:10
* @description :JDK11新特性
*/
public class VariableDefinitions {
public static void main(String[] args) {
//of静态方法属于JDK9新增
var list1 = List.of("雷神", "风神", "火神", "水神");
var list2 = List.of("草神", "男主", "女主");
var list3 = List.of("雷神", "风神", "火神", "水神", "草神", "男主", "女主");
var newList = List.of(list1, list2, list3);
for (var list : newList) {
for (var item : list) {
System.out.println(item);
}
}
}
}
2.HTTP 客户端增强
JDK 11 提供了一个标准化的 HTTP 客户端 API,支持异步和同步请求,并包含对 HTTP/2 和 WebSocket 的原生支持。这使得在 Java 应用程序中进行 HTTP 请求变得更加灵活和高效。
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://www.example.com"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
在这个示例中,我们创建了一个新的 HttpClient 对象,并使用它发送了一个 HTTP GET 请求到指定的 URL。随后,我们可以通过 response.body()
获取服务器返回的响应体内容。
3.支持源文件直接运行(无需javac)
在JDK11中支持源文件直接运行,不用再执行javac命令了:
import java.util.List;
/**
* @author :Nan Yang
* @version :V1.0
* @program :Software
* @date :2024/3/27 0:10
* @description :JDK11新特性
*/
public class VariableDefinitions {
public static void main(String[] args) {
//of静态方法属于JDK9新增
var list1 = List.of(1,2,3,4,5);
var list2 = List.of(6,7,8,9);
var list3 = List.of(1,2,3,4,5,6,7,8,9);
var newList = List.of(list1, list2, list3);
for (var list : newList) {
for (var item : list) {
System.out.println(item);
}
}
}
}
4.FileInputStream的增强
jdk11提供了一个关于FileInputStream文件快速copy的方法,如下图所示:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @author :nan_yang
* @version :V1.0
* @program :Software
* @date :2024/3/27 0:27
* @description :
*/
public class FileStreamDemo {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("D:\\Code\\a.txt");
FileOutputStream fos = new FileOutputStream("D:\\Code\\b.txt");
//快速简单的将a.txt文件内容复制到b.txt
fis.transferTo(fos);
}
}
5.关于FIles类提供的静态方法
Files类提供了一个静态方法readString(),用于快速读取文件的内容;同时也提供了一个静态方法writeString(),用于快速写出一个字符串数据到文件。
/**
* @author :nan_yang
* @version :V1.0
* @program :Software
* @date :2024/3/27 0:36
* @description :
*/
public class FileStaticDemo {
public static void main(String[] args) throws IOException {
Path path = Paths.get("D:\\Code\\a.txt");
String str = Files.readString(path);
System.out.println("读取的内容:" + str);
Path path2 = Paths.get("D:\\Code\\b.txt");
Files.writeString(path2, "大家好,我是八重樱!");
}
}
6.针对String提供的新功能
从jdk11开始,String提供了isBlank(),strip(), stripLeading(), stripTrailing()等方法:
/**
* @author :nan_yang
* @version :V1.0
* @program :Software
* @date :2024/3/27 0:43
* @description :针对String提供的新功能
*/
public class StringDemo {
public static void main(String[] args) {
String str = " ";
//结果为true
boolean blank = str.isBlank();
String str2 = " soft ";
//去掉两端空格
String strip = str2.strip();
System.out.println(strip);
String stripHeader = " soft ";
//去掉头部空格
String stripLeading = stripHeader.stripLeading();
System.out.println(stripLeading);
String stripTrailing = " soft ";
//去掉尾部空格
String stripTrailing2 = stripTrailing.stripTrailing();
System.out.println(stripTrailing2);
//将字符串内容复制5次,组合成新的字符串
String repeat = str2.repeat(5);
System.out.println(repeat);
}
}
进入源码发现比如类似isBlank这样的方法的确实在jdk11开始出现的:
7.针对单列集合以及双列集合的增强
集合提供了快速复制的方法copy()等:
import java.util.List;
import java.util.Map;
/**
* @author :nan_yang
* @version :V1.0
* @program :Software
* @date :2024/3/27 0:56
* @description :针对单列集合以及双列集合的增强
*/
public class ListDemo {
public static void main(String[] args) {
//针对单列集合以及双列集合的增强
var list = List.of("琪亚娜","八重樱","芽衣");
var newList1 = List.copyOf(list);
System.out.println(list);
System.out.println(newList1);
//双列集合
var map = Map.of("琪亚娜","100分","八重樱","110分");
var newMap = Map.copyOf(map);
System.out.println(map);
System.out.println(newMap);
}
}
8.对于Stream的功能扩展
Stream中新增了takeWhile()和dropWhile()截止结算的方法:
import java.util.List;
import java.util.stream.Collectors;
/**
* @author :nan_yang
* @version :V1.0
* @program :Software
* @date :2024/3/27 1:01
* @description :对于Stream的功能扩展
*/
public class StreamDemo {
public static void main(String[] args) {
var list = List.of("琪亚娜","八重樱","芽衣");
// 从集合中删除满足条件的元素,直到不满足为止
var newList = list.stream()
.dropWhile( name -> name.equals("琪亚娜"))
.collect(Collectors.toList());
System.out.println(newList);
// 从集合中获取满足条件的元素,直到不满足为止
var newList2 = list.stream()
.takeWhile( name -> name.equals("琪亚娜"))
.collect(Collectors.toList());
System.out.println(newList2);
}
}
9.对于JDK11出现的新GC(ZGC)
Java 11新增了一个全新的垃圾收集器--ZGC,它由Oracle开发,宣传可以在数TB的堆上具有非常低的暂停时间。
其实在Java10中已经有四种发布多年的垃圾收集器,并且几乎都是无限可调的,那又为什么会新增一个GC呢?换个角度看,G1是2006年时引入Hotspot VM的。当时最大的AWS实例有1 vCPU和1.7GB内存,而今天AWS很乐意租给你一个x1e.32xlarge实例,该类型实例有128个vCPU和3,904GB内存。
ZGC的设计目标是:支持TB级内存容量,暂停时间低(<10ms),对整个程序吞吐量的影响小于15%。将来还可以扩展实现机制,以支持不少令人兴奋的功能,例如多层堆(即热对象置于DRAM和冷对象置于NVMe闪存),或压缩堆。
zgc在进行对象转移的过程中,只需要修改对象指针的几个标志位,相对于g1需要在对象转移时读取对象头来说,少了内存读取的操作,速度更快。不过也正是由于zgc使用了对象指针的几个标志位来完成并发标识和并发转移等的工作,所以zgc不能压缩指针,并且只能运行在基于64位的操作系统上。
zgc的内存区域分成三个页面,小页面2M,中页面32M,大页面2的n次方,而g1页面一般分成2048个region,每个region大小是2M/4M/8M。
10.基于垃圾回收器的 Epsilon 内存分配器
JDK 11 引入了 Epsilon 内存分配器,这是一种实验性的垃圾回收器,适用于对垃圾回收器行为进行压力测试和性能基准测试的场景。Epsilon 内存分配器可用于禁用垃圾收集,从而帮助开发人员更好地理解其应用程序的内存使用情况。
11.其他改进和更新
除了上述新特性外,JDK 11 还包括了诸多其他改进和更新,如对 Lambda 参数的语法支持、新的垃圾收集器接口、动态类文件常量等。这些改进为 Java 平台带来了更好的性能、可维护性和安全性。
通过充分利用 JDK 11 提供的这些新特性,开发人员可以更加高效地编写现代化的 Java 应用程序,并且为未来的发展做好充分准备。希望以上介绍对您有所帮助,欢迎尝试并探索 JDK 11 中更多的功能和改进!