作者 | 小猴

编辑 | 小猴

2020年9月,Oracle官方发布JDK 15。这些年,大家有关注JDK的版本变化吗?可能没有吧,因为我们日常都是用Java 8,甚至还有小伙伴在用Java 7。从2011年7月发布的JDK 7到今天,已经快10年了。这10年,JDK发生了翻天覆地的变化,大家想想自己做了些什么呢?你的工作、生活是否也像JDK一样,也发生翻天覆地的改变呢?

我们来看看从JDK7到JDK15的近10年,到底经历了些什么。Oracle到底为Java做了哪些振奋人心的创新呢?作为一个Java的老用户,我就献丑带大家回到2011年,带大家去Oracle走一遭。

提前声明下,我看的都是第一个GA大版本的第一次发布内容。

1

从JDK7到JDK15

1

JDK 7

发布时间:2011年7月

后续发布次数:133次发布

代号:Dolphin

经典8层架构

打开JDK7的文档首页,跳转的页面一下把我拉回到10年前。非常朴素,一股浓浓的乡土气息。

javaFx 布局 菜鸟_java

Oracle延续之前的风格,先介绍了Java SE 7的两个产品:一个是JDK7、一个是JRE7。(后面Java就不再是这几个产品了,有一些模块会陆续独立出来)。然后就是把这张Oracle Java SE的组件图放在下方。

javaFx 布局 菜鸟_API_02

这张图清晰地标识出来了JDK、JRE的组件范围,并且也描述了Java SE API的范围。

javaFx 布局 菜鸟_java_03

这张图一共分为8层。我们从下到上来看看。

第八层(最底层)

最底层也就是第八层是Java Virtual Machine,也就是Java虚拟机(JVM)。Java7使用的是Java HotSpot VM,也就是HotSpot VM。所有的组件都是基于JVM之上运行的。它是平台的基础核心。

javaFx 布局 菜鸟_javaFx 布局 菜鸟_04

第七层

Lang and Util基础库。也就是Java编程中最常用的各类Java的类库。包括lang和util、集合、并发包、日志、配置、反射、正则表达式、ZIP压缩等等。

第六层

Other Base Libraries,也就是其他基础库。这里面包含了一些IO、JMX、JNI、数学库、序列化、安全、XML等类库。这些类库也是开发时候会用到的类库。

第五层

Integration Libraries,也就是系统集成相关的类库(外部系统集成)。例如:JDBC、JNDI、RMI等登场了。连接数据库、Java命名服务接口、远程过程调用等相关类库。

第四层

User Interface Toolkits,也就是用户接口开发包。一说到User Interface就表示要人机交互了。例如:Java 7提供了Java FX(Java 6没有)、还有以前的Swing、Java 2D图形编程、AWT、拖拽操作、对Window系统资源的桥接访问、还有图片、打印和声音等组件。

第三层

Deployment,也就是部署相关了,说到部署很多时候会想起来部署webapp到tomcat容器中。但这里面的功能不一样,大部分Java开发用得少一点,像Java Web Start,我以前在18摸的时候,公司里面有很多内部的应用都是基于Java Web Start的。无需安装其他组件,通过浏览器就可以启动运行Java程序。还有Applet,呵呵!Java的小程序,也是可以通过浏览器来运行的。大家也看到了,Oracle是让Java运行在Web Browser中还是花了很多心思的。实施情况,也确实有一些公司的系统是基于这样的技术来部署的。但它的命运最终,会和微软的Active X一样,走向灭亡(Java11)。注意,这跟部署B/S架构的应用不一样,它是让Java程序进入到了客户端。

第二层

Tools & Tool API,从一层开始就是属于JDK的领域了,这里面包含了大量的Java编译、监控等工具、以及针对工具包提供的扩展API。例如:有javac、javadoc、jar、JConsole、WebService等等。

第一层

第一层是我们的主打开发语言——Java Language。注意哦,第二层是Lang和Util库,要和Java Language区分出来。Java Language是划分到JDK中,JavaSE是不认识Java语言的,只认识class字节码。

我们还是来重点关注下JDK7的Release Note。JDK7一共发布了133个版本。我们主要来看一下这个JDK7这个大版本发布的Hightlights吧。

Java语言上的升级。

