距离 2019 年结束,只剩下 33 天了。你做好准备迎接 2020 年了吗?

一到年底,人就特别容易陷入回忆和比较之中,比如说这几天的对比挑战就火了!

这个话题登上了微博的热搜榜,也刷爆了朋友圈,人们纷纷晒出自己2017和2019的照片对比。

作为一个技术宅,我也做了一个对比:

2017 年 9 月 21 日,Java 9 正式发布,并且在2017年8月,JCP执行委员会提出将Java的发布频率改为每六个月一次,新的发布周期严格遵循时间点,将在每年的3月份和9月份发布。

历任JDK对比

1、Java 9

Java 9 于 2017 年 9 月 22 日正式发布,带来了很多新特性,其中最主要的变化是已经实现的模块化系统。

主要特性:

  • 模块系统:模块是一个包的容器,Java 9 最大的变化之一是引入了模块系统(Jigsaw 项目)。
  • HTTP 2 客户端:HTTP/2标准是HTTP协议的最新版本,新的 HTTPClient API 支持 WebSocket 和 HTTP2 流以及服务器推送特性。
  • 改进的 Javadoc:Javadoc 现在支持在 API 文档中的进行搜索。另外,Javadoc 的输出现在符合兼容 HTML5 标准。
  • 集合工厂方法:List,Set 和 Map 接口中,新的静态工厂方法可以创建这些集合的不可变实例。
  • 私有接口方法:在接口中使用private私有方法。我们可以使用 private 访问修饰符在接口中编写私有方法。
  • 改进的 Stream API:改进的 Stream API 添加了一些便利的方法,使流处理更容易,并使用收集器编写复杂的查询。
  • 改进 try-with-resources:如果你已经有一个资源是 final 或等效于 final 变量,您可以在 try-with-resources 语句中使用该变量,而无需在 try-with-resources 语句中声明一个新变量。
  • 改进的弃用注解 @Deprecated:注解 @Deprecated 可以标记 Java API 状态,可以表示被标记的 API 将会被移除,或者已经破坏。
  • 改进 Optional 类:java.util.Optional 添加了很多新的有用方法,Optional 可以直接转为 stream。
  • 响应式流(Reactive Streams) API: Java 9中引入了新的响应式流 API 来支持 Java 9 中的响应式编程。

2、Java 10

Java 10于 2018 年3 月21 日正式发布,这是作为当今使用最广泛的编程语言之一的Java 语言的第十个大版本。

主要特性:

  • 局部变量类型推断(Local-Variable Type Inference):使用var关键字进行变量声明,可以进行变量类型的推断。
  • G1的并行Full GC(Parallel Full GC for G1):G1 垃圾回收器的并行完整垃圾回收,实现并行性来改善最坏情况下的延迟。
  • 应用程序类数据共享(Application Class-Data Sharing):应用程序类数据 (AppCDS) 共享,通过跨进程共享通用类元数据来减少内存占用空间,和减少启动时间。
  • ThreadLocal握手机制(Thread-Local Handshakes):在不进入到全局 JVM 安全点 (Safepoint) 的情况下,对线程执行回调。优化可以只停止单个线程,而不是停全部线程或一个都不停。

3、Java 11

Java 11 于 2018 年9 月25 日正式发布,可在生产环境中使用!这是自 Java 8 后的首个长期支持版本,将支持到2026年。

主要特性:

  • ZGC,可扩展的低延迟垃圾收集器(ZGC: A Scalable Low-Latency Garbage Collector):ZGC是一款号称可以保证每次GC的停顿时间不超过10MS的垃圾回收器,并且和当前的默认垃圾回收起G1相比,吞吐量下降不超过15%。
  • Epsilon:什么事也不做的垃圾回收器(Epsilon: A No-Op Garbage Collector):这是一款不做垃圾回收的垃圾回收器。这个垃圾回收器看起来并没什么用,主要可以用来进行性能测试、内存压力测试等,Epsilon GC可以作为度量其他垃圾回收器性能的对照组。
  • 增强var用法(Local-Variable Syntax for Lambda Parameters):在Java 11中,var可以用来作为Lambda表达式的局部变量声明。

4、Java 12

Java 12于 2019 年3 月 19 日正式发布,自Java 11 这一Long Term Support 版本发布之后半年的又一次版本更新

