首页 > 编程语言 > 详细

Java9、10、11的新特性

时间:2021-06-14 23:40:09      阅读:47      评论:0      收藏:0      [点我收藏+]

Java 9

Java 9 提供了超过150项新功能特性,包括备受期待的模块化系统、可交互
的 REPL 工具,jshell,JDK 编译工具,Java 公共 API 和私有代码,以及安 全增强、扩展提升、性能管理改善等,下面介绍一些常用新特性。

1. JDK 目录结构的改变

JDK1.8及以前的目录

技术分享图片

JDK1.9目录

技术分享图片

2. 模块化系统

Java 已经 发展超过 20 年(95 年最初发布),Java 和相关生态在不断丰富的同时也越来越暴露出一些问题:

  1. Java 运行环境的膨胀和臃肿,每次JVM启动的时候,至少会有30~60MB的内存 加载,主要原因是JVM需要加载rt.jar,不管其中的类是否被classloader加载,第一步整个jar都会被JVM加载到内存当中去。而模块化就是解决这问题,按需加载。
  2. 当代码库越来越大,创建复杂,不同版本的类库交叉依赖导致让人头疼的问题,这些都阻碍了 Java 开发和 运行效率的提升
  3. 很难真正地对代码进行封装, 系统并没有对不同JAR 文件之间的依赖关系有个明确的概念。每一个公共类都可以被类路径之下任何其它的公共类所访问到,这样就会导致无意中使用了并不想被公开访问的API。

另外,关注公众号「Java编程大本营」,在后台回复:面试,可以获取我整理的 MySQL、分布式系列面试题和答案,非常齐全。

实现目标

  1. 模块化的主要目的在于减少内存的开销
  2. 只须必要模块,而非全部jdk模块
  3. 改进 Java SE 平台,使其可以适应不同大小的计算设备
  4. 改进其安全性,可维护性,提高性能

使用细节

模块由声明文件module-info.java组成。该文件是位于 java代码结构的顶层,该模块描述符明确地定义了我们的模块需要依赖哪些模块,以及自己的哪些模块可以被外部使用。

比如下面,创建了2个模块,java9demo 和java9test , 并在Java代码结构的顶层创建了module-info.java文件。

技术分享图片

现在想在java9demo模块中调用java9test模块下包中的Person类,需要做如下操作

  1. 在java9test的module-info.java中声明如下信息,控制自己的模块哪些包可以被外部访问。

技术分享图片

  1. 在java9demo的module-info.java中声明如下信息,指明对模块的依赖。

技术分享图片

3. jShell命令

就像Python 和 Scala 之类的语言早就有交互式编程环境 REPL (read - evaluate - print - loop)了,以交互式的方式对语句和表达式进行求值。开发者只需要输入一些代码, 就可以在编译前获得对程序的反馈。而之前的Java版本要想执行代码,必须创建文 件、声明类、提供测试方法方可实现。

至于一些使用细节大家网上找找资料就行, 个人觉得用处不大。

4. 接口的私有方法

Java 8中规定接口中的方法除了抽象方法之外,还可以定义静态方法 和默认的方法。一定程度上,扩展了接口的功能,此时的接口更像是 一个抽象类.

在Java 9中,接口更加的灵活和强大,连方法的访问权限修饰符都可以声明为private。

5. 钻石操作符使用升级

在Java 8匿名实现类与钻石操作符(diamond operator)共同使用,在编译期间会报错,如下:

技术分享图片

而在Java 9 后,这个将不在是一个问题。

6. try的语法升级

Java 8 中,可以实现资源的自动关闭,但是要要求代码必须在try子句中初始化,否则编译不通过。如下例所示:
技术分享图片

Java 9 中,用资源语句编写try将更容易,我们可以在try子句中使用已经初始 化过的资源,此时的资源是final的

技术分享图片

7. String 内部存储结构变更

String 再也不用 char[] 来存储啦,改成了 byte[] 加上编码标记,节约 了一些空间。

8. 快速创建只读集合

在Java 8 及以前我们要创建一个只读的集合,需要进行一系列如下的繁琐步骤:

技术分享图片

Java 9 引入更优雅的API,使得创建只读集合更加容易

技术分享图片

技术分享图片

9. 增强Stream API

在 Java 9 中,Stream API 变得更好,Stream 接口中添加了 4 个新的方法: takeWhile, dropWhile, ofNullable,还有个重载的iterate方法 ,可以让你提供一个 Predicate (判断条件)来指定什么时候结束迭代。

  • takeWhile()

takewhile() 方法接受所有值,直到谓词返回false为止,才停止。也就是从第1个元素一直往后判断,符合条件的就进行处理,如果中间遇见一个不符合的,整个流程结束。

技术分享图片

  • dropWhile()

dropWhile()方法丢弃所有值,直到它与谓词匹配为止。行为与 takeWhile 相反,返回剩余的元素。也就是从第1个元素一直往后判断,如果符合条件的就继续往下判断,当发现元素不符合条件,那么处理后面的那些元素。

技术分享图片

  • ofNullable()

Java 8 中 Stream 不能完全为null,否则会报空指针异常。而 Java 9 中的 ofNullable 方 法允许我们创建一个单元素 Stream ,可以包含一个非空元素 ,也可以创建一个空 Stream。

  • iterate()

