JDK9相比于JDK8,究竟变强了多少

简介: JDK9相比于JDK8,究竟变强了多少

(一)前言

前段时间翻SpringBoot官方文档时,发现SpringBoot3.0的SNAPSHOT版本出来了,于是我打开了文档,在System Requirements中看到了有点出乎我意料的内容,SpringBoot3.0要求Java的版本是17及以上。

要知道,目前国内绝大部分公司都还在用着JDK8,绝大部分的程序员对JDK8以上的内容没有任何了解,包括我自己。于是我就有了去了解各个版本JDK的想法。本期视频就从JDK9聊起。

(二)JDK9的新特性

我已经将地址给大家找出来了:https://openjdk.org/projects/jdk9/

在openjdk的官网,列出了JDK9相比之前版本的新特征,我大致数了一下,有接近一百条新特征。想了解更多的小伙伴可以访问上面的网站,本文将介绍一些和实际编程相关的特性。

(三)集合能力提升

JDK9中添加了集合的便利工厂方法,用于创建具有少量元素的集合和映射的实例。

以前在创建带有几个数据的集合时,一般都是通过add方法创建,当然有一些工具类提供了更加方便的方法。

Set<String> objects = new HashSet<>();
objects.add("a");
objects.add("b");
objects.add("c");

不过在JDK9中,可以通过更方便的方式创建不可变集合

List<String> java = List.of("a", "b","c");
Set<String> a = Set.of("a", "b", "c");
Map<String, Integer> a1 = Map.of("a", 1, "b", 2);

这里要记住一个点,创建出来的集合是不可变的,如果想要对集合进行增删,则需要转换成可变集合类。

(四)字符串存储发生了变化

这是一个比较大的变化,在JDK9之前,String的内部存储结构一直都是char数据,到JDK9时变成了byte数组。官方的解释是这种方式更加节省空间,可提高String类和相关类的空间效率,同时在大多数场景下保持性能。

(五)Stream更加灵活

JDK8中,stream让一大段代码通过一行代码就实现,在JDK9中,更新了一些API,增加了takeWhile(),dropWhile(),ofNullable()等新方法。就可以通过takeWhile()获取到结果
,dropWhile()则是提供了一个与takewhile相反的方法。

List<Integer> collect = integers.stream().takeWhile(x -> x < 5).collect(Collectors.toList());
List<Integer> drop = integers.stream().dropWhile(x -> x > 5).collect(Collectors.toList());

(六)新的进程API

在以前的JDK版本中,对进程的控制很弱。JDK9中新增了一个叫做ProcessHandle的类,返回操作系统提供的有关每个进程的信息,包括进程 ID、参数、命令、启动时间等。还可用于销毁进程并监控进程的活跃度。

// 输出当前进程的pid
System.out.println(ProcessHandle.current().pid());

(七)接口可以有私有方法

以前写Java的一个共识是接口不能定义私有方法,否则就通不过编译。但是JDK9里增加了对接口私有方法的支持。但是接口中私有方法只能在接口内部的方法里面被调用。

public interface TestInterface {

    private static void test(){
        System.out.println("test");
    }

    public default void show() {
        test();
    }
}

(八)增加JShell

在编程的学习中,即时反馈很重要,比如Scala、Python、JS等都具备交互式编程的能力,Java终于在JDK9的时候增加了这种交互式的编程工具JShell。
在JDK9的bin目录下执行.\jshell.exe,你就可以在命令行上编程了,对初学者而言十分友好。

(九)替换默认垃圾收集器

JDK9中,G1收集器正式上位成为了默认的垃圾收集器,同时CMS垃圾收集器也被彻底删除。一般来说,限制 GC 暂停时间比最大化吞吐量更重要。对于大多数用户而言,切换到 G1 等低暂停收集器应该比当前默认的 Parallel GC 等面向吞吐量的收集器提供更好的整体体验。

(十)提前编译