支持使用二进制来表示整数类型

byte aByte = (byte)0b00100001;

在Switch中可以使用String类型,点赞!

try … with resource语法,点赞!

只要实现了AutoCloseable接口都可以使用这种方式。看一下JDBC接口的源码,例如:Connection、Statement、ResultSet,他们都提供了对AutoCloseable的支持。

try(Connection connection = DriverManager.getConnection(url, user, password);            Statement statement = connection.createStatement();            ResultSet rs = statement.executeQuery("SELECT * FROM t_teacher");) {            while(rs.next()) {                String line = rs.getString("id") +" " + rs.getString("name");                System.out.println(line);            }        } catch (SQLException e) {            e.printStackTrace();        }

你是不是还在用finally?哈哈,中招了吧。

对多个异常的捕获

Java 7之前要写一排,像下面这样

catch (IOException ex) {     logger.log(ex);     throw ex;catch (SQLException ex) {     logger.log(ex);     throw ex;}

Java 7只要这样就可以了。

catch (IOException|SQLException ex) {    logger.log(ex);    throw ex;}

在JDK7中,数字与数字之间是可以出现任意数量的下划线的,提高代码的可读性。

int money = 1_0000_0000;

这样一看就知道,哦,这是一千万。

在new泛型类的时候,使用菱形<>来替代,让编译器直接从上下文推断出类型参数。

ArrayListlist = new ArrayList<>();

看一下IDEA中对JDK 7的简洁描述

javaFx 布局 菜鸟_java_05

diamonds、muti-catch,大家懂我上面的意思了吧?<>这就是钻石,IOException|SQLException ex这就是muti-catch。

虚拟机的优化

JVM提供client端和server端的实现

提供JVM的多种实现

JDK带了一个称为Java HotSpot客户端VM实现。这个VM进行了调整,可以减少启动时间和内存占用。启动应用程序时,可以使用-client来启动该VM。例如:打包一些JAVA应用,我们可以加入-client来进行调优。JDK还提供了HotSpot的Server端VM。这种VM是以最大程度地提高程序的执行速度。启动时加入-server来调用它。

自适应编译器

应用以一个标准的解释器启动,在运行代码过程中,会对执行的代码进行分析,并自动地检测性能瓶颈或者是Hot Spots(热点),并基于此编译出对性能影响最大的代码。并且,HotSpot VM还能够自适应编译器动态决定如何使用in-lining(内联)优化已经编译的代码。

HotSpot提供快速内存分配、提供了快速、高效地GC选择,并且HotSpot提供了一种多线程处理功能,能够比较容易地扩展大型共享内存的多核处理器。

其他支持

JDBC。从JDK7开始,提供了对try-with-resource的支持,可以自动关闭Connection、ResultSet、Statement的能力。

升级了Swing的一些什么JLayer布局组件、Nimbus Look&Feel(其实就是皮肤),解决了一些AWT(重量级)和SWING(轻量级)组件混合使用的效率问题、支持什么圆角矩形、透明窗口、颜色之类的。

从Java 7开始对NIO提供了对文件I/O、访问文件系统的全面支持。也对NIO的ByteBuffer的缓存做了升级优化,无需与page边界对齐,减少内存使用空间。

对Java RIA(Java富浏览器应用程序),基于此,所有的JRE中都添加了新的功能。可以与Windows7的兼容更好,对JNLP(Java网络启动协议)语法进行了安装和升级。这一块其实就是就是我们前面提到的Web Start部署方式的支持。

网络编程。提供了基于SDP(套接字直接协议)的高性能网络连接访问。

安全相关的升级。添加了椭圆曲线密码(ECC)加密、启动CertPath算法加密(MD2加密很不安全),还有对SSL/TLS的一系列升级。

升级并发包。基于Fork/Join框架,通过ForkJoinPool可以使用一个工作线程池来运行更多的任务,并且通过work-strealing技术确保工作线程的状态是busy的,充分利用多核处理器的优势。增加了ThreadLocalRandom实现、可重用的同步Barrier。

改善Java 2D绘图性能。采用XRender的渲染管道。

升级Java XML的相关技术。例如:JAXP、JAXB、JAX-WS等,支持更高版本的标准。

升级了Java SE对国际化的支持。包括像Unicode 6的一些新字符、对ISO 4217货币代码的扩展支持、在正则表达式中支持Unicode 6。

2

JDK 8

发布时间:2014年3月。距JDK 7大版本发布已经2年8个月。

后续发布次数:46次发布

很直观的可以看到,JDK 8的官方界面做了蛮大的改造。页面的颜色换成了淡蓝色,冷色系。

javaFx 布局 菜鸟_API_06

有了JDK 7的经验,大概可以总结出来Oracle的几大升级方向:

语言、虚拟机、用户交互、国际化、部署、网络、安全、系统集成、并发。

可以说,上述的这些内容也是Java SE的升级的核心。而Java 8最大的亮点和特色,就是Lambda和Stream流式API。这套语法对于Java,是划时代的,也是最经典的一代Java。这是每一个Java开发人员都必须要掌握好的。

Lambda表达式

从Java 8开始,Oracle开始引入Lambda表达式。通过使用Lambda表达式,我们可以将一些功能封装称为方法的参数,或者code as data。Lambda表达式可以让我们更加简洁的表示只有一个方法的接口(这种一般称为是功能接口)的实例。为了确保Lambda表达式的使用,Oracle对旧版的接口提供了一些默认方法。Java8还提供了方法引用的语法支持,可以提供阅读性更好的Lambda表达式。用习惯了之后,你会爱上它的。

printPersons(   roster,   (Person p) -> p.getGender() == Person.Sex.MALE       && p.getAge() >= 18       && p.getAge() <= 25);

Stream流式API开发

util.stream包提供了Stream API,可以用来对流式的元素集进行函数式地编程API。并且Java 8将Stream API集成到了Collections API中,通过这些API可以对集合进行批量操作,例如:可以进行串行的、或者并行的MapReduce处理。如果你是Java开发,你应该熟悉以下这种语法的操作:

Listlist = people.stream().map(Person::getName).collect(Collectors.toList());

相信我,用习惯之后,你再也不会像回到Java 7了。

安全相关

默认启用客户端TLS 1.2。提供了更强大的基于密码的加密算法。例如:支持AEAD算法、ASE、GCM、Nopadding密码等。支持Windows 64位的PKCS11。支持Kerberos 5协议。

Java FX

提供新的Modena主题,并且提供了SwingNode,以支持将Swing内容嵌入到Java FX中。提供了DatePicker和TreeTableView控件。还提供了更多的3D功能,包括形状、相机、灯光、材质等场景。并对WebView组件进行了更新,可以支持H5的更多功能。大家可以看到了,AWT和SWING基本上要退出历史的舞台了。所以大家如果真要学Desktop UI,也应该是去看看Java FX,而不是去写swing。

javaFx 布局 菜鸟_javaFx 布局 菜鸟_07

JDK8中开始包含Java DB 10.10

JavaDB是基于Java编程语言和SQL的RDBMS。其他它是Apache Derby项目的Oracle版本。Java DB包含Derby,并且没有对基础源代码进行任何修改。其实就是基于文件的单机存储。

javaFx 布局 菜鸟_API_08

JDK工具

JDK8提供了更多的工具,以帮助更好地运行程序、并提供监控、诊断功能。提供犀牛引擎(Javascript),可以通过java指令直接启动JavaFX应用。可以使用jdeps来分析class字节码文件,通过JMX可以进行远程诊断命令执行。还包括了其他的javac、javadoc工具、命令的升级。

Java HotSpot VM

JDK8中添加了基于硬件的高级标记加密标准(AES),同时从JDK 8开始,移除永久代。基于字节码的调用支持默认方法。

3

JDK 9

发布时间:2017年9月。距JDK 8大版本发布已经3年6个月。

后续发布次数:3次发布

从JDK9开始,Oracle开启了疯狂更新模式。半年一个大版本,2020年9月,JDK 15都已经出来了。Orale目前官方下载,其实主推的是三个版本:JDK8、JDK11以及JDK15。

好了,现在JDK 9的文档首页变成了这样了。

javaFx 布局 菜鸟_javaFx 布局 菜鸟_09

JDK 9在Java语言层面做了一些更新。例如:try-with-resource,我们可以在JDK 9中,在try块外边开启资源,在try…with中应用。这样看起来会更加简洁一些。例如:

try(connection1; connection2) {  //…}

在Java8中,必须要把资源的创建放在try…with中。然后其他语言层面就没有大的动作了。

JDK 9最大的特点就是引入了一种新的Java编程组件,模块。模块是自描述的,包含了代码和数据集合。

在编译和运行期间,可以将模块组装在一起优化成自定义的运行时镜像。在JDK中提供了jlink的属性。而且可以基于JAR文件的方式来承载模块。JDK还提供了一种叫做JMOD的文件,类似于JAR,但它可以包含Native的代码和配置文件。

javaFx 布局 菜鸟_javaFx 布局 菜鸟_10

在IDEA中,对Java9的描述也是重点描述Modules上。

javaFx 布局 菜鸟_javaFx 布局 菜鸟_11

JDK9开始支持对JRE和JDK的模块进行重组,并且从Java运行时中删除rt.jar和tool.jar。默认情况,只保留了最关键的、广泛使用的内部API。

JDK 9中还提供了不可变的List、Sets、和Map。

List stringList = List.of("a", "b", "c");SetstringSet = Set.of("a", "b", "c");Map stringMap = Map.of("a", 1, "b", 2, "c", 3);

通过of方法创建的集合都是不可变的,如果我们试图是修改他们,会抛出UnspportedOperationException。这意味着,所有的操作都将是线程安全的,当在线程之间共享这些集合,都可以安全地看到一致的视图。但要注意,这个是表示创建的集合是immutable的,并不代表集合中的对象是不可变的。如果不可变集合的对象是可变的,依然会有线程安全问题。

JDK9中还更新了Process API,这套API可以支持重定向输出、日志输出、可以监控长时间运行的进程,可以在进程终止的时候重启,以及收集进程的运行统计信息等。

Java 9增加了jshell交互式命令行。学习语言或者做一些语法的探索的时候比较有用。

javaFx 布局 菜鸟_java_12

JDK 9可以将代码缓存到不同的段中,每个段包含特定类型的已编译的代码,以此来提升编译性能。

JDK 9对JVM进行了优化,增强了G1垃圾收集器,使用它可以自动设定内存回收配置。以前是要手动设置的。并且,在稳定性、性能、可用性上都对G1进行了升级。

更多内容请参考官网:

https://docs.oracle.com/javase/9/

4

JDK 10

发布时间:2017年9月

JDK10在Java语言上有一项重大突破,那就是本地变量类型推断。大家来看一下下面这段代码:

URL url = new URL("http://www.oracle.com/");URLConnection conn = url.openConnection();Reader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));

