Switch表达式(JEP325)在Java12中,改进了Switch表达式的写法。虽然是语法糖的改进,但也让Switch的代码编写更加优雅。看看Java12之前Switch是怎么写的//通过传入月份,输出该月份所属的季节publicstaticvoidswitchJava12Before(Stringday){switch(day){case"march":case"april":case“可能”:System.out.println(“春天”);休息;案例“六月”:案例“七月”:案例“八月”:System.out.println(“夏季”);休息;案例“九月”:案例“十月”:案例“十一月”:System.out.println(“Autumn");break;case"december":case"january":case"february":System.out.println("winter");break;}}在上面的例子中,通过传入一个月,输出这个月相应的季节。很多代码都是为了简单的功能而写的,每次操作都需要一个break,防止case渗透。使用预览功能由于Switch表达式不是Java12正式发布的功能,目前还处于预览测试阶段,所以如果要使用Java12编译运行,需要开启功能预览参数。当然,如果你使用的是Java14及以上版本,这部分可以直接跳过。#Whencompiling./bin/javac--enable-preview-source12./Xxx.java#Runtime./bin/java--enable-previewXxx如果一个新特性是一个预览功能,那么意味着这个功能可能在Removed在未来的版本中。Java12Switch由于Switch存在上述问题,在Java12中对Switch进行了改进,使其可以按照caseL->的方式进行操作,那么这段代码在Java12中怎么写呢?publicstaticvoidswitchJava12(Stringday){switch(day){case"march","april","may"->System.out.println("spring");case"june","july","august"->System.out.println("summer");case"september","october","november"->System.out.println("autumn");case"december","january","february"->System.out.println("Winter");}}通过测试可以得到预期的输出。这还不够,在Switch的改进中,还支持使用Switch的返回值进行赋值。像这样:Stringseason=switch(day){case"march","april","may"->"spring";case"june","july","august"->"spring";case"september""october","november"->"spring";case"december","january","february"->"spring";default->{//thrownewRuntimeException("dayerror")System.out.println("dayerror");break"dayerror";}};System.out.println("当前季节是:"+season);虽然写的比较简单,但是这些只是语法糖的更新,编译和之前没有太大区别。文件比较Files.mismatch在Java中对文件的操作在Java7中得到了增强,这次Java12带来了文件比较功能。比较两个文件,如果内容相同,则返回-1,如果内容不同,则返回不同的字节起始位置。//创建两个文件PathpathA=Files.createFile(Paths.get("a.txt"));PathpathB=Files.createFile(Paths.get("b.txt"));//写入相同内容的文件。写入(pathA,“abc”.getBytes(),StandardOpenOption.WRITE);Files.write(pathB,“abc”.getBytes(),StandardOpenOption.WRITE);longmismatch=Files.mismatch(pathA,pathB);System.out.println(mismatch);//添加不同的内容Files.write(pathA,"123".getBytes(),StandardOpenOption.APPEND);Files.write(pathB,"321".getBytes(),StandardOpenOption.APPEND);mismatch=Files.mismatch(pathA,pathB);System.out.println(mismatch);//删除创建的文件pathA.toFile().deleteOnExit();pathB.toFile().deleteOnExit();//RESULT//-1//3比较函数的实现可以直接看源码,还是很简单的。CompactNumber的简化数字格式可以直接转换数字显示格式,如1000->1K,1000000->1M。System.out.println("CompactFormattingis:");NumberFormatupvotes=NumberFormat.getCompactNumberInstance(newLocale("en","US"),Style.SHORT);System.out.println(upvotes.format(100));System.out.println(upvotes.format(1000));System.out.println(upvotes.format(10000));System.out.println(upvotes.format(100000));System.out.println(upvotes.format(1000000));//设置小数位数upvotes.setMaximumFractionDigits(1);System.out.println(upvotes.format(1234));System.out.println(upvotes.format(123456));System.out.println(upvotes.format(12345678));可以得到如下输出:1001K10K100K1M1.2K123.5K12.3MJVM相关更新Shenandoah垃圾收集器Java12增加了Shenandoah,一个低暂停垃圾收集器,它可以与Java应用程序中的执行线程一起使用,同时用于收集垃圾进行内容回收,从而减少停顿时间。关于Shenandoah垃圾收集器的更多信息,请参考文档:ShenandoahGC简介。ZGC并发类卸载Z垃圾收集器现在支持类卸载,它通过卸载未使用的类以释放与这些类关联的数据结构来减少应用程序的总体占用空间。因为它是并发执行的,所以不会停止Java应用程序线程的执行,因此对GC暂停时间的影响可以忽略不计。这是默认启用的,但可以使用命令行选项-XX:-ClassUnloading禁用。JVM常量API在包java.lang.invoke.constant中定义了一系列基于值的符号引用,可以用来描述各种可加载的常量。这使得对关键类文件和运行时构建的标称描述进行建模变得更加容易,特别是对于从常量池加载的常量,并允许开发人员更轻松地标准化他们对可加载常量的处理。默认情况下使用类数据共享(CDS)。这不是JDK第一次改进CDS(ClassDataSharing)功能。CDS可以大大提高JVM在同一台机器或虚拟机上启动多个应用程序的速度。其原理是在启动应用程序时共享一些类加载信息,以便在启动新进程时可以使用共享的数据。在Java12之前,该功能需要手动开启,Java12调整为默认开启。微基准测试套件Java12添加了一个新的基于JMH的基本微基准测试套件。.其他更新1.支持Unicode11在Java11支持Unicode10后,Java12支持Unicode11,支持更多表情和符号的操作。
