Java 13 它不是一个长久支持(LTS)版本。
重点特性列表:
- 动态应用程序类-数据共享
- 增强 ZGC 释放未使用内存
- Socket API 重构
- Switch 表达式扩展(预览功能)
- 文本块(预览功能)
动态应用程序类-数据共享
JDK5引入了Class-Data Sharing可以用于多个JVM共享class,提升启动速度,最早只支持system classes及serial GC
JDK9对其进行扩展以支持application classes及其他GC算法
java10的新特性JEP 310: Application Class-Data Sharing扩展了JDK5引入的Class-Data Sharing,支持application的Class-Data Sharing并开源出来(以前是commercial feature)
JDK11将-Xshare:off改为默认-Xshare:auto,以更加方便使用CDS特性
JDK12的341: Default CDS Archives即在64-bit平台上编译jdk的时候就默认在${JAVA_HOME}/lib/server目录下生成一份名为classes.jsa的默认archive文件(大概有18M)方便大家使用
JDK13的这个特性支持在Java application执行之后进行动态archive
导出jsa:
java -XX:ArchiveClassesAtExit=hello.jsa -cp hello.jar Hello
使用jsa:
java -XX:SharedArchiveFile=hello.jsa -cp hello.jar Hello
增强 ZGC 释放未使用内存
暂时无..
Switch 表达式扩展(预览功能)
在 Java 12 中引入了 Switch
表达式作为预览特性,而在 Java 13 中对 Switch
表达式做了增强改进,在块中引入了 yield
语句来返回值,而不是使用 break
。这意味着,Switch
表达式(返回值)应该使用 yield
,而 Switch
语句(不返回值)应该使用 break
,而在此之前,想要在 Switch
中返回内容,还是比较麻烦的,只不过目前还处于预览状态。
在 Java 13 之后,Switch
表达式中就多了一个关键字用于跳出 Switch
块的关键字 yield
,主要用于返回一个值,它和 return
的区别在于:return
会直接跳出当前循环或者方法,而 yield
只会跳出当前 Switch
块,同时在使用 yield
时,需要有 default
条件。
在 Java 12 之前,传统 Switch
语句写法为:
String day = "march";
switch (day) {
case "march":
case "april":
case "may":
System.out.println("春天");
break;
case "june":
case "july":
case "august":
System.out.println("夏天");
break;
case "september":
case "october":
case "november":
System.out.println("秋天");
break;
case "december":
case "january":
case "february":
System.out.println("冬天");
break;
}
在 Java 12 之后,关于 Switch 表达式的写法改进为如下:
String day = "march";
String data = switch (day) {
case "march", "april", "may" -> "春天";
case "june", "july", "august" -> "夏天";
case "september", "october", "november" -> "秋天";
case "december", "january", "february" -> "冬天";
default -> "dayError";
};
System.out.println("当前季节是:" + data);
而在 Java 13 中,value break
语句不再被编译,而是用 yield
来进行值返回,上述写法被改为如下写法:
String day = "march";
String data = switch (day) {
case "march", "april", "may":
yield "春天";
case "june", "july", "august":
yield "夏天";
case "september", "october", "november":
yield "秋天";
case "december", "january", "february":
yield "冬天";
default:
yield "unknown";
};
System.out.println("当前季节是:" + data);
文本块(预览功能)
在 Java 13 之前,多行字符串写法为:
String html ="<html>\n" +
" <body>\n" +
" <p>Hello, World</p>\n" +
" </body>\n" +
"</html>\n";
String json ="{\n" +
" \"name\":\"glj\",\n" +
" \"age\":25\n" +
"}\n";
在 Java 13 引入文本块之后,写法为:
String html = """
<html>
<body>
<p>Hello, World</p>
</body>
</html>
""";
String json = """
{
"name":"glj",
"age":25
}
""";