是不是感觉没啥毛病?我们已经很习惯这样去编码了。但其实,它里面还是有大量冗余,URL 变量名 = new URL。这URL类型出现了两次,其实我们读代码的时候,只要一看右边是什么,马上就能脑补是什么类型的。这样实在是臃肿(还有人我看到写scala的时候,居然还把类型给带回来了)。

基于此,JDK10对于非null进行初始化的局部变量可以使用var来定义变量。通过var可以根据上下文来推断变量类型。

var url = new URL("http://www.oracle.com/");var conn = url.openConnection();var reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));

世界一下清爽了很多。

var不仅除了用在初始化局部变量中,还可以用在for循环中、try-with-resource中。来一段代码,爽、爽、爽!

Class.forName(Driver.class.getName());   var url = "jdbc:mysql://localhost:3306/test";   var user = "root";   var password = "000000";       try(var connection = DriverManager.getConnection(url, user, password);       var statement = connection.createStatement();       var rs = statement.executeQuery("SELECT * FROM t_teacher");) {           while(rs.next()) {           var line = rs.getString("id") +" " + rs.getString("name");           System.out.println(line);       }   } catch (SQLException e) {       e.printStackTrace();   }       // 用于for中   for(var i = 0; i < 10; ++i) {       System.out.println(i);   }   for(var ele : List.of(1, 2, 3, 4)) {       System.out.println(ele);   }

