篇章三 数据结构——前置知识(三)
目录
1.JDK17 语法新增特性
1.1 yield关键字
1.2 var关键字
1.为什么使用var?
2.注意事项
1.3 异常改进
1.4 密封类
1.总结用法
1.1 sealed 修饰的类
1.2 non-sealed 修饰
1.3 permits
1.5 接口中的私有方法
1.6 instanceof
1.7 其他
1.JDK17 语法新增特性
1.1 yield关键字
其实就是一个语法糖
yield关键字从Java13 开始引入。用于从 case 代码块中返回值。
正常的switch语句:
String data = "one";
int result = 0; // 接收数据的返回值
switch (data) {case "one":result = 1;// 为 result 重新赋值break;case "two":result = 2;// 为 result 重新赋值break;default:result = -1;// 为 result 重新赋值
}
System.out.println(result);
简化后的switch:
String data = "two";
int result = switch (data) {case "one" -> 1;case "two" -> 2;default -> -1;
};
System.out.println(result);
如果不想使用 指向符 -> 可以使用 :yield 来代替:
String data = "two";
int result = switch (data) {case "one" :yield 1;case "two" :yield 2;default :yield -1;
};
System.out.println(result);
1.2 var关键字
从Java10开始,var被引入
var name = "zhangsan";
var age = 10;
上述代码,编译器会自动判断出name是一个String类型,age是一个int类型。
1.为什么使用var?
使用 var 可以使代码更简洁。
有时候,类型名称可能会非常长,例如泛型。
var就像似一个简化器,让你不必反复写出繁琐的类型名。
public static void main(String[] args) {Map<String, List<Map<Integer, String>>> complexMap = new HashMap<String, List<Map<Integer, String>>>();var complexMap = new HashMapMap<String, List<Map<Integer, String>>>();
}
2.注意事项
1.不能使用 var 来声明字段
2.不能使用 var 来声明方法参数
3.不能使用 var 来声明方法返回类型
4.var 声明变量必须初始化, 但是不能初始化为 null
一句话: 只能用于局部变量 还得初始化 并且不能初始化为 null
1.3 异常改进
效果:出现异常的具体方法和原因一目了然。
如果你的一行代码有多个方法或多个变量,可以快速定位问题所在。
如果是 JDK1.8 有些情况不太容易看出来。
JDK17改进后效果如下图:
1.4 密封类
密封类一般应用在类和接口中,对接口和类 的 实现和继承 进行约束。
以前主要使用关键字 final。
当这个类 被 final 修饰了,被修饰的类就变成完全封闭的状态了,所有类都没办法继承。
现在JDK17提供了一个新的关键字:sealed。
密封类可以被该关键字修饰 并且 在声明末尾用 permits 表示要开放给哪些类型。
下述代码 Animal 为密封类,然后使用 permits 关键字, 把继承权限开放给了 Dog 类。
sealed class Animal permits Dog {public String name;public int age;public void eat() {System.out.println("eat() ......");}
}non-sealed class Dog extends Animal {public void eat() {System.out.println(this.name + "正在吃狗粮......");}
}
1.总结用法
1.1 sealed 修饰的类
必须要有 子类
提示:Sealed class must have subclasses ,此时 Dog 被 sealed 修饰,那么 Dog 必须要有子类。
1.2 non-sealed 修饰
表示不限制,任何类都可以继承。
提示:此类必须被 Animal 类 允许
1.3 permits
未被 permits 允许的类型,则没办法继承。(契合上面 1.2 的 此类必须被 Animal 类 允许)
1.5 接口中的私有方法
JDK8 接口中可以有默认方法。
JDK9 接口中可以有私有方法。
1.6 instanceof
if (obj instanceof String) {String str = (String) obj;...
}
上面的 instanceof 语法 一共做了三件事
1.判断是否为 String 类型
2.如果是,转成 String 类型
3.创建一个名为 str 的临时变量
在 JDK 16 中,使用 模式匹配思想 改进了 instanceof 用法,可以做到如下优化效果:
if (obj instanceof String str) { // obj 是否为String类型,如果是创建临时变量 str
}
1.7 其他
1. ZGC-新一代垃圾回收器,G1垃圾回收器相关的内容等
2. record类的使用
3. Stream API 的部分改进
4. HttpClient 重写了, 支持 HTTP2.0
5. 支持 List.of ()、Set.of() 、Map.of()、Map.ofEntries等 工厂方法 实例化对象
......