这也是JDK9的一个新特性,在启动虚拟机之前将Java类编译为本机代码,目标是改善小型和大型 Java 应用程序的启动时间。但是目前这种提前编译的能力还处在一个刚出现的阶段,会在未来的版本中继续优化。

(十一)总结

本文除了介绍一部分比较有意思的特性之外,更多的是成为一个引子,给那些想了解更新JDK的人群一个思路。

相关文章
|
1月前
|
Java
Java基础之 JDK8 HashMap 源码分析(中间写出与JDK7的区别)
这篇文章详细分析了Java中HashMap的源码,包括JDK8与JDK7的区别、构造函数、put和get方法的实现,以及位运算法的应用,并讨论了JDK8中的优化,如链表转红黑树的阈值和扩容机制。
23 1
|
1月前
|
Java 关系型数据库 开发工具
idea创建不了spring2.X版本,无法使用JDK8,最低支持JDK17 , 如何用idea创建spring2.X版本,使用JDK8解决方案
本文提供了解决方案,如何在IDEA中创建Spring 2.X版本的项目并使用JDK8,尽管Spring 2.X已停止维护且IDEA不再直接支持,通过修改pom.xml或使用阿里云的国内源来创建项目。
73 0
idea创建不了spring2.X版本,无法使用JDK8,最低支持JDK17 , 如何用idea创建spring2.X版本,使用JDK8解决方案
|
1月前
|
Oracle Java 关系型数据库
jdk17安装全方位手把手安装教程 / 已有jdk8了,安装JDK17后如何配置环境变量 / 多个不同版本的JDK,如何配置环境变量?
本文提供了详细的JDK 17安装教程,包括下载、安装、配置环境变量的步骤,并解释了在已有其他版本JDK的情况下如何管理多个JDK环境。
715 0
|
3月前
|
存储 Java
【Java集合类面试七】、 JDK7和JDK8中的HashMap有什么区别?
JDK7中的HashMap使用数组加链表解决冲突,而JDK8增加了红黑树结构以优化链表过长时的性能,提高查找效率。
|
3月前
|
Java API
JDK8到JDK25版本升级的新特性问题之使用Collectors.teeing()来计算一个列表中学生的平均分和总分如何操作
JDK8到JDK25版本升级的新特性问题之使用Collectors.teeing()来计算一个列表中学生的平均分和总分如何操作
|
3月前
|
Java API Apache
JDK8到JDK24版本升级的新特性问题之在Java中,HttpURLConnection有什么局限性,如何解决
JDK8到JDK24版本升级的新特性问题之在Java中,HttpURLConnection有什么局限性,如何解决
|
3月前
|
Oracle Java 关系型数据库
JDK8到JDK29版本升级的新特性问题之未来JDK的升级是否会成为必然趋势,如何理解
JDK8到JDK29版本升级的新特性问题之未来JDK的升级是否会成为必然趋势,如何理解
|
3月前
|
Oracle 安全 Java
JDK8到JDK28版本升级的新特性问题之在Java 15及以后的版本中,密封类和密封接口是怎么工作的
JDK8到JDK28版本升级的新特性问题之在Java 15及以后的版本中,密封类和密封接口是怎么工作的
|
3月前
|
Java API 开发者
JDK8到JDK17版本升级的新特性问题之SpringBoot选择JDK17作为最小支持的Java lts版本意味着什么
JDK8到JDK17版本升级的新特性问题之SpringBoot选择JDK17作为最小支持的Java lts版本意味着什么
127 0
JDK8到JDK17版本升级的新特性问题之SpringBoot选择JDK17作为最小支持的Java lts版本意味着什么
|
3月前
|
算法 Java iOS开发
JDK8到JDK27版本升级的新特性问题之JDK 17中G1在资源占用方面有何变化
JDK8到JDK27版本升级的新特性问题之JDK 17中G1在资源占用方面有何变化