作者 | Hollis

责编 | maozz

出品 | CSDN 博客

距离 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学习的道路上,你进步了吗?欢迎谈谈你这两年的变化。

版权声明:本文为 Hollis 原创文章,版权归作者所有。

【End】

Python的前景怎么样?就业薪资高吗?

https://edu.csdn.net/topic/python115?utm_source=csdn_bw

千人盛会临近!距离BDTC 2019开幕仅剩6天!

12月5-7日,2019中国大数据技术大会(BDTC 2019),三天超强技术峰会,百位顶尖技术专家,Keynote+13大干货技术专场,燃烧你的小宇宙!

热 文 推 荐 

☞谁是当今最顶级的技术?SQL、Java、Python、C++ 皆上榜!

☞惊!程序员真的把地府后台管理系统做出来了!

☞企业上云,如何做好服务器的安全?

☞自学编程、玩 vlog,90 后程序员们的冠军之路

☞警惕!程序员万字揭露被空姐骗到香港做传销的来龙去脉!

☞【经典必看】14个实用的数据库设计技巧

☞贾扬清:为什么说数据智能和云原生之间是“天作之合”?

☞大白话讲解比特币白皮书,十年后它依然是学习区块链的最佳资料,你真的读懂了吗?

点击阅读原文,查看博主精彩分享!

你点的每个“在看”,我都认真当成了喜欢

Java 9 ← 2017,2019 → Java 13 ,Java 两年来都经历了什么?| CSDN 博文精选相关推荐

  1. IntelliJ IDEA 2019.3 正式发布,给我们带来哪些新特性?| CSDN 博文精选

    作者 | _YourBatman 责编 | 屠敏 出品 | CSDN 博客 前言 千呼万唤始出来.自从JetBrains在今年7月24日发布了IDEA 2019.2版本后,从9月份开始我便一直在关注此 ...

  2. java队列_如何彻底搞懂 Java 数据结构?CSDN 博文精选

    作者 | 张振华.Jack 责编 | 郭芮 出品 | CSDN 博客 本文和大家一起来重温<Java数据结构>经典之作. Java数据结构 要理解Java数据结构,必须能清楚何为数据结构? ...

  3. 盘点 6 个被淘汰的 Java 技术,它们都曾经风光过!| CSDN 博文精选

    作者 | 栈长 责编 | 屠敏 出品 | CSDN 博客 今天给大家分享下我的开发历程中,我知道的那些被淘汰的技术或者框架,有些我甚至都没有用过,但我知道它曾经风光过. 废话不多说,下面我要开始吹了- ...

  4. java 固定长度队列_如何彻底搞懂 Java 数据结构?|CSDN 博文精选

    作者 | 张振华.Jack 责编 | 郭芮 出品 | CSDN 博客 本文和大家一起来重温<Java数据结构>经典之作. Java数据结构 要理解Java数据结构,必须能清楚何为数据结构? ...

  5. 春招妥了!资深技术面试官教你这样准备 Java 面试! | CSDN 博文精选

    作者 | hsm_computer 责编 | 伍杏玲 出品 | CSDN博客 Java能力和面试能力,这是两个方面的技能,可以这样说,如果不准备,一些大神或许也能通过面试,但能力和工资有可能被低估.再 ...

  6. 如何彻底搞懂 Java 数据结构?|CSDN 博文精选

    作者 | 张振华.Jack 责编 | 郭芮 出品 | CSDN 博客 本文和大家一起来重温<Java数据结构>经典之作. Java数据结构 要理解Java数据结构,必须能清楚何为数据结构? ...

  7. 为什么 Java 进程使用的 RAM 比 Heap Size 大?​ | CSDN博文精选

    作者 | javaadu 责编 | 郭芮 出品 | CSDN 博客 Java进程使用的虚拟内存确实比Java Heap要大很多.JVM包括很多子系统:垃圾收集器.类加载系统.JIT编译器等等,这些子系 ...

  8. Spring Boot 2.2 正式发布,大幅性能提升 Java 13 支持 | CSDN 博文精选

    作者 | 程序猿DD 责编 | 屠敏 出品 | CSDN博客 之前 Spring Boot 2.2没能按时发布,是由于 Spring Framework 5.2 的发布受阻而推迟.这次随着 Sprin ...

  9. Spring Boot 2.2 正式发布,性能大幅提升、Java 13 支持|CSDN博文精选

    作者 | 程序猿DD 责编 | 郭芮 出品 | CSDN博客 之前 Spring Boot 2.2没能按时发布,是由于 Spring Framework 5.2 的发布受阻而推迟.这次随着 Sprin ...

最新文章

  1. T-SQL WITH 分号问题
  2. jdbc mysql - Column count doesn't match value count at row 1.
  3. 超级数学计算机,超级计算器+
  4. 前端性能调优之Yahoo--23条
  5. 关于expres模板引擎,Function,with
  6. Android 单击+双击+短按+长按 逻辑
  7. C++(STL):14--- forward_list比list更高效的容器
  8. python中tolist()功能
  9. Android中加载Gif动画
  10. 亲测有效,推荐4款好用的录屏软件
  11. Eucalyptus云之面纱
  12. 【系统】ThrottleStop软件使用教程入门级,游戏+工作两种解决cpu过热方案
  13. Hibernate逍遥游记-第13章 映射实体关联关系-005双向多对多(使用组件类集合\composite-element\)...
  14. ultravnc中文版,5步教你如何进行ultravnc中文版配置
  15. MRCP协议学习笔记
  16. Oracle语句优化规则
  17. C语言常用的math函数
  18. 微型计算机中奇偶校验,奇偶校验位
  19. 华为存储OceanStor 5110V5 CA证书即将过期告警处理
  20. 【seeprettyface.com】数据集:戴眼镜/笑容人脸数据集

热门文章

  1. selenium webdriver(2)
  2. 有向图的十字链表存储
  3. Eclipse Java EE的tomcat使用小结
  4. [framework] debuging
  5. [PyTorch] 损失函数
  6. [Ubuntu] 16.04 卸载旧内核并禁止内核更新
  7. vue 查询框赋值后不可编辑_vue input 赋值无效
  8. 【SQL数据库】查询语句练习题
  9. 矩池云上安装chumpy失败
  10. python set() 和 dict()