JDK10改变你对Java的原有认知
我们昨天说了关于 JDK9 的相关内容,但是 JDK9 相对于 JDK8 来说,没有做出太大的改变,但是从 JDK11 之后,我们就可以看出,JDK 的变更迭代是确确实实的有点厉害了,更别说现在 JDK 都已经更新到20了,但是该学习的还是得学习呀,今天我们就来讲讲这个关于 JDK10 中发生了哪些变化,我们应该怎么使用。
Var 的引入
Local-Variable Type Inference 局部变量类型推断
JDK10 可以使用var作为局部变量类型推断标识符,仅适用于局部变量。
也就是说,我们在使用局部变量的时候,不需要再继续的定义,String ,Boolean,long类型等等,而且直接通过自定义的 var,然后再最后编译之后的class文件中,自己就会识别了。
我们来看一大段代码,然后再看看他编译之后的class类
//根据推断为 字符串类型
var str = "ABC";
//根据10L 推断long 类型
var l = 10L;
//根据 true推断 boolean 类型
var flag = true;
//这里会推断boolean类型。0表示false 非0表示true
var flag1 = 1;
// 推断 ArrayList<String>
var list = new ArrayList<String>();
// 推断 Stream<String>
var stream = list.stream();
对应的,我们也来看一下编译后的类,是不是能够准确的识别出这些数据类型。
其实这种就有点类似那种弱语言类型了,硬生生的想要向着 JS 方向靠拢,虽然写代码的时候,对我们来说,方便了很多,但是,实际用起来,好像没有那么的舒服,因为对于可读性方面,是有点差的,我只能根据后面的值来判断他的数据类型,好在他也有限制因素,仅适用于局部变量。
虽然改动很大,就有人会问了,这个 var 来定义变量,是不是那个地方都能用,其实也不是,不能使用这个 var 的地方还是有很多的。
- 方法参数
- 构造函数参数
- 方法返回类型
- 成员变量
- 捕获表达式(catch)
那么这种 var 定义变量一般应用场景会是在什么地方应用比较广泛的呢?
- 带有初始化程序的局部变量
//可以应用于直接初始化的局部变量
var numbers = List.of(1, 2, 3, 4, 5);
//错误的用法
var error;//×
还有一种就是直接应用于for循环中
for (var number : numbers) {
System.out.println(number);
}
for (var i = 0; i < numbers.size(); i++) {
System.out.println(numbers.get(i));
}
这就是 var 的使用,而且还新增了一些新的 API
新增的 API
List.copyOf
JDK10 给 java.util 包下的List、Set、Map新增加了一个静态方法 copyOf 。copyof方法将元素放到一个不可修改的集。
我们来看代码:
List<Integer> list=new ArrayList<Integer>(3);
list.add(1);
list.add(2);
list.add(3);
List<Integer> temp = List.copyOf(list);
temp.stream().forEach(System.out::println);
我们可以看到temp中的内容就是123,那么我们再往其中放入一个数据来试一下。
结果直接报错了:
copyOf方法返回的是一个不可变集合,例如list返回的不可变的内部类list。
transferTo方法复制文件
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("a.txt")));
long nums = reader.transferTo(new BufferedWriter(new OutputStreamWriter(new FileOutputStream("b.txt"))));
System.out.println("一共复制的字节数量: "+nums);
其实还有其他的改动,但是其他改动对我们开发来讲,从面上,是看不到的,比如
- 引入并行 Full。
G1 是设计来作为一种低延时的垃圾回收器。G1收集器还可以进行非常精确地对停顿进行控制。从JDK7开始启用 G1 垃圾回收器,在 JDK9 中 G1 成为默认垃圾回收策略。截止到 JDK9,G1 的 Full GC 采用的是单线程算法。也就是说G1在 发生 Full GC 时会严重影响性能。
JDK10 又对 G1 进行了提升,G1 引入并行 Full GC 算法,在发生 Full GC 时可以使用多个线程进行并行回收。能为用户 提供更好的体验。
- 在备用存储装置上进行堆内存分配
- 删除javah工具
关于 JDK10 你了解都有哪些内容了么?
文章转载自公众号:Java极客技术