作者 l Hollis
来源 l Hollis(ID:hollischuang)
距离 2019 年结束,只剩下 35 天了。 你做好准备迎接 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等大家期待已久的特性。
2年过去了,在Java学习的道路上,你进步了吗? 欢迎谈谈你这两年的变化。
【END】
如果看到这里,说明你喜欢这篇文章,请 转发 、点赞 。微信搜索「web_resource」,关注后回复「进群」或者扫描下方二维码即可进入无广告交流群。
↓ 扫描二维码进群↓
推 荐 阅 读
1. 一文掌握 Redis 常用知识点 - 图文结合
2. 面试官:讲一下 Mybatis 初始化原理
3. 我们再来聊一聊 Java 的单例吧
4. 我采访了一位 Pornhub 工程师
5. 团队开发中 Git 最佳实践
喜 欢 文 章 , 点 个 在看