Java 12&Java 13新特性概述

Java 12&Java 13新特性概述发布于 2019 年 3 月 19 日

大家好,欢迎来到IT知识分享网。

一、Java 12

发布于2019年3月19日。Java 12主要新特性如下:

  • JEP 189:Shenandoah: A Low-Pause-Time Garbage Collector (Experimental) Shenandoah:低暂停时间垃圾收集器(实验特性)
  • JEP 325:Switch Expressions (Preview) Switch表达式(一次预览)
  • String类新增API。
  • Files类新增API。
  • NumberFormat类新增大数格式化方法。
  • Collectors类新增API。

更多内容读者可自行阅读:OpenJDK Java 12官方文档

1.1 JEP 189:Shenandoah:低暂停时间垃圾收集器(实验特性)

Java 12引入Shenandoah垃圾回收器,一个专门用来处理大堆的低延迟垃圾回收器,性能几乎和ZGC相同(目标是99.9%的暂停时间小于10ms),不同的是ZGC是openJDK开发的,Shenandoah则是由RedHat开发的。

Shenandoah使用了一种用于并发压缩堆时维护对象引用的技术(布鲁克斯指针)。这种技术允许收集器在压缩堆时并行地移动对象,而不必暂停应用程序,这就允许Shenandoah能够在应用线程运行的同时进行垃圾回收,从而减少停顿,还有最重要的一点是暂停时间于堆大小无关,无论是200M或者200G的堆,暂停时间都一样。

ps:Java 15″转正”。

1.2 JEP 325:Switch表达式(一次预览)

ps:Java 14″转正”。

老的switch语句存在的问题:

  • fall-through行为:在忘记写break语句的情况下,switch语句会从一个case穿透到下一个case。
  • 代码冗余:每个case都需要重复类型的代码结构。

Java 12引入全新的switch表达式:

  • 引入了”->”操作符,用于替代传统的冒号,并且使用”->”的case分支可以防止穿透,就不用写break了。
  • case可以多值匹配,用”,”分割即可
  • 支持返回值。

举个例子:判断一周中某一天是工作日还是休息日

