Bootstrap

Java 12&Java 13新特性概述

一、Java 12

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

更多内容读者可自行阅读: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(10000000));//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(10000000));//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日发布。主要特性如下:

更多内容读者可自行阅读: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:希望对大家有所帮助,如果有纰漏或者更好的想法,请您一定不要吝啬你的赐教🙋。 

;