主要特性:

  • 低暂停时间的 GC(Shenandoah: A Low-Pause-Time Garbage Collector )(Experimental):新增 Shenandoah 算法,通过与正在运行的 Java 线程同时进行 evacuation 工作来减少 GC 暂停时间。
  • Switch 表达式(Switch Expressions):扩展了 switch 语句,使其不仅可以作为语句(statement),还可以作为表达式(expression)
  • 可中止的 G1 Mixed GC(Abortable Mixed Collections for G1) G1 及时返回未使用的已分配内存(Promptly Return Unused Committed Memory from G1):如果 G1 Mixed GC 存在超出暂停目标的可能性,则使其可中止。

5、Java 13

Java 13 于 2019 年 9 月 17 日正式发布,这一版本中引入了文本块等功能。

主要特性:

  • 扩展应用程序类-数据共享(Dynamic CDS Archives):以允许在 Java 应用程序执行结束时动态归档类。归档类将包括默认的基础层 CDS(class data-sharing)存档中不存在的所有已加载的应用程序类和库类。
  • 增强 ZGC 以将未使用的堆内存返回给操作系统(ZGC: Uncommit Unused Memory):ZGC 可以将未使用的堆内存返回给操作系统
  • 可在生产环境中使用的 switch 表达式(Switch Expressions):在switch块中引入了yield语句,用于返回值。
  • 将文本块添加到 Java 语言(Text Blocks):引入多行字符串文字,在其中可以放置多行的字符串,不需要进行任何转义。

哪些特性改变你写代码的方式?

1、本地变量类型推断

在以前的版本中,我们想定义定义局部变量时。我们需要在赋值的左侧提供显式类型,并在赋值的右边提供实现类型,如下面的片段所示:

MyObject value = new MyObject();
List list = new ArrayList();
在Java 10中,你可以这样定义对象:
var value = new MyObject();
var list = new ArrayList();

正如你所看到的,本地变量类型推断将引入“var”关键字,而不需要显式的规范变量的类型。

2、switch表达式

在JDK 12中引入了Switch表达式作为预览特性。在Java 13中又修改了这个特性,引入了yield语句,用于返回值。这意味着,switch表达式(返回值)应该使用yield, switch语句(不返回值)应该使用break。

在以前,我们想要在switch中返回内容,还是比较麻烦的,一般语法如下:

int i;
switch (x) {
case "1":
i=1;
break;
case "2":
i=2;
break;
default:
i = x.length();
break;
}
在JDK13中使用以下语法:
int i = switch (x) {
case "1" -> 1;
case "2" -> 2; default -> {
int len = args[1].length();
yield len;
}
};

或者

int i = switch (x) {
case "1": yield 1;
case "2": yield 2; default: {
int len = args[1].length();
yield len;
}
};

3、文本块支持

text block,文本块,是一个多行字符串文字,它避免了对大多数转义序列的需要,以可预测的方式自动格式化字符串,并在需要时让开发人员控制格式。

我们以前从外部copy一段文本串到Java中,会被自动转义,如有一段以下字符串:

 <html>
<body>
<p>Hello, world</p>
</body>
</html>

将其复制到Java的字符串中,会展示成以下内容:

"<html>\n" +
" <body>\n" +
" <p>Hello, world</p>\n" +
" </body>\n" +
"</html>\n";

即被自动进行了转义,这样的字符串看起来不是很直观,在JDK 13中,就可以使用以下语法了:

"""
<html>
<body>
<p>Hello, world</p>
</body>
</html>
""";

使用“”“作为文本块的开始符合结束符,在其中就可以放置多行的字符串,不需要进行任何转义。看起来就十分清爽了。

后话

从2017到2019,不果短短两年时间,Java就发布了5个版本。每个版本都会有很多特性出来,这些特性中虽然没有像Java 8那样提供函数式编程这样的重大改变,但是也提供了switch表达式和block text等大家期待已久的特性。


												