public static String swicthDay(String x){    //老switch    String type;    switch (x) {        case "Monday":        case "Tuesday":        case "Wednesday":        case "Thursday":        case "Friday":            type = "WorkDay";            break;        case "Saturday":        case "Sunday":            type = "FreeDay";        default:            type = "noDay";            break;   } ​    //Java 12    type = switch (x){        case "Monday","Tuesday","Wednesday","Thursday","Friday"->"WorkDay";        case "Saturday","Sunday"->"FreeDay";        default -> "noDay";   };        return type; }

1.3 新增String API

Java 12又String类进行了增强,新增了三个方法:

  • indent(int n):用于调整字符串缩进,如果n是正数则在每行前面添加相应空格数量,如果是负数则缩进。
  • transform(Function<? super String,? extend R> f):接收一个函数作为参数,对字符串进行转换,并返回结果,可以干任何事。
  • describeConstable()和resolveConstantDesc():这两个方法需要于常量一起用,使用场景不多。

来个Demo:

public static void main(String[] args) {    //1、indent(int n)    //在每行前面加3个空格    String indent = "hello".indent(3);//   hello    //在每行前面缩进1个空格    String indent1 = " hello".indent(-1);// hello ​    //2、transform(Function<? super String,? extend R> f)    String str="hello";    String transform = str.transform(String::toUpperCase);//HELLO ​    //3、describeConstable()和resolveConstantDesc()    Optional<String> s = str.describeConstable(); }

1.4 新增Files API

Java 12又给Files增加了一个方法:mismatch(Path,Path),用于比较两个文件的内容,如果不相同,则返回两个文件内容第一次不匹配的位置索引,如果相同则返回-1:

public static void main(String[] args) throws IOException {    Path path = Paths.get("/home/file.txt");    Path path1 = Paths.get("/home/file1.txt");    long mismatch = Files.mismatch(path, path1);    if(mismatch == -1){        System.out.println("俩完全一致");   }else {        System.out.println("不一致,index:"+mismatch);   } }

1.5 新增NumberFormat对大数的格式化

为了能够更简洁的显示大数字,NumberFormat新增了对大数格式化的API:

public static void main(String[] args) {    //美国    NumberFormat usFormat = NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT);    System.out.println(usFormat.format(1000));//1K    System.out.println(usFormat.format(10000));//10K    System.out.println(usFormat.format());//10M    //中国    NumberFormat cnFormat = NumberFormat.getCompactNumberInstance(Locale.CHINA, NumberFormat.Style.SHORT);    System.out.println(cnFormat.format(1000));//1,000    System.out.println(cnFormat.format(10000));//1万    System.out.println(cnFormat.format());//1000万 ​ }

1.6 新增Collectors API

Java 12引入了Collectors.teeing(),进一步加强了Stream流的处理功能,teeing()可以对一个流进行两种不同的收集操作,并将两种结果合并为一个,我们来看个例子:

public static void main(String[] args) {    List<Integer> list = Arrays.asList(1, 2, 5, 7, 9);    //以前写法,需要两个流分别计算    //最小值:1    Integer min = list.stream().min(Integer::compareTo).get();    //最大值:9    Integer max = list.stream().max(Integer::compareTo).get(); ​    //Java 12:一个流就可以处理    Map<String, Optional<Integer>> result = list.stream()           .collect(Collectors.teeing(                    Collectors.maxBy(Integer::compareTo),                    Collectors.minBy(Integer::compareTo),                   (v1, v2) -> Map.of("max", v1, "min", v2)));    //最大值:9 最小值:1    System.out.println("最大值:"+result.get("max").get()+" 最小值:"+result.get("min").get()); }

二、Java 13

Java 13于2019年9月17日发布。主要特性如下:

  • JEP 354:Switch Expressions (Preview) Switch表达式(预览)
  • JEP 355:Text Blocks (Preview) 文本块(预览版)
  • Socket API重构。
  • FileSystems新增API。

更多内容读者可自行阅读:OpenJDK Java 13官方文档

2.1 JEP 354:Switch表达式增强(二次预览)

Java 13引入了yield关键字来处理多分支中的返回值:

 public static String swicthDay(String x){        String type;        //Java 12:如果加一个if判断分支,那就不能用->直接返回了        switch (x){            case "Monday","Tuesday","Wednesday","Thursday","Friday"->type="WorkDay";            case "Saturday","Sunday"->type="FreeDay";            default -> {                if(x.isEmpty()){                   type="null";               }else {                    type="noDay";               }           }       }; ​        //java 13:可以用yield直接返回        type = switch (x){            case "Monday","Tuesday","Wednesday","Thursday","Friday"->"WorkDay";            case "Saturday","Sunday"->"FreeDay";            default -> {                if(x.isEmpty()){                    yield "null";               }else {                    yield "noDay";               }           }       };        return type;   }

2.2 JEP 355:文本块(一次预览)

ps:Java 15转正

Java中的字符串定义必须以双引号开始双引号结束,并且换行都依赖于换行符转移(”\n”),这样编辑起来比较复杂。

Java 13引入了文本块,用于简化在Java中编写多行文本字符串,特别是那些包含大量格式化文本的字符串,比如HTML、XML等。

文本块是通过三个双引号(“””)定义的:

public static void main(String[] args) {    //传统的写法    String xml="<?xml version=\"1.0\" encoding=\"UTF-8\"?> \n" +            "<catalog> \n" +            "   <book> \n" +            "       <title>XML Developer's Guide</title> \n" +            "       <author>John Doe</author> \n" +            "       <price>44.95</price> \n" +            "   </book> \n" +            "</catalog> \n" +            "\n";    //文本块    String xml1= """            <?xml version="1.0" encoding="UTF-8"?>            <catalog>                <book>                    <title>XML Developer's Guide</title>                    <author>John Doe</author>                    <price>44.95</price>                </book>                <book>                    <title>Midnight Rain</title>                    <author>Jane Doe</author>                    <price>5.95</price>                </book>            </catalog>            """; }

看上去可读性、简洁性比传统的好多了。

2.3 重构Socket API

Java 13对Socket进行了重构,主要改进有以下几点:

  • 新的API设计:重新设计了Socket API。
  • 性能优化:对底层实现进行了优化,提高了数据传输的效率。
  • 易用性改进:新API更易于使用,简化了许多常见的网络任务。
  • 安全性增强:强化了对安全性的支持,包括更好的加密功能和对安全协议的支持。
  • 更好的资源管理:改进了对网络资源(如套接字和连接)的管理,包括自动资源管理和资源泄漏预防机制。

2.4 FileSystems新增API

FileSystems类主要添加了以下三种新方法:

  • public static FileSystem newFileSystem(Path path) throws IOException
  • public static FileSystem newFileSystem(Path path, Map<String,?> env) throws IOException
  • public static FileSystem newFileSystem(Path path, Map<String,?> env, ClassLoader loader) throws IOException

End:希望对大家有所帮助,如果有纰漏或者更好的想法,请您一定不要吝啬你的赐教🙋。 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/114539.html

(0)
上一篇 2025-12-08 13:45
下一篇 2025-12-08 14:10

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信