Java SE 13 新增特性
Java SE 13 新增特性
作者:Grey
原文地址:Java SE 13 新增特性
源码
镜像仓库: GitCode:java_new_features
新版 Switch 使用方式
switch语句增加了 yield 关键字表示返回值,这个特性在Java SE 13中是预览特性,在Java SE 14正式引入。代码如下:
注:如果你用Java SE 12运行上述代码,需要指定--enable-preview参数,如果使用 Intellij IDEA ,参考How to Enable Java Preview Features and Run Code from IntelliJ IDEA
package git.snippets.jdk13;
/**
* switch yield功能
* jdk13 实验性功能
* 到jdk14 正式使用
* @author <a href="mailto:410486047@qq.com">Grey</a>
* @date 2021/11/29
* @since 13
*/
public class SwitchYield {
public static void main(String[] args) {
String t = test("apple");
System.out.println(t);
String m = test("abc");
System.out.println(m);
}
private static String test(String c) {
return switch (c) {
case "apple", "Apple":
yield "苹果";
case "banana":
yield "香蕉";
default:
yield "无法识别";
};
}
}
输出结果
苹果
无法识别
文本块(预览功能)
为了定义一个多行字符串,我们习惯于使用转义序列来处理字符串中包含的换行和双引号。例如,一个SQL语句看起来像这样
String sql =
"SELECT id, firstName, lastName FROM Employee\n"
+ "WHERE departmentId = \"IT\"\n"
+ "ORDER BY lastName, firstName";
String content = "{\n"
+ " \"upperSummary\": null,\n"
+ " \"sensitiveTypeList\": null,\n"
+ " \"gmtModified\": \"2011-08-05 10:50:09\",\n"
+ " \"lowerGraph\": null,\n"
+ " \"signature\": \"\",\n"
+ " \"appName\": \"xxx\",\n"
+ " \"lowerSummary\": null,\n"
+ " \"gmtCreate\": \"2011-08-05 10:50:09\",\n"
+ " \"type\": \"CALL\",\n"
+ " \"name\": \"xxxx\",\n"
+ " \"subType\": \"yyy\",\n"
+ " \"id\": 1,\n"
+ " \"projectId\": 1,\n"
+ " \"status\": 1\n"
+ "}";
JDK Enhancement Proposal 355允许我们以更可读的方式编写这样的字符串。
String sql = """
SELECT id, firstName, lastName FROM Employee
WHERE departmentId = "IT"
ORDER BY lastName, firstName""";
String content2 = """
{
"upperSummary": null,
"sensitiveTypeList": null,
"gmtModified": "2011-08-05 10:50:09",
"lowerGraph": null,
"signature": "",
"appName": "xxx",
"lowerSummary": null,
"gmtCreate": "2011-08-05 10:50:09",
"type": "CALL",
"name": "xxxx",
"subType": "yyy",
"id": 1,
"projectId": 1,
"status": 1
}
""";
文本块在Java SE 13属于预览功能,在Java SE 15中正式启用
Socket API 新实现方式
java.net.Socket 和 java.net.ServerSocket 类早在 Java 1.0 时就已经引入了,它们的实现的 Java 代码和 C 语言代码的混合,维护和调试都十分不易;而且这个实现还存在并发问题,有时候排查起来也很困难。
因此,在 Java 13 中引入了新的实现方式,使用了新的实现 NioSocketImpl 来代替老旧的 PlainSocketImpl 实现。用户随时可以通过 -Djdk.net.usePlainSocketImpl 参数切换回老的实现方式,以兼容意外情况。代码如下
package git.snippets.jdk13;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 新版Socket API 使用了新的实现 NioSocketImpl 来代替老旧的 PlainSocketImpl 实现。
* 需要增加-XX:+TraceClassLoading参数
*
* @author <a href="mailto:410486047@qq.com">Grey</a>
* @date 2022/8/20
* @since 13
*/
public class NewSocketAPI {
public static void main(String[] args) {
try (ServerSocket serverSocket = new ServerSocket(8000)) {
boolean running = true;
while (running) {
Socket clientSocket = serverSocket.accept();
//do something with clientSocket
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用 Java 13 运行,通过参数 -XX:+TraceClassLoading 追踪加载的类,日志中可以看到 NioSocketImpl。
[0.099s][info ][class,load] java.util.Properties$LineReader source: shared objects file
[0.099s][info ][class,load] java.io.FileInputStream$1 source: shared objects file
[0.100s][info ][class,load] sun.net.PlatformSocketImpl source: jrt:/java.base
[0.100s][info ][class,load] sun.nio.ch.NioSocketImpl source: jrt:/java.base
[0.100s][info ][class,load] sun.nio.ch.NativeDispatcher source: jrt:/java.base
[0.100s][info ][class,load] sun.nio.ch.SocketDispatcher source: jrt:/java.base
但在 Java 12 并不是 NioSocketImpl。
[0.120s][info ][class,load] java.util.concurrent.ConcurrentSkipListMap$Node source: shared objects file
[0.120s][info ][class,load] java.net.SocketImpl source: jrt:/java.base
[0.120s][info ][class,load] java.net.AbstractPlainSocketImpl source: jrt:/java.base
[0.120s][info ][class,load] java.net.PlainSocketImpl source: jrt:/java.base
[0.120s][info ][class,load] java.net.SocksSocketImpl source: jrt:/java.base
ZGC: 取消提交未使用的内存
ZGC 是 Java SE 11 中引入的一个实验性垃圾收集器,它承诺在10毫秒或更短的时间内实现 stop-the-world 。
JDK Enhancement Proposal 351扩展了 ZGC 的功能,以便在特定时间后将未使用的堆内存返回给操作系统。
使用-XX:ZUncommitDelay,你可以指定ZGC返回未使用内存的时间,单位是秒。默认情况下,这个值是300秒。
该功能默认是启用的,可以用-XX:-ZUncommit来禁用。
ZGC 将在 Java SE 15 中达到生产状态。
动态 CDS 档案
Java SE 10 中引入了应用类数据共享--一个允许创建所谓共享存档文件的功能。这个文件包含了所使用平台的 JVM 所要求的二进制形式的应用类。该文件通过内存映射的 I/O 映射到 JVM 的内存中。
直到现在,创建这个文件还相对复杂。首先,我们必须在应用程序的测试运行期间转储一个类列表。只有在第二步,我们才能从这个列表中生成共享档案。
java -Xshare:off -XX:+UseAppCDS
-XX:DumpLoadedClassList=helloworld.lst
-cp target/helloworld.jar eu.happycoders.appcds.Main
java -Xshare:dump -XX:+UseAppCDS
-XX:SharedClassListFile=helloworld.lst
-XX:SharedArchiveFile=helloworld.jsa
-cp target/helloworld.jar
JDK Enhancement Proposal 350简化了这个过程。从 Java SE 13 开始,你可以指定-XX:ArchiveClassesAtExit参数,在应用程序执行结束时生成共享存档。不再需要额外的参数-Xshare:on和-XX:+UseAppCDS了。
java -XX:ArchiveClassesAtExit=helloworld.jsa
-cp target/helloworld.jar eu.happycoders.appcds.Main
创建的共享存档也比以前小得多。因为它现在只包含应用程序的类。
从 Java SE 13 开始,共享存档的使用方法如下。
java -XX:SharedArchiveFile=helloworld.jsa
-cp target/helloworld.jar eu.happycoders.appcds.Main
更多
参考资料
official Java 13 Release Notes
Java 13 Features (with Examples)
Java ByteBuffer Example: How to Use flip() and compact()
Application Class-Data Sharing
Java SE 13 新增特性的更多相关文章
- Java SE 8 新增特性
Java SE 8 新增特性 作者:Grey 原文地址: Java SE 8 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new_ ...
- Java SE 9 新增特性
Java SE 9 新增特性 作者:Grey 原文地址: Java SE 9 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new_ ...
- Java SE 14 新增特性
Java SE 14 新增特性 作者:Grey 原文地址:Java SE 14 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...
- Java SE 15 新增特性
Java SE 15 新增特性 作者:Grey 原文地址:Java SE 15 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...
- Java SE 10 新增特性
Java SE 10 新增特性 作者:Grey 原文地址:Java SE 10 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...
- Java SE 11 新增特性
Java SE 11 新增特性 作者:Grey 原文地址:Java SE 11 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...
- Java SE 12 新增特性
Java SE 12 新增特性 作者:Grey 原文地址:Java SE 12 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...
- Java SE 16 新增特性
Java SE 16 新增特性 作者:Grey 原文地址:Java SE 16 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...
- Java SE 17 新增特性
Java SE 17 新增特性 作者:Grey 原文地址:Java SE 17 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...
随机推荐
- iview 酸爽debug: subMenu默认选中无效的解决方法
一. 在iview中写一个submenu <Col span="3" type="flex" v-if="showCids"> ...
- Java内存分析——JavaSE基础
内存分析 堆:存放new的对象和数组,可以被所有线程共享,不会存放别的对象引用 栈 存放基本变量类型(会包含这个基本类型的具体数值) 引用对象的变量(会存放这个引用在堆里的具体地址) 方法区(属于堆的 ...
- python中collections.OrderedDict()
import collections #from collections import OrderededDict my_orderDict=collections.OrderedDict(house ...
- 10分钟快速部署camunda BPM开源版
安装部署Camunda BPM有多种方式,基于Camunda独立web应用程序安装部署是最简单的一种方式,您只需要有tomcat即可. 本文档将指导您安装和配置Camunda独立web应用程序,快速体 ...
- 关于缓存一致性协议、MESI、StoreBuffer、InvalidateQueue、内存屏障、Lock指令和JMM的那点事
前言 事情是这样的,一位读者看了我的一篇文章,不认同我文章里面的观点,于是有了下面的交流. 可能是我发的那个狗头的表情,让这位读者认为我不尊重他.于是,这位读者一气之下把我删掉了,在删好友之前,还叫我 ...
- redis击穿,穿透,雪崩,分布式锁,api(jedis,luttuce)
击穿:(redis做缓存用,肯定发生了高并发,到达数据库查询) 设置key 的过期时间,过期后没有这个key,找不到了,就穿过了(其中一个key过期导致并发访问数据库) LRU (LRU,即:最近最少 ...
- Tensor的向量化
向量化操作是指可以在同一时间进行批量地并行计算,例如矩阵运算,以达到更好效率的一种方式. 尽量使用向量化直接对Tensor操作,避免低效率的for循环对元素逐个操作.
- SpringBoot的浅浅配置和小整合
SpringBoot的浅浅配置和小整合 本文如题,就是浅浅记录一下学习的过程中一些过程,比较简单,并没有多少深度.谢谢! SpringBoot创建 从IDEA中新建项目或者模块.注意jdk版本,一般不 ...
- 想知道Vue3与Vue2的区别?五千字教程助你快速上手Vue3!
从Vue3发布以来,我就一直对其非常感兴趣,就一直想着将其投入公司的生产中,但是开始考虑到很多不确定性就暂时对一些很小的功能进行一些尝试:慢慢的发现组合式Api的形式非常适合开发(个人感觉),尤其是V ...
- WPF开发随笔收录-心电图曲线绘制
一.前言 项目中之前涉及到胎儿心率图曲线的绘制,最近项目中还需要添加心电曲线和血样曲线的绘制功能.今天就来分享一下心电曲线的绘制方式: 二.正文 1.胎儿心率曲线的绘制是通过DrawingVisual ...