这个 iterate重载方法,可以让你提供一个 Predicate (判断条件)来指定什么时候结束迭代。

技术分享图片

Optional 和 Stream 之间的结合也得到了改进。 现在可以通过 Optional 的新方法 stream() 将一个 Optional 对象转换为一个 (可能是空的) Stream 对象

技术分享图片

Java 10

JDK 10一共定义了109个新特性,其中包含12个JEP(JDK Enhancement Proposal特性加强提议,对于程序员来讲,真正的新特性其实就一个),还有一些新API和JVM规范、JAVA语言规范上的改动,下面介绍一个这个新特性。

局部变量类型推断

因为变量声明有时候太长,会导致可读性变差,所以通过类型名 var 来统一声明一个局部变量。适用的范围只能在局部代码块中,它会自动推断类型,如下:

技术分享图片

它不适用于以下几种情况:

  • 情况1:没有初始化的局部变量声明
  • 情况2:方法的返回类型
  • 情况3:方法的参数类型
  • 情况4:构造器的参数类型
  • 情况5:属性
  • 情况6:catch块

个人觉得类型推断的这一新特性,并没有带来什么可读性的好处。

工作原理

在编译阶段,处理var部分时,编译器先是查看表达式右边部分,并根据右边变量值的类型进行推断,作为左边变量的类型,然后将该类型写入字节码当中,最终的代码变量声明也是会转化成实际类型。所以这个过程时在编译阶段完成。

Java 11

官网公开的 17 个 JEP(JDK Enhancement Proposal 特性增强提议),下面介绍一下常用新特性。

1. 新增一些字符串的处理方法

技术分享图片

2. 升级局部类型推断

在var上添加注解的语法格式,在jdk10中是不能实现的。在JDK11中加入了这样 的语法。
技术分享图片

3. 全新的HTTP 客户端

HTTP,用于传输网页的协议,早在1997年就被采用在目前的1.1版本中。直到2015年,HTTP2才成为标准。

HTTP/1.1和HTTP/2的主要区别是如何在客户端和服务器之间构建和传输数据 。 HTTP/1.1依赖于请求/响应周期。HTTP/2允许服务器“push”数据:它可以发送比客户端请求更多的数据。

这是Java 9开始引入的一个处理 HTTP 请求的HTTP Client API,该API支持同步和异步,而在Java 11中已经为正式可用状态,你可以在 java.net包中找到这个API
它将替代仅适用于blocking模式的HttpURLConnection,并提供对WebSocket 和 HTTP/2的支持。

技术分享图片

4. 更简化的编译运行程序

在我们的认知里面,要运行一个 Java 源代码必须先编译,再运行,两步执行动作。 而在未来的 Java 11 版本中,通过一个 java 命令就直接搞定了。

java Javastack.java

5. 新一代的垃圾回收器ZGC

ZGC, A Scalable Low-Latency Garbage Collector(Experimental)
ZGC, 这应该是JDK11最为瞩目的特性, 没有之一。但是后面带了Experimental, 说明这还不建议用到生产环境。

ZGC是一个并发,基于region, 压缩型的垃圾收集器,只有 root 扫描阶段会STW(stop the world), 因此GC停顿时间不会随着堆的增长和存活对象的增长而变长。

优势

  • GC暂停时间不会超过10ms
  • 既能处理几百兆的小堆, 也能处理几个T的大堆(OMG)
  • 和G1相比, 应用吞吐能力不会下降超过15%
  • 为未来的GC功能和利用colord指针以及Load barriers优化奠定基础
  • 初始只支持64位系统

6. 其他新特性

  • Unicode 10
  • Deprecate the Pack200 Tools and API
  • 新的Epsilon垃圾收集器
  • 完全支持Linux容器(包括Docker)
  • 支持G1上的并行完全垃圾收集
  • 最新的HTTPS安全协议TLS 1.3
  • Java Flight Recorder

心得

随着云计算和AI等技术浪潮,当前的计算模式和场景正在发生翻天覆地的变化,不仅对 Java的发展速度提出了更高要求,也深刻影响着Java技术的发展方向。传统的大型企业或互联网应用,正在被云端、容器化应用、模块化的微服务甚至是函数(FaaS,Function-as-a-Service)所替代。另外,关注公众号「Java编程大本营」,在后台回复:面试,可以获取我整理的 MySQL、分布式系列面试题和答案,非常齐全。

Java虽然标榜面向对象编程,却毫不顾忌的加入面向接口编程思想,又扯出匿名对象之概念,每增加一个新的东西,就是对Java面向对象思想的一次冲击。反观Python,抓住面向对象的本质,又能在函数编程思想方面游刃有余。Java对标C/C++,以抛掉内存管理为卖点,却又陷入了JVM优化的噩梦。选择比努力更重要,选择Java的人更需要对它有更清晰的认识。

Java需要在新的计算场景下,改进开发效率。这话说的有点笼统,我谈一些自
己的体会,Java 代码虽然进行了一些类型推断等改进,更易用的集合 API 等,
但仍然给开发者留下了过于刻板、形式主义的印象,这仍然是一个长期的改进方向。

Java9、10、11的新特性

原文:https://www.cnblogs.com/javajn/p/14883554.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!