大家好,欢迎来到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