所以,有的代码不是Java臃肿!而是你自己肿了!说Java臃肿的,把头伸过来,我保证不打死你。

javaFx 布局 菜鸟_Java_13

大家可以看到在IDEA中,对JDK 10的描述也是Local variable type inference。大家注意到了吗?

JDK 10对不可变集合提供了更多地支持。加入了像List.copyOf、Set.copyOf、Map.copyOf这些API可以从现有的集合中创建新的不可变集合,并且在Stream包中添加了Collectors中添加了toUnmodifiableList、toUnmodifiableSet、toUnmodifiableMap,可以将可变列表转换为不可变集合。其实就是通过stream API将可变流转换为不可变流。

提升G1垃圾回收器的性能。JDK10可以让整个GC过程并行,保证G1在最坏情况下的延迟(Stop the world)。G1旨在避免发生Full GC,但并发收集无法足够快进行回收时,将进行Fall back Full GC。而之前的G1的Full GC是通过单线程地方式标记-清除-压缩算法。现在Full GC可以和其他回收相同数量的工作线程进行回收。

JDK10还对JMX、安全认证、编译器、Javadoc工具进行了小幅升级。并且还移除了一些旧的API。

更多详情请参考Oracle官方文档:

https://www.oracle.com/java/technologies/javase/10-relnote-issues.html

