首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >JDK10改变你对Java的原有认知

JDK10改变你对Java的原有认知

作者头像
Java极客技术
发布2023-09-14 19:03:11
发布2023-09-14 19:03:11
2260
举报
文章被收录于专栏:Java极客技术Java极客技术

我们昨天说了关于 JDK9 的相关内容,但是 JDK9 相对于 JDK8 来说,没有做出太大的改变,但是从 JDK11 之后,我们就可以看出,JDK 的变更迭代是确确实实的有点厉害了,更别说现在 JDK 都已经更新到20了,但是该学习的还是得学习呀,今天我们就来讲讲这个关于 JDK10 中发生了哪些变化,我们应该怎么使用。

Var 的引入

Local-Variable Type Inference 局部变量类型推断

JDK10 可以使用var作为局部变量类型推断标识符,仅适用于局部变量。

也就是说,我们在使用局部变量的时候,不需要再继续的定义,String ,Boolean,long类型等等,而且直接通过自定义的 var,然后再最后编译之后的class文件中,自己就会识别了。

我们来看一大段代码,然后再看看他编译之后的class类

代码语言:javascript
复制
//根据推断为 字符串类型
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 定义变量一般应用场景会是在什么地方应用比较广泛的呢?

  • 带有初始化程序的局部变量
代码语言:javascript
复制
//可以应用于直接初始化的局部变量
var numbers = List.of(1, 2, 3, 4, 5);
//错误的用法
var error;//×

还有一种就是直接应用于for循环中

代码语言:javascript
复制
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方法将元素放到一个不可修改的集。

我们来看代码:

代码语言:javascript
复制
        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方法复制文件

代码语言:javascript
复制
        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 你了解都有哪些内容了么?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-07-22 07:30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java极客技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Var 的引入
  • 新增的 API
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档