Java 9 提供了超过150项新功能特性,包括备受期待的模块化系统、可交互
的 REPL 工具,jshell,JDK 编译工具,Java 公共 API 和私有代码,以及安 全增强、扩展提升、性能管理改善等,下面介绍一些常用新特性。
JDK1.8及以前的目录
JDK1.9目录
Java 已经 发展超过 20 年(95 年最初发布),Java 和相关生态在不断丰富的同时也越来越暴露出一些问题:
另外,关注公众号「Java编程大本营」,在后台回复:面试,可以获取我整理的 MySQL、分布式系列面试题和答案,非常齐全。
实现目标
使用细节
模块由声明文件module-info.java组成。该文件是位于 java代码结构的顶层,该模块描述符明确地定义了我们的模块需要依赖哪些模块,以及自己的哪些模块可以被外部使用。
比如下面,创建了2个模块,java9demo 和java9test , 并在Java代码结构的顶层创建了module-info.java文件。
现在想在java9demo模块中调用java9test模块下包中的Person类,需要做如下操作
就像Python 和 Scala 之类的语言早就有交互式编程环境 REPL (read - evaluate - print - loop)了,以交互式的方式对语句和表达式进行求值。开发者只需要输入一些代码, 就可以在编译前获得对程序的反馈。而之前的Java版本要想执行代码,必须创建文 件、声明类、提供测试方法方可实现。
至于一些使用细节大家网上找找资料就行, 个人觉得用处不大。
Java 8中规定接口中的方法除了抽象方法之外,还可以定义静态方法 和默认的方法。一定程度上,扩展了接口的功能,此时的接口更像是 一个抽象类.
在Java 9中,接口更加的灵活和强大,连方法的访问权限修饰符都可以声明为private。
在Java 8匿名实现类与钻石操作符(diamond operator)共同使用,在编译期间会报错,如下:
而在Java 9 后,这个将不在是一个问题。
Java 8 中,可以实现资源的自动关闭,但是要要求代码必须在try子句中初始化,否则编译不通过。如下例所示:
Java 9 中,用资源语句编写try将更容易,我们可以在try子句中使用已经初始 化过的资源,此时的资源是final的
String 再也不用 char[] 来存储啦,改成了 byte[] 加上编码标记,节约 了一些空间。
在Java 8 及以前我们要创建一个只读的集合,需要进行一系列如下的繁琐步骤:
Java 9 引入更优雅的API,使得创建只读集合更加容易
在 Java 9 中,Stream API 变得更好,Stream 接口中添加了 4 个新的方法: takeWhile, dropWhile, ofNullable,还有个重载的iterate方法 ,可以让你提供一个 Predicate (判断条件)来指定什么时候结束迭代。
takewhile() 方法接受所有值,直到谓词返回false为止,才停止。也就是从第1个元素一直往后判断,符合条件的就进行处理,如果中间遇见一个不符合的,整个流程结束。
dropWhile()方法丢弃所有值,直到它与谓词匹配为止。行为与 takeWhile 相反,返回剩余的元素。也就是从第1个元素一直往后判断,如果符合条件的就继续往下判断,当发现元素不符合条件,那么处理后面的那些元素。
Java 8 中 Stream 不能完全为null,否则会报空指针异常。而 Java 9 中的 ofNullable 方 法允许我们创建一个单元素 Stream ,可以包含一个非空元素 ,也可以创建一个空 Stream。
这个 iterate重载方法,可以让你提供一个 Predicate (判断条件)来指定什么时候结束迭代。
Optional 和 Stream 之间的结合也得到了改进。 现在可以通过 Optional 的新方法 stream() 将一个 Optional 对象转换为一个 (可能是空的) Stream 对象
JDK 10一共定义了109个新特性,其中包含12个JEP(JDK Enhancement Proposal特性加强提议,对于程序员来讲,真正的新特性其实就一个),还有一些新API和JVM规范、JAVA语言规范上的改动,下面介绍一个这个新特性。
因为变量声明有时候太长,会导致可读性变差,所以通过类型名 var 来统一声明一个局部变量。适用的范围只能在局部代码块中,它会自动推断类型,如下:
它不适用于以下几种情况:
个人觉得类型推断的这一新特性,并没有带来什么可读性的好处。
工作原理
在编译阶段,处理var部分时,编译器先是查看表达式右边部分,并根据右边变量值的类型进行推断,作为左边变量的类型,然后将该类型写入字节码当中,最终的代码变量声明也是会转化成实际类型。所以这个过程时在编译阶段完成。
官网公开的 17 个 JEP(JDK Enhancement Proposal 特性增强提议),下面介绍一下常用新特性。
在var上添加注解的语法格式,在jdk10中是不能实现的。在JDK11中加入了这样 的语法。
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的支持。
在我们的认知里面,要运行一个 Java 源代码必须先编译,再运行,两步执行动作。 而在未来的 Java 11 版本中,通过一个 java 命令就直接搞定了。
java Javastack.java
ZGC, A Scalable Low-Latency Garbage Collector(Experimental)
ZGC, 这应该是JDK11最为瞩目的特性, 没有之一。但是后面带了Experimental, 说明这还不建议用到生产环境。
ZGC是一个并发,基于region, 压缩型的垃圾收集器,只有 root 扫描阶段会STW(stop the world), 因此GC停顿时间不会随着堆的增长和存活对象的增长而变长。
优势
随着云计算和AI等技术浪潮,当前的计算模式和场景正在发生翻天覆地的变化,不仅对 Java的发展速度提出了更高要求,也深刻影响着Java技术的发展方向。传统的大型企业或互联网应用,正在被云端、容器化应用、模块化的微服务甚至是函数(FaaS,Function-as-a-Service)所替代。另外,关注公众号「Java编程大本营」,在后台回复:面试,可以获取我整理的 MySQL、分布式系列面试题和答案,非常齐全。
Java虽然标榜面向对象编程,却毫不顾忌的加入面向接口编程思想,又扯出匿名对象之概念,每增加一个新的东西,就是对Java面向对象思想的一次冲击。反观Python,抓住面向对象的本质,又能在函数编程思想方面游刃有余。Java对标C/C++,以抛掉内存管理为卖点,却又陷入了JVM优化的噩梦。选择比努力更重要,选择Java的人更需要对它有更清晰的认识。
Java需要在新的计算场景下,改进开发效率。这话说的有点笼统,我谈一些自
己的体会,Java 代码虽然进行了一些类型推断等改进,更易用的集合 API 等,
但仍然给开发者留下了过于刻板、形式主义的印象,这仍然是一个长期的改进方向。
原文:https://www.cnblogs.com/javajn/p/14883554.html