实例工厂方法(JDK9)
借助JDK9的一项新功能,即集合工厂方法,我们可以轻松地使用预定义的数据创建不可变的集合。只需要在特定集合类型上使用of方法。
List<String> list = List.of("A", "B", "C");
Map<Integer, String> map = Map.of(1, "A", 2,"B", 3, "C");
Set<String> set = Set.of("A", "B", "C");
而在JDK9之前,我们想要创建一个不可变的集合,需要先创建一个可变集合,然后使用 unmodifiableSet 创建不可变集合。
public List<String> getUnmodifiableList() {
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
return Collections.unmodifiableList(list);
}
改进 try-with-resources(JDK9)
JDK 9 中不需要在 try 中额外定义一个变量,JDK 9 之前需要这样使用 try-with-resources:
FileInputStream inputStream = new FileInputStream("D:\\aa.txt");
try (InputStream in = inputStream) {
in.read();
} catch (IOException e) {
e.printStackTrace();
}
在 Java 9 中可以在try中直接使用 inputStream 变量
,不需要再额外定义新的变量了。
FileInputStream inputStream = new FileInputStream("D:\\aa.txt");
try (inputStream) {
inputStream.read();
} catch (IOException e) {
e.printStackTrace();
}
String 底层存储结构更换(JDK9)
JDK8 之前 String 的底层结构类型都是 char [] , 但是 JDK9 就替换成 byte [] 这样来讲,更节省了空间和提高了性能。
之所以替换是因为 之前一直是最小单位是一个 char,用到两个 byte, 但是 JDK8 是基于 latin1 的,而这个 latin1 编码可以用一个 byte 标识,所以当你数据明明可以用到一个 byte 的时候,我们用到了一个最小单位 chat 两个 byte,就多出了一个 byte 的空间。所以 JDK9 在这一方面进行了更新,现在的 JDK9 是基于 ISO/latin1/Utf-16 ,latin1 和 ISO 用一个 byte 标识,UTF-16 用两个 byte 标识,JDK9 会自动识别用哪个编码,当数据用到 1byte,就会使用 iSO 或者 latin1 ,当空间数据满足 2byte 的时候,自动使用 utf-16, 节省了很多空间。
同理,StringBuilder StringBuffer 也更换了底层数据结构
局部变量的自动类型推断(var)(JDK10)
var sss = "Hello,JDK 10";
System.out.println(sss);
JDK 10 带来了一个很有意思的语法var,它可以自动推断局部变量的类型,以后再也不用写类型了,也不用靠 lombok 的 var 注解增强了
不过这个只是语法糖,编译后变量还是有类型的,使用时还是考虑下可维护性的问题,谨慎使用。强调一下,var 关键字目前只能用于局部变量以及 for 循环变量声明中。
文本块(Text Block)(JDK13)
文本块是多行字符串文字,它避免使用转义序列,并以可预测的方式自动设置字符串格式。它还使开发人员可以控制字符串的格式。从JDK 13开始,文本块可用作预览功能。它们以三个双引号("""
)开头,可以轻松地创建和格式化JSON消息。
String ss = """
{
"id": "123",
"name": "zhangsan"
}
""";
JDK 13之前的相同JSON字符串要复杂得多。
String ss = "{\n" +
" \"id\": \"123\",\n" +
" \"name\": \"zhangsan\"\n" +
"}";
ZGC(JDK15)
学习中......