1

介绍

1996年一月份诞生了Java1.0,到今年9月份java13问世,Java已经走过了23年的路程,这其中Java5具有里程碑的意义,我们现在使用的Java的新特性都是基于java5的,这里主要介绍Java13的新特性。

Java13的新特性主要有5的方面:

java中switch能嵌套吗 java switch yield_Java

翻译成中文:

350:动态CDS档案

351:ZGC:取消提交未使用的内存

353:重新实现旧版套接字API

354:switch表达式(预览)

355:文字块(预览)

2

新特性

354 switch表达式引入yield

先看一个Java8中的例子:

@Test
    public void testSwitch(){
        int i=10;
        int num=0;
        switch (i){
            case 1:
                num=10;
                break;
            case 2:
                num=20;
                break;
            case 10:
                num=100;
                break;
        }
        System.out.println(num);
    }

这道题最终的结果为:100

在Java13中的新写法,引入yield代替break

@Test
    public void test13(){
        int i=10;
        int num = switch (i) {
            case 1:
                yield 10;
            case 2:
                yield 20;
            case 10:
                yield 100;
           default:
                yield 0;
        };
        System.out.println(num);
    }

但是yield和return并不一样,return是结束某一个方法,而yield只是结束switch结构。

355:文字块(预览)

比如说这样一段html代码:

<html>
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <p>66666666666666</p>
    
    <iframe src="1.html" width="600" height="800"></iframe>
  </body>
</html>

在web开发时,如果我们把这个拼接到Java代码中,如下:

@Test
    public void testText(){


        String html="<html>\n" +
                "\t<head>\n" +
                "\t\t<meta charset=\"utf-8\">\n" +
                "\t\t<title></title>\n" +
                "\t</head>\n" +
                "\t<body>\n" +
                "\t\t<p>66666666666666</p>\n" +
                "\t\t\n" +
                "\t\t<iframe src=\"1.html\" width=\"600\" height=\"800\"></iframe>\n" +
                "\t</body>\n" +
                "</html>";


        System.out.println(html);
    }

当我们把这些代码复制进去的时候,编译器会自动帮我们换行转义,我们可能会觉得还是很方便,但是当我们去阅读的时候,却发现可读性很差。

但是在Java13中,三个双引号开始,三个双引号结束,如下效果:

String html="""
   <html>
     <head>
     <meta charset="utf-8">
     <title></title>
    </head>
    <body>
    <p>66666666666666</p>
    <iframe src="1.html" width="600" height="800"></iframe>
    </body>
  </html>                   
  """
  System.out.println(html);

结果是一样的,但是可读性上差距谁不是很大,除此之外还有sql语句。

String sql="select id,name, phone, email\n" +
                "from t_sysuser\n" +
                "where id (50,60,70)\n" +
                "ORDER BY id ASC;";

使用jdk13新特性:

String sql="""
  select id,name, phone, email
  from t_sysuser
  where id (50,60,70)
  ORDER BY id ASC;
 """;

这个新特性的主要作用就是避免对特殊字符的转义,简化Java程序,同时增强代码的可读性。

关于文本块的写法要注意几点:

文本块是一个两行的代码,如:

String s="""
        123""";

文本块可以表示空串,可要写在两行,如:

String str="""
""";

上述片段等价于,如下:

String st="";

长度都是0;

但是下面两段代码呢?

String str="""
123
""";
 String st="123";

结果为:4和3,原因是有终止符。

353:重新实现旧版套接字API

为什么要重写?

在java.net.Socket和java.net.ServerSocketAPI,以及它们的底层实现,可以追溯到JDK 1.0。该实现是传统Java和C代码的混合,很难维护和调试。该实现使用线程堆栈作为I / O缓冲区,这种方法需要多次增加默认线程堆栈的大小。该实现使用本机数据结构来支持异步关闭,这是多年来的可靠性和移植问题的来源。该实现还存在一些并发问题,需要进行大修才能正确解决。

新实现了什么?

新的实现NioSocketImpl是的直接替代PlainSocketImpl。它被开发为易于维护和调试。它与新I / O(NIO)实现共享相同的JDK内部基础结构,因此不需要自己的本机代码。它与现有的缓冲区缓存机制集成在一起,因此不需要将线程堆栈用于I / O。它使用java.util.concurrent锁而不是synchronized方法,以便将来可以与光纤配合使用。在JDK 11中,大多数NIO SocketChannel和其他SelectableChannel实现都是在实现相同目标的情况下重新实现的。

350:动态CDS存档

目标:

  • 提高应用程序类数据共享(AppCDS)的可用性。消除了用户进行试运行以为每个应用程序创建类列表的需求。
  • -Xshare:dump选项使用类列表启用的静态归档应继续工作。这包括内置类加载器和用户定义的类加载器的类。

351:ZGC:取消提交未使用的内存

ZGC当前不会取消提交并将内存返回给操作系统,即使该内存已经使用了很长时间也是如此。对于所有类型的应用程序和环境,尤其是那些关注内存占用的应用程序和环境,此行为都不是最佳的。例如:

  • 通过使用付费资源的容器环境。
  • 应用程序可能长时间处于空闲状态并与许多其他应用程序共享资源或竞争资源的环境。
  • 应用程序在执行过程中可能会有非常不同的堆空间要求。例如,在启动过程中所需的堆可能会比在稳态执行过程中以后需要的堆大。

HotSpot中的其他垃圾收集器(例如G1和Shenandoah)今天提供了此功能,某些类别的用户发现它非常有用。同一组用户将欢迎将此功能添加到ZGC。