Java 9 ← 2017,2019 → Java 13,来看看Java两年来的变化

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

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

 

 

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

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

 

 

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

历任JDK对比

一、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 中的响应式编程。

二、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) 的状况下,对线程执行回调。优化能够只中止单个线程,而不是停所有线程或一个都不停。

三、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表达式的局部变量声明。

四、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 存在超出暂停目标的可能性,则使其可停止。

五、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):引入多行字符串文字,在其中能够放置多行的字符串,不须要进行任何转义。

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

一、本地变量类型推断

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

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

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

二、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;
}
};

三、文本块支持

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等你们期待已久的特性。

相关文章
相关标签/搜索