5

JDK 11

发布时间:2018年9月

JDK 11是Oralce官网主推的。大家可以在Oracle Java官方产品页面上看到。从JDK 11开始,Java产品的文档首页换成了这种样式。黑色简约,从中看到的更多的是严谨和专注。这一版的界面是我对比下来,最好的一次改版。

javaFx 布局 菜鸟_javaFx 布局 菜鸟_14

JDK 11对Java语言的更新。

javaFx 布局 菜鸟_API_15

我们看到了,还是对于本地变量类型推断的升级。在JDK 11中,var开始在Lambda表达式中支持。在JDK 10中,var是不能够用在Lambda表达式中。而JDK 11可以。

List.of(1, 2, 3, 4, 5).stream()     .map(n -> {         var i = n * 2 + 1;         System.out.println(i);         return i;     });

接下来,说一下JDK的重大升级——ZGC

JDK11提供了新的Z垃圾收集器(ZGC),是一种可扩展的低延迟垃圾收集器。这一版的垃圾收集器非常牛X,暂停时间不超过10毫秒,而且这个暂停时间不会随着堆的容量增大而增加。Z垃圾收集器旨在处理几百MB – 若干TB的堆内存。所以,机器性能的纵向扩展将会更好。ZGC的核心还是并发的垃圾收集器,也就意味着Java线程在执行的过程中,一些比较heavy的操作(例如:标记、压缩、引用处理、字符串表清理等)都已经完成了。JDK11的ZGC目前是一个使用版本,而且目前仅能在Linux 64bit操作系统下使用。

JDK11还提供了一个No-Op GC。Epsilon GC是新的无操作垃圾收集器,它目前也是一个实验性的GC。这种GC仅处理内存分配,没有实现任何的内存回收机制。这种GC仅用于性能测试,可以用它来对比其他GC的成本/消耗。它可以用来方便观察内存占用量和内存压力。并且,在一些特殊情况下的排错,对于一些寿命很短的作业会比较有用。

除此之外,还对加密算法、认证、权限进行了一些升级。同时,也移除了一些旧的API,例如:AWTUtilities、AppletViewer。

分离JDK

Java Deployment在JDK11被移除掉了、JMC也被拿掉了,开始有自己的独立包。Java FX也被拿掉了,作为单独的模块提供。JavaEE和CORBA模块也从JDK中移除:

javaFx 布局 菜鸟_API_16

霸气!

更多详细内容请参考:

https://www.oracle.com/java/technologies/javase/jdk-11-relnote.html#NewFeature

6

JDK 12

发布时间:2019年3月

JDK12的风格和11保持一致。我们还是来看一下语言上的更新。这次JDK 12仅提供了一个Preview的功能:

Day day = Day.WEDNESDAY;       System.out.println(       switch (day) {           case MONDAY, FRIDAY, SUNDAY -> 6;           case TUESDAY                -> 7;           case THURSDAY, SATURDAY     -> 8;           case WEDNESDAY              -> 9;           default -> throw new IllegalStateException("Invalid day: " + day);       });

呃…把scala的match…case拿过来了。好吧,我不说啥了。我们来看一下IDEA对12的描述~

