一、Java 12
发布于2019年3月19日。Java 12主要新特性如下:
JEP 189:Shenandoah: A Low-Pause-Time Garbage Collector (Experimental) Shenandoah:低暂停时间垃圾收集器(实验特性)
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(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日发布。主要特性如下:
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:希望对大家有所帮助,如果有纰漏或者更好的想法,请您一定不要吝啬你的赐教🙋。