本文来源于网络,侵删。
在介绍 Java 9 之前,咱们先来看看 Java 建立到现在的一切版别。
1990 年头,开始被命名为 Oak;
1995 年 5 月 23 日,Java 言语诞生;
1996 年 1 月,第一个 JDK-JDK 1.0 诞生;
1996 年 4 月,10 个最主要的操作系统供货商声明将在其产品中嵌入 Java 技能;
1996 年 9 月,约 8.3 万个网页应用了 Java 技能来制造;
1997 年 2 月 18 日,JDK 1.1 发布;
1997 年 4 月 2 日,JavaOne 会议举行,参与者逾一万人,创其时全球同类会议纪录;
1997 年 9 月,JavaDeveloperConnection 社区成员超越十万;
1998 年 2 月,JDK1.1 被下载超越 2,000,000 次;
1998 年 12 月 8 日,Java 2 企业渠道 J2EE 发布;
1999 年 6 月,SUN 公司发布 Java 三个版别:标准版(J2SE)、企业版(J2EE)和微型版(J2ME);
2000 年 5 月 8 日,JDK 1.3 发布;
2000 年 5 月 29 日,JDK 1.4 发布;
2001 年 6 月 5 日,Nokia 宣告到 2003 年将出售 1 亿部支撑 Java 的手机;
2001 年 9 月 24 日,J2EE 1.3 发布;
2002 年 2 月 26 日,J2SE1.4 发布,尔后 Java 的核算才能有了大幅提高;
2004 年 9 月 30 日,J2SE1.5 发布,成为 Java 言语开展史上的又一里程碑。为了表明该版别的重要性,J2SE1.5 更名为 Java SE 5.0;
2005 年 6 月,JavaOne 大会举行,SUN 公司揭露 Java SE 6。此刻,Java 的各种版别现已更名,以撤销其间的数字“2”:J2EE 更名为 Java EE,J2SE 更名为 Java SE,J2ME 更名为 Java ME;
2006 年 12 月,SUN 公司发布 JRE6.0;
2009 年 4 月 20 日,甲骨文以 74 亿美元的价格收买 SUN 公司,获得 java 的版权,业界风闻说这对 Java 程序员是个坏消息(其实恰恰相反);
2010 年 11 月,因为甲骨文对 Java 社区的不友善,因而 Apache 扬言将退出 JCP;
2011 年 7 月 28 日,甲骨文发布 Java SE 7;
2014 年 3 月 18 日,甲骨文宣布 Java SE 8;
2017 年 7 月,甲骨文宣布 Java SE 9。
写在前面
依照 Java 1995 年正式诞生起到现在,现已快 23 年了。比我年纪都大(我今日刚满 18 岁)。Java 现已陪我走过了十几个年初了,当年我用的第一个版别应该是 J2SE1.4(完了,暴露了)。其实现在好多人还在用 Java SE 6,还有一部分人 Java SE 8 还没玩理解呢,Java SE 9 现已粉末上台了。在 Open JDK 的官网上看到了 Java 10 的规范也在拟定傍边,Java 的开展真的越来越快了。
modularity System 模块体系
Java 9 中首要的改变是现已完成的模块化体系。
Modularity 供给了类似于 OSGI 结构的功用,模块之间存在彼此的依靠联系,能够导出一个公共的 API,而且躲藏完成的细节,Java 供给该功用的首要的动机在于,削减内存的开支,在 JVM 发动的时分,至少会有 30~60MB 的内存加载,首要原因是 JVM 需求加载 rt.jar,不论其间的类是否被 classloader 加载,第一步整个 jar 都会被 JVM 加载到内存当中去,模块化能够依据模块的需求加载程序运转需求的 class。
在引入了模块体系之后,JDK 被重新组织成 94 个模块。Java 运用能够经过新增的 jlink 东西,创建出只包括所依靠的 JDK 模块的自定义运行时镜像。这样能够极大的削减 Java 运行时环境的巨细。使得 JDK 能够在更小的设备中运用。选用模块化体系的运用程序只需要这些运用程序所需的那部分 JDK 模块,而非是整个 JDK 框架了。
HTTP/2
JDK9 之前供给 HttpURLConnection API 来完成 HTTP 拜访功用,可是这个类根本很少运用,一般都会挑选 Apache 的 HttpClient,此次在 Java 9 的版别中引入了一个新的 package:java.net.http,里边供给了对 HTTP 拜访很好的支撑,不只支撑 HTTP 1.1 并且还支撑 HTTP 2(什么是 HTTP2?请拜见
注意:新的 HttpClient API 在 Java 9 中以所谓的孵化器模块交付。也就是说,这套 API 不能保证 100% 完成。
JShell
用过 Python 的童鞋都知道,Python 中的读取-求值-打印循环( Read-Evaluation-Print Loop )很便利。它的意图在于以即时成果和反应的方式。
Java9 引入了 JShell 这个交互性东西,让 Java 也能够像脚本语言相同来运转,能够从控制台发动 JShell ,在 JShell 中直接输入表达式并检查其履行成果。当需求测验一个办法的运转作用,或是快速的对表达式进行求值时,JShell 都十分有用。
除了表达式之外,还能够创立 Java 类和办法。jshell 也有根本的代码完结功用。咱们在教人们怎么编写 Java 的过程中,不再需求解说 “public static void main(String [] args)” 这句废话。
不可变调集工厂办法
Java 9 增加了 List.of()、Set.of()、Map.of()和 Map.ofEntries()等工厂方法来创立不可变调集。
List
除了更短和更好阅览之外,这些办法也能够防止您挑选特定的调集完成。在创立后,持续增加元素到这些调集会导致 “UnsupportedOperationException”。
私有接口办法
Java 8 为咱们供给了接口的默许办法和静态办法,接口也能够包括行为,而不仅仅是办法界说。
默许办法和静态办法能够同享接口中的私有办法,因而避免了代码冗余,这也使代码愈加明晰。假如私有办法是静态的,那这个办法就归于这个接口的。而且没有静态的私有办法只能被在接口中的实例调用。
HTML5 风格的 Java 协助文档
Java 8 之前的版别生成的 Java 协助文档是在 HTML 4 中。在 Java 9 中,Javadoc 的输出现在契合兼容 HTML5 规范。现在 HTML 4 是默许的输出符号言语,但是在之后发布的 JDK 中,HTML 5 将会是默许的输出符号言语。
Java 协助文档仍是由三个结构组成的结构构成,这是不会变的,而且以 HTML 5 输出的 Java 协助文档也坚持相同的结构。每个 Javadoc 页面都包括有关 JDK 模块类或接口来历的信息。
多版别兼容 JAR
当一个新版别的 Java 呈现的时分,你的库用户要花费很长时刻才会切换到这个新的版别。这就意味着库要去向后兼容你想要支撑的最老的 Java 版别 (许多情况下便是 Java 6 或许 7)。这实际上意味着未来的很长一段时刻,你都不能在库中运用 Java 9 所供给的新特性。走运的是,多版别兼容 JAR 功用能让你创立仅在特定版别的 Java 环境中运行库程序时挑选运用的 class 版别:
multirelease.jar├── META-INF│
在上述场景中,multirelease.jar 能够在 Java 9 中运用, 不过 Helper 这个类运用的不是顶层的 multirelease.Helper 这个 class, 而是处在“META-INF/versions/9”下面的这个。这是特别为 Java 9 预备的 class 版别,能够运用 Java 9 所供给的特性和库。一起,在前期的 Java 诸版别中运用这个 JAR 也是能运转的,由于较老版别的 Java 只会看到顶层的这个 Helper 类。
一致 JVM 日志
Java 9 中 ,JVM 有了一致的日志记载体系,能够运用新的命令行选项-Xlog 来操控 JVM 上 一切组件的日志记载。该日志记载体系能够设置输出的日志音讯的标签、等级、修饰符和输出方针等。
Java 9 的废物搜集机制
Java 9 移除了在 Java 8 中 被抛弃的废物收回器装备组合,一起把 G1 设为默许的废物收回器完结。代替了之前默许运用的 Parallel GC,关于这个改动,evens 的谈论是酱紫的:这项变更是很重要的,由于相关于 Parallel 来说,G1 会在使用线程上做更多的作业,而 Parallel 几乎没有在使用线程上做任何作业,它基本上彻底依靠 GC 线程完结一切的内存办理。这意味着切换到 G1 将会为使用线程带来额定的作业,然后直接影响到使用的功能。
I/O 流新特性
java.io.InputStream 中增加了新的方法来读取和仿制 InputStream 中包括的数据。
readAllBytes:读取 InputStream 中的一切剩下字节;
readNBytes: 从 InputStream 中读取指定数量的字节到数组中;
transferTo:读取 InputStream 中的悉数字节并写入到指定的 OutputStream 中。
除了上面这些以外,还有以下这么多的新特性,不再逐个介绍。
102: Process API Updates
110: HTTP 2 Client
143: Improve Contended Locking
158: Unified JVM Logging
165: Compiler Control
193: Variable Handles
197: Segmented Code Cache
199: Smart Java Compilation, Phase Two
200: The Modular JDK
201: Modular Source Code
211: Elide Deprecation Warnings on Import Statements
212: Resolve Lint and Doclint Warnings
213: Milling Project Coin
214: Remove GC Combinations Deprecated in JDK 8
215: Tiered Attribution for javac
216: Process Import Statements Correctly
217: Annotations Pipeline 2.0
219: Datagram Transport Layer Security (DTLS)
220: Modular Run-Time Images
221: Simplified Doclet API
222: jshell: The Java Shell (Read-Eval-Print Loop)
223: New Version-String Scheme
224: HTML5 Javadoc
225: Javadoc Search
226: UTF-8 Property Files
227: Unicode 7.0
228: Add More Diagnostic Commands
229: Create PKCS12 Keystores by Default
231: Remove Launch-Time JRE Version Selection
232: Improve Secure Application Performance
233: Generate Run-Time Compiler Tests Automatically
235: Test Class-File Attributes Generated by javac
236: Parser API for Nashorn
237: Linux/AArch64 Port
238: Multi-Release JAR Files
240: Remove the JVM TI hprof Agent
241: Remove the jhat Tool
243: Java-Level JVM Compiler Interface
244: TLS Application-Layer Protocol Negotiation Extension
245: Validate JVM Command-Line Flag Arguments
246: Leverage CPU Instructions for GHASH and RSA
247: Compile for Older Platform Versions
248: Make G1 the Default Garbage Collector
249: OCSP Stapling for TLS
250: Store Interned Strings in CDS Archives
251: Multi-Resolution Images
252: Use CLDR Locale Data by Default
253: Prepare JavaFX UI Controls
254: Compact Strings
255: Merge Selected Xerces 2.11.0 Updates into JAXP
256: BeanInfo Annotations
257: Update JavaFX/Media to Newer Version of GStreamer
258: HarfBuzz Font-Layout Engine
259: Stack-Walking API
260: Encapsulate Most Internal APIs
261: Module System
262: TIFF Image I/O
263: HiDPI Graphics on Windows and Linux
264: Platform Logging API and Service
265: Marlin Graphics Renderer
266: More Concurrency Updates
267: Unicode 8.0
268: XML Catalogs
269: Convenience Factory Methods for Collections
270: Reserved Stack Areas for Critical Sections
271: Unified GC Logging
272: Platform-Specific Desktop Features
273: DRBG-Based SecureRandom Implementations
274: Enhanced Method Handles
275: Modular Java Application Packaging
276: Dynamic Linking of Language-Defined Object Models
277: Enhanced Deprecation
278: Additional Tests for Humongous Objects in G1
279: Improve Test-Failure Troubleshooting
280: Indify String Concatenation
281: HotSpot C Unit-Test Framework
282: jlink: The Java Linker
283: Enable GTK 3 on Linux
284: New HotSpot Build System
285: Spin-Wait Hints
287: SHA-3 Hash Algorithms
288: Disable SHA-1 Certificates
289: Deprecate the Applet API
290: Filter Incoming Serialization Data
292: Implement Selected ECMAScript 6 Features in Nashorn
294: Linux/s390x Port
295: Ahead-of-Time Compilation
库学科技成立于2009年,是一家综合性的互联网公司,公司总部在北京大兴区,公司的主要业务涉互联网软件开发,数据库、人工智能、新媒体运营等领域,主要是为国内的中大型互联网公司,提供技术人员的定向入职输送,与国内大型企业做联合定岗招聘,与岗位需求相结合通过短期实训达到企业岗位要求的合格的工程师。