javaFx 布局 菜鸟_javaFx 布局 菜鸟_17

哈哈哈,No new language feature~好吧,这只能说是一个早期的测试版本吧。算了,抬走。我们继续看下一个吧~

7

JDK 13

发布时间:2019年9月

还是先看一下Language Update。这个版本引入了文本块。看代码吧:

String message = """   'The time has come,' the Walrus said,   'To talk of many things:   Of shoes -- and ships -- and sealing-wax --   Of cabbages -- and kings --   And why the sea is boiling hot --   And whether pigs have wings.'""";

终于,终于等到了~当我们在代码中嵌入其他脚本的时候,例如:SQL、JSON、XML等等,文本块可以说是非常方便。

int numLetters = switch (day) {        case MONDAY, FRIDAY, SUNDAY -> {            System.out.println(6);            yield 6;        }        case TUESDAY -> {            System.out.println(7);            yield 7;        }        case THURSDAY, SATURDAY -> {            System.out.println(8);            yield 8;        }        case WEDNESDAY -> {            System.out.println(9);            yield 9;        }        default -> {            throw new IllegalStateException("Invalid day: " + day);        }    };

支持了yield表达式,又抄scala~现在大家看switch以然变成了一个表达式(就差if了)。

看一下IDEA中的描述,依然是No new language features。

javaFx 布局 菜鸟_Java_18

依然是Preview Feature。

JDK13对NIO、Unicode 12.1做了升级。并且,对ZGC进行了增强,它可以将未使用的堆内存返回给操作系统。这对于一些比较消耗内存的应用和环境是很有用的,JVM不会一直占用着内存空间。并且,增加了SoftMaxHeapSize的JVM配置选项。如果在一些关注资源的应用中,我们希望占用较少的空间,但因为突发的处理,需要临时增加堆内存大小,这个配置就很有用了。也可以有效避免因为临时的处理内存需求而导致OOM,ZGC会比其他的垃圾回收器更积极的回收垃圾,让GC保持更小的堆。并且从JDK13开始,ZGC的最大堆内存增加到16TB。

更多详情请浏览:

https://www.oracle.com/java/technologies/javase/13-relnote-issues.html#NewFeature

8

JDK 14

发布时间:2020年3月

继续看Language New。JDK14为instanceOf提供了模式匹配的支持。以前,我们如果用Java进行类型匹配,代码如下:

public static double getPerimeter(Shape shape) throws IllegalArgumentException {       if (shape instanceof Rectangle) {           Rectangle s = (Rectangle) shape;           return 2 * s.length() + 2 * s.width();       } else if (shape instanceof Circle) {           Circle s = (Circle) shape;           return 2 * s.radius() * Math.PI;       } else {           throw new IllegalArgumentException("Unrecognized shape");       }}

而从JDK14开始,可以这样:   

public static double getPerimeter(Shape shape) throws IllegalArgumentException {       if (shape instanceof Rectangle s) {           return 2 * s.length() + 2 * s.width();       } else if (shape instanceof Circle s) {           return 2 * s.radius() * Math.PI;       } else {           throw new IllegalArgumentException("Unrecognized shape");       }}

大家可以看到,新的instanceOf省去了类型转换的过程。其实还可以更简洁一点,

