JDK13: JDK13新功能深度解析

it2025-09-01  35

在此次JDK13中,共更新了5个特性,下面对新特性做介绍。JDK13官方说明

五大新特性

一.表达式switch(二次预览):

switch新特性在JDK12已经进行预览,JDK13中二次预览,使用lamda表达式进行替换。

public class SwitchTest { @Test public void test1(){ Week day=Week.FRIDAY; switch (day){ case MONDAY: case TUESDAY: case WEDNESDAY: System.out.println("星期一或星期二或星期三"); case THURSDAY: case FRIDAY: System.out.println("星期四或星期五"); case SATURDAY: System.out.println("星期六"); case SUNDAY: System.out.println("星期日"); default: throw new IllegalStateException("What day is it today"+day); } } //jdk12新特性 public void test2(){ Week day=Week.FRIDAY; switch (day){ case MONDAY,TUESDAY,WEDNESDAY->System.out.println("星期一或星期二或星期三"); case THURSDAY,FRIDAY->System.out.println("星期四或星期五"); case SATURDAY->System.out.println("星期六"); case SUNDAY->System.out.println("星期日"); default ->throw new IllegalStateException("What day is it today"+day); } String result=switch (day){ case MONDAY,TUESDAY,WEDNESDAY->"星期一或星期二或星期三"; case THURSDAY,FRIDAY->"星期四或星期五"; case SATURDAY->"星期六"; case SUNDAY->"星期日"; default ->throw new IllegalStateException("What day is it today"+day); }; System.out.println(result); } //jdk13新特性 @Test public void text3(){ String text="5"; int num=switch (text){ case "1"->1; case "2"->2; case "3"->3; default -> { System.out.println("default"); yield 4; } }; System.out.println(num); } } enum Week{ MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY; }
二.TextBlocks(预览):

用法:原来使用\n和字符串拼接对文本进行操作。在JDK13后,只要在文本前后添加""",文本会自动按照排列好的顺序进行换行,如下代码所示。

有个小点需要注意,此时text1的长度为65,text2的长度为66,这是因为在result文本后多出了个空格,只要按照Let we see result""",这种写法,长度将相同。

@Test public void text1(){ String text1="This is a text blocks\n"+ "I will test this function\n"+ "Let we see result"; System.out.println(text1); //JDK13 String text2= """ This is a text blocks I will test this function Let we see result """; System.out.println(); System.out.println(text2); System.out.println(text1.length()); System.out.println(text2.length()); }
三.动态CDS档案(动态类数据共享归档):

概念:CDS,是Java12新特性,可以让不同的Java进程贡献一份类元数据,减少内存使用,它还能加快应用的启动速度。而JDK13的这个特性支持在Java application执行之后进行动态archive(存档)。存档类将包括默认的基础层CDS存档中不存在的所有已加载的应用程序和库类。也就是说,在Java 13中再使用AppCDS的时候,就不再需要这么复杂了。

该提案处于目标阶段,旨在提高AppCDS的可用性,并消除用户进行试运行以创建每个应用程序的类列表的需要。

使用示例:

# JVM退出时动态创建共享归档文件:导出jsa java -XX:ArchiveClassesAtExit=hello.jsa -cp hello.jar Hello # 用动态创建的共享归档文件运行应用:使用jsa java -XX:SharedArchiveFile=hello.jsa -cp hello.jar Hello
四.ZGC取消提交未使用的内存(实验特性):

功能:ZGC 是在 JDK 11 中引入的,但是到目前为止它还没有像 G1 垃圾收集器那样将未使用的堆内存返回到操作系统。这个 JEP 解决了这个问题,并且默认启用了这个功能。

五.重新实现旧版套接字API:

功能:新实现的 NioSocketImpl 来替换JDK1.0的PlainSocketImpl。

它便于维护和调试,与 NewI/O (NIO) 使用相同的 JDK 内部结构,因此不需要使用系统本地代码。它与现有的缓冲区缓存机制集成在一起,这样就不需要为 I/O 使用线程栈。 它使用 java.util.concurrent 锁,而不是 synchronized 同步方法,增强了并发能力。新的实现是Java 13中的默认实现,但是旧的实现还没有删除,可以通过设置系统属性jdk.net.usePlainSocketImpl来切换到旧版本。

SocketImpl类

public abstract class SocketImpl implements SocketOptions { private static final boolean USE_PLAINSOCKETIMPL = usePlainSocketImpl(); private static boolean usePlainSocketImpl() { PrivilegedAction<String> pa = () -> NetProperties.get("jdk.net.usePlainSocketImpl"); String s = AccessController.doPrivileged(pa); return (s != null) && !s.equalsIgnoreCase("false"); } /** * Creates an instance of platform's SocketImpl */ @SuppressWarnings("unchecked") static <S extends SocketImpl & PlatformSocketImpl> S createPlatformSocketImpl(boolean server) { if (USE_PLAINSOCKETIMPL) { return (S) new PlainSocketImpl(server); } else { return (S) new NioSocketImpl(server); } }
最新回复(0)