Java 9 ← 2017,2019 → Java 13,来看看Java两年来的变化的更多相关文章

  1. Java 9 ← 2017,2019 Java → 13 ,都发生了什么?

    距离 2019 年结束,只剩下 35 天了.你做好准备迎接 2020 年了吗? 一到年底,人就特别容易陷入回忆和比较之中,比如说这几天, 的对比挑战就火了! 这个话题登上了微博的热搜榜,也刷爆了朋友圈 ...

  2. java面试宝典2019(好东西先留着)

    java面试宝典2019 1.meta标签的作用是什么 2.ReenTrantLock可重入锁(和synchronized的区别)总结 3.Spring中的自动装配有哪些限制? 4.什么是可变参数? ...

  3. 整理了2019年上千道Java面试题,近500页文档,用了1个月时间!

    spring 面试题 1.一般问题 1.1.不同版本的 spring Framework 有哪些主要功能? 1.2.什么是 spring Framework? 1.3.列举 spring Framew ...

  4. JAVA 初识类加载机制 第13节

    JAVA 初识类加载机制 第13节 从这章开始,我们就进入虚拟机类加载机制的学习了.那么什么是类加载呢?当我们写完一个Java类的时候,并不是直接就可以运行的,它还要编译成.class文件,再由虚拟机 ...

  5. 分享13道上海尚学堂拿回来的Java面试真题,这些都是Java核心常见问题,想拿OFFER必看!

    上海尚学堂Java培训学员参加面试带回来的真题,分享出来与大家,希望大家能认真地看看做一遍.后面有详细题解答案,对照下,看看自己做得怎么样,把这些面试遇到的真题全部掌握,做好面试笔试前的准备. 一.1 ...

  6. 【Java】-NO.13.Algorithm.1.Java Algorithm.1.001-【Java 常用算法手册 】-

    1.0.0 Summary Tittle:[Java]-NO.13.Algorithm.1.Java Algorithm.1.001-[Java 常用算法手册 ]- Style:Java Series ...

  7. “全栈2019”Java第四章:创建第一个Java程序

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  8. Java Web学习总结(13)——JSP入门

    一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...

  9. 2019年腾讯最新Java工程师面试题

    一.单选题(共21题,每题5分) 1在正则表达式当中下面那一个字符集表示非空格字符   A.[:graph:] B.[:digit:] C.[:space:] D.[:alpha:] 参考答案:A 答 ...

随机推荐

  1. python模块IO

    Python之模块IO io概叙 io模块提供了python用于处理各种类型I/O的主要工具,主要有三种类型的I/O:文本I/O,二进制I/O和原始I/O:这些都是通用类型,各种后备存储可使用其中的每 ...

  2. 【nodejs原理&源码赏析(6)】深度剖析cluster模块源码与node.js多进程(下)

    [摘要] cluster模块详解 示例代码托管在:http://www.github.com/dashnowords/blogs 阅读本章需要先阅读本系列前两章内容预热一下. 一. 引言 前两篇博文中 ...

  3. php上传下载文件

    之前做一个上传下载的项目,发现网上的和自己需求不是很一样,翻阅了下书籍和整理了下网上的一些代码.做了一个上传下载的demo,上传通过php本身的uploadfile函数,并返回以时间戳命名的文件名后, ...

  4. UIImageView与基本动画gif

    UIImageView 作用:[用来进行图片展示] UIImageView UIImageView初始化 initWithImage:如果设置frame,图片的size就是 imageView的siz ...

  5. Prometheus笔记(一)metric type

    欢迎加入go语言学习交流群 636728449 Prometheus笔记(二)监控go项目实时给grafana展示 Prometheus笔记(一)metric type 文章目录 Prometheus ...

  6. Spring Boot结和Spring Data(Ehcache缓存,Thymeleaf页面,自定义异常页面跳转,Swagger2)

    项目结构 pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=" ...

  7. 批量修改bilibili客户端下载视频文件名

    代码已上传:Github 起因 昨天晚上从B站电脑客户端下了一个分集视频 但是下载后的视频是这样的: 视频名是这样的: 这样既不直观又不美观,就算把视频文件放到一个文件夹内,连续看视频时也不容易记住看 ...

  8. 2017 ACM/ICPC 沈阳 F题 Heron and his triangle

    A triangle is a Heron’s triangle if it satisfies that the side lengths of it are consecutive integer ...

  9. 小程序如何支持使用 async/await (构建npm版)

    前言 小程序本身是不支持async/await语法的,但有些应用场景,我们使用async/await会使得代码更简洁,也更易于维护,用过都知道是有多爽的.既然小程序不支持,那我们可以借助 fackbo ...

  10. 视频发布 2019 中国.NET 开发者峰会

    2019 年,注定会是 .NET Core 社区发展的关键一年,诸多重大事件在这一年发生!正如大家所期待的那样,刷新中国 .NET 社区的年度盛会--2019 中国 .NET 开发者峰会(.NET C ...