if (shape instanceof Rectangle s && s.length() > 5) {    // ...}

但这里&&如果改成||就该报错了。因为如果s不是Rectangle类型就麻烦了。

JDK 14还支持了一种叫做Record的定义类的方式。以前,定义各一个Java Bean要这样,

final class Rectangle implements Shape {   final double length;   final double width;   public Rectangle(double length, double width) {       this.length = length;       this.width = width;   }   double length() { return length; }   double width() { return width; }}

现在如果使用record那就简单了。record Rectangle(float length, float width) { }

啊…啊…啊…,这不就是scala中的样例类吗?使用record定义的类还自带了一些实现:

每个字段都是private的

自动提供public并且与字段名一模一样的访问方法,例如:length()、width()

自动提供一个公共的构造器,该构造器用于初始化每一个private变量。

自动实现了equals和hashcode方法,针对于一个record比较,如果成员变量都是相等的,那他们就是相等的

提供了默认toString的实现,返回包含所有字段的名称和值。

JDK14对Text Block也做了进一步的升级。支持两种转义字符:\和\s

String text = """               Lorem ipsum dolor sit amet, consectetur adipiscing \               elit, sed do eiusmod tempor incididunt ut labore \               et dolore magna aliqua.\               """;

\转义字符表示一些长的文本可以分开几段,提高可读性。

String colors = """   red  \s   green\s   blue \s""";

\s表示被简单地替换为空格,通过\s来进行对齐,每一行都是6个字符。

以上三个语言的更新,依然是Preview Feature。

javaFx 布局 菜鸟_Java_19

终于,IDEA中有了Records、patterns、text blocks的新语言特性了。

JDK14的ZGC终于在windows、MacOS平台有了支持,不过是一个测试版本。同时,并行GC采用与其他收集器相同的任务管理机制来进行调度,对性能有较大地提升。从JDK14开始,CMS(Concurrent Mark Seep)垃圾回收器被移除,以及关于CMS的一些配置都被废弃掉了。再见!CMS!

更多的内容请参考:

https://www.oracle.com/java/technologies/javase/14-relnote-issues.html#NewFeature

9

JDK 15

发布时间:2020年9月

终于到15了。这一晃,9年过去了。

大家可以在IDEA中看到Text Blocks已经正式上线。

javaFx 布局 菜鸟_javaFx 布局 菜鸟_20

至于instanceOf、Record之类的估计要等到JDK 16了。我对Record还是蛮期待的。我们继续来看看JDK 15的其他New Feature和Enhancement。

JDK 15开始提供为字符串提供isEmpty方法,也该有啦~

public static void main(String[] args) {       var text = """               select                   *               from                   hello_jdk15               """;       if(text.isEmpty()) {           System.out.println(text);       }}

这个版本GC这一块没有大的调整。更多的详细,大家可以参考:

https://www.oracle.com/java/technologies/javase/15-relnote-issues.html#NewFeature

2

开源社区对Java版本的响应情况

Oracle升级动作如此之迅速,而且JDK之上的应用非常多。Oracle如此升级,我们来看看各大社区作何反应。

1

Spring开源社区

Spring Boot

javaFx 布局 菜鸟_javaFx 布局 菜鸟_21

Spring Boot已经开始支持Java 15了。最低要求是Java 8。

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.4-Release-Notes

2

Hadoop社区

javaFx 布局 菜鸟_API_22

主流版本,Java 8是兼容性最好的,Java 11提供有限的支持(运行时是OK的)。编译用Java 11是不被支持的。

https://cwiki.apache.org/confluence/display/HADOOP/Hadoop+Java+Versions

我们看到对Java 11编译支持的ISSUE还是处在Open状态,当前的work log也是空的。

javaFx 布局 菜鸟_java_23

Hadoop加油!

3

Scala社区

javaFx 布局 菜鸟_java_24

scala社区对JDK的支持是非常好的。大家可以看到上面的兼容情况。从2.11.12开始就支持JDK11。

Spark社区

javaFx 布局 菜鸟_API_25

https://spark.apache.org/docs/latest/

我们看到,Spark 3.x能够运行在Java8和Java 11上的。

javaFx 布局 菜鸟_javaFx 布局 菜鸟_26

https://spark.apache.org/docs/2.4.7/

Spark 2.x版本运行在Java 8上。Spark 2.x运行在Java 8上。

4

Flink社区

javaFx 布局 菜鸟_javaFx 布局 菜鸟_27

Flink 1.12版本要求的是Java 8或者11。

5

Kafka社区

javaFx 布局 菜鸟_Java_28

Kafka 2.7版本推荐Java 11版本。

大家可以看到大数据几个大社区,基本上瞄准的就是Java 11。Spark、Flink社区后续肯定会持续推动Haodop社区/YARN对于Java 11的支持。所以,大数据拥抱并推广Java 11只是迟早的事。

结尾

我很期待着JDK record的上线,以及未来对Tuple的原生支持。相信Java 11会很快流行起来。因为var、ZGC、模块化这些特性一定会吸引更多的社区、开发者的关注。尤其是大数据,切换到Java 11不会太久。

2021年3月,记住这个时间,我们JDK 16见。

作者|小猴