JDK10改变你对Java的原有认知

WilliamGates
发布于 2023-9-28 10:44
浏览
0收藏

我们昨天说了关于 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();          

对应的,我们也来看一下编译后的类,是不是能够准确的识别出这些数据类型。

JDK10改变你对Java的原有认知-鸿蒙开发者社区

其实这种就有点类似那种弱语言类型了,硬生生的想要向着 JS 方向靠拢,虽然写代码的时候,对我们来说,方便了很多,但是,实际用起来,好像没有那么的舒服,因为对于可读性方面,是有点差的,我只能根据后面的值来判断他的数据类型,好在他也有限制因素,仅适用于局部变量。

JDK10改变你对Java的原有认知-鸿蒙开发者社区

虽然改动很大,就有人会问了,这个 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);

JDK10改变你对Java的原有认知-鸿蒙开发者社区

我们可以看到temp中的内容就是123,那么我们再往其中放入一个数据来试一下。

JDK10改变你对Java的原有认知-鸿蒙开发者社区

结果直接报错了:

JDK10改变你对Java的原有认知-鸿蒙开发者社区

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极客技术

标签
已于2023-9-28 10:44:07修改
收藏
回复
举报
回复
    相关推荐