相关阅读

【小家java】java5新特性(简述十大新特性) 重要一跃
【小家java】java6新特性(简述十大新特性) 鸡肋升级
【小家java】java7新特性(简述八大新特性) 不温不火
【小家java】java8新特性(简述十大新特性) 饱受赞誉
【小家java】java9新特性(简述十大新特性) 褒贬不一
【小家java】java10新特性(简述十大新特性) 小步迭代
【小家java】java11新特性(简述八大新特性) 首个重磅LTS版本


每篇一句

李连杰:生命开始的时候到生命结束。头半段是需要别人帮忙的

经过4次跳票,历经曲折的java 9 终于终于在2017年9月21日发布(距离上个版本足足3年半时间)

java 9 提供了超过 150 项新功能特性,包括备受期待的模块化系统、可交互的 REPL 工具:jshell,JDK 编译工具,Java 公共 API 和私有代码,以及安全增强、扩展提升、性能管理改善等。可以说 Java 9 是一个庞大的系统工程,完全做了一个整体改变。但本博文只介绍最重要的十大新特性

特性列表

  • 平台级modularity(原名:Jigsaw) 模块化系统
  • Java 的 REPL 工具: jShell 命令
  • 多版本兼容 jar 包(这个在处理向下兼容方面,非常好用)
  • 语法改进:接口的私有方法
  • 语法改进:UnderScore(下划线)使用的限制
  • 底层结构:String 存储结构变更(这个很重要)
  • 集合工厂方法:快速创建只读集合
  • 增强的 Stream API
  • 全新的 HTTP 客户端 API
  • 其它特性

它的新特性来自于100于项JEP和40于项JSR

1. 平台级modularity(原名:Jigsaw) 模块化系统

模块化系统Java7开始筹备,Java8进行了大量工作,Java9才落地。首先带来最直观的感受,就是目录结构的感受:
JDK8以及以前版本:


而Java9的结构目录:


对目录做相应的介绍:

Java 9 的定义功能是一套全新的模块系统。当代码库越来越大,创建复杂,盘根错节的**“意大利面条式代码”的几率呈指数级的增长**。这时候就得面对两个基础的问题: 很难真正地对代码进行封装, 而系统并没有对不同部分(也就是 JAR 文件)之间的依赖关系有个明确的概念。每一个公共类都可以被类路径之下任何其它的公共类所访问到, 这样就会导致无意中使用了并不想被公开访问的 API。此外,类路径本身也存在问题: 你怎么知晓所有需要的 JAR 都已经有了, 或者是不是会有重复的项呢? 模块系统把这俩个问题都给解决了

在模块的 src 下创建 module-info.java 文件,来描述依赖和导出(暴露)。

requires:指明对其它模块的依赖。
exports:控制着哪些包可以被其它模块访问到。所有不被导出的包
默认都被封装在模块里面。

2、Java 的 REPL 工具: jShell 命令

REPL:read - evaluate - print - loop
这个简单的说就是能想脚本语言那样,所见即所得。之前我们用java,哪怕只想输出一句hello world,都是非常麻烦的。需要建文件、写代码、编译、运行等等。现在有了jShell工具,实在太方便了

  • 即写即得、快速运行


这样我就进入了jshell环境。下面Hello World就是这么简单了

  • jShell 也可以从文件中加载语句或者将语句保存到文件中(使用Open命令)
  • jShell 也可以是 tab 键进行自动补全和自动添加分号

    列出当前 session 里所有有效的代码片段:/list

3、多版本兼容 jar 包(这个在处理向下兼容方面,非常好用)

当一个新版本的 Java 出现的时候,你的库用户要花费数年时间才会
切换到这个新的版本。这就意味着库得去向后兼容你想要支持的最老
的 Java 版本(许多情况下就是 Java 6 或者 Java7)。这实际上意味着
未来的很长一段时间,你都不能在库中运用 Java 9 所提供的新特性。
幸运的是,多版本兼容 jar 功能能让你创建仅在特定版本的 Java 环境
中运行库程序选择使用的 class 版本

案例:略

4、语法改进:接口的私有方法

在 Java 9 中,接口更加的灵活和强大,连方法的访问权限修饰符
都可以声明为 private 的了,此时方法将不会成为你对外暴露的 API
的一部分(个人认为,这肯定是JDK8遗漏了的一个点,哈哈)
看个例子:

 public static String staticFun() {privateFun();return "";}default String defaultFun() {privateFun();return "";}private static void privateFun() {System.out.println("我是私有方法~");}

这样子是没有问题,可以正常调用和使用的。但是需要注意一下两点

  1. 私有方法可以是static,也可以不是。看你需要default方法调用还是static方法调用
  2. 私有方法只能用private修饰,不能用protected。若不写,默认就是public,就是普通静态方法了。
default String defaultFun() {privateFun();return "";}private void privateFun() {System.out.println("我是私有方法~");}

4、语法改进:钻石操作符(Diamond Operator)使用升级 泛型

在 java 8 中如下的操作是会报错的:

 public static void main(String[] args) {Set<String> set1 = new HashSet<>(); //最常用的初始化//Set<String> set2 = new HashSet<>(){}; //在JDK8中报错Set<String> set2 = new HashSet<String>(){}; //这样在JDK8中也正常Set<String> set3 = new HashSet<String>(){{}}; //这样也都是正常的}

由此课件,报错的那种情况是因为在JDK8中,还不能直接推断出钻石操作符里面的类型而报错。而我们在JDK9以后,就可以直接这么写了:

public static void main(String[] args) {Set<String> set1 = new HashSet<>(); //最常用的初始化Set<String> set2 = new HashSet<>(){}; //在JDK8中报错Set<String> set3 = new HashSet<>(){{}}; //这样也都是正常的}

这样写都是不会报错,可以直接书写使用的。相当于直接创建了一个HashMap的子类。

5、语法改进:UnderScore(下划线)使用的限制

这个点非常的小。距离说明就懂了
在Java8中,我们给变量取名直接就是_

public static void main(String[] args) {String _ = "hello";System.out.println(_); //hello}


我们很清晰的看到,Java8其实给出了提示,但是编译运行都是能通过的,而到了Java9:

直接就提示_是关键字,编译都过不了了。

6、底层结构:String 存储结构变更(这个很重要)

UTF-8表示一个字符是个动态的过程,可以能用1、2、3个字节都是有可能的。但是UTF-16明确的就是不管你是拉丁文、中文等,都是恒定的用两个字节表示

JDK8的字符串存储在char类型的数组里面,不难想象在绝大多数情况下,char类型只需要一个字节就能表示出来了,比如各种字母什么的,两个字节存储势必会浪费空间,JDK9的一个优化就在这,内存的优化。
Java8:

private final char value[];

Java9:

private final byte[] value;

结论:String 再也不用 char[] 来存储啦,改成了 byte[] 加上编码标
记,节约了不少空间。由于底层用了字节数组byte[]来存储,所以遇上非拉丁文,JDK9配合了一个encodingFlag来配合编码解码的

so,相应的StringBuffer 和 StringBuilder 也对应的做出了对应的变化。

有的人担心,这会不会影响到我的charAt方法呢?那我们来看看:

public static void main(String[] args) {String str = "hello";String china = "方世享";System.out.println(str.charAt(1)); //eSystem.out.println(china.charAt(1)); //世}

显然,这个对上层的调用者是完全透明的,完全是底层的数据结构存储而已。但是有必要对比一下源码,还是有非常大的区别的:
java8的charAt方法源码: 实现起来简单很多吧

 public char charAt(int index) {if ((index < 0) || (index >= value.length)) {throw new StringIndexOutOfBoundsException(index);}return value[index];}

java9的charAt方法源码:

public char charAt(int index) {if (isLatin1()) {return StringLatin1.charAt(value, index);} else {return StringUTF16.charAt(value, index);}}

7、集合工厂方法:快速创建只读集合

为了保证数据的安全性,有时候我们需要创建一个只读的List。在JDK8的时候,我们只能这么做:

Collections.unmodifiableList(list)
Collections.unmodifiableSet(set)
Collections.unmodifiableMap(map)

Tips:Arrays.asList(1,2,3)创建的List也是只读的,不能添加删除,但是一般我们并不会把他当作只读来用。

可以说是比较繁琐的一件事。Java 9 因此引入了方便的方法,这使得类似的事情更容易表达。调用集合中静态方法 of(),可以将不同数量的参数传输到此工厂方法。此功能可用于 Set 和 List,也可用于 Map 的类似形式。此时得到
的集合,是不可变的:

List<String> list = List.of("a", "b", "c");Set<String> set = Set.of("a", "b", "c");//Map的两种初始化方式,个人喜欢第二种,语意更加清晰些,也不容易错Map<String, Integer> map1 = Map.of("Tom", 12, "Jerry", 21,"Lilei", 33, "HanMeimei", 18);Map<String, Integer> map2 = Map.ofEntries(Map.entry("Tom", 89),Map.entry("Jim", 78),Map.entry("Tim", 98));

处于好奇心,可以让大家再对比一下类型,看看怎么实现的:

public static void main(String[] args) {List<String> list = List.of("a", "b", "c");List<String> listOld = Collections.unmodifiableList(Arrays.asList("a", "b", "c"));System.out.println(list.getClass().getName()); //java.util.ImmutableCollections$ListNSystem.out.println(listOld.getClass().getName()); //java.util.Collections$UnmodifiableRandomAccessList}

8、增强的 Stream API

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

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

  • takeWhile():返回从开头开始的尽量多的元素
  • dropWhile() :行为与 takeWhile 相反,返回剩余的元素
  • ofNullable():Stream 不能全为 null,否则会报空指针异常。而 Java 9 中的ofNullable健壮性就比of强很多。可以包含一个非空元素,也可以创建一个空 Stream
//报 NullPointerException   因为Of方法不允许全为null的
//Stream<Object> stream1 = Stream.of(null);
//System.out.println(stream1.count());//ofNullable():允许值为 null
Stream<Object> stream1 = Stream.ofNullable(null);
System.out.println(stream1.count());//0
  • iterator()重载方法。如下,相当于不仅仅是limit,而是可以写逻辑来判断终止与否了

9、全新的 HTTP 客户端 API

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

Java 9 中有新的方式来处理 HTTP 调用。它提供了一个新的 HTTP客户端( HttpClient ), 它 将 替代仅适用于 blocking 模式的HttpURLConnection (HttpURLConnection是在HTTP 1.0的时代创建的,并使用了协议无关的方法),并提供对 WebSocket 和 HTTP/2 的支持。

此外,HTTP 客户端还提供 API 来处理 HTTP/2 的特性,比如流和
服务器推送等功能。全新的 HTTP 客户端 API 可以从 jdk.incubator.httpclient 模块中获取。因为在默认情况下,这个模块是不能根据 classpath 获取的,需要使用 add modules 命令选项配置这个模块,将这个模块添加到 classpath中。
栗子:

HttpClient client = HttpClient.newHttpClient();
HttpRequest req = HttpRequest.newBuilder(URI.create("http://www.baidu.com")).GET().build();
HttpResponse<String> response = client.send(req,
HttpResponse.BodyHandler.asString());
System.out.println(response.statusCode());
System.out.println(response.version().name());
System.out.println(response.body());

10、其它特性

Deprecated 废弃了相关 API

Java 9 废弃或者移除了几个不常用的功能。其中最主要的是
Applet API,现在是标记为废弃的。随着对安全要求的提高,主流浏
览器已经取消对 Java 浏览器插件的支持

智能 Java 编译工具

智能 java 编译工具( sjavac )的第一个阶段始于 JEP139 这个项目,用于在多核处理器情况下提升 JDK 的编译速度

JDK 9 还更新了 javac 编译器以便能够将 java 9 代码编译运行在低版本 Java 中

统一的 JVM 日志系统
javadoc 的 HTML 5 支持

Nashorn 项目在 JDK 9 中得到改进,它为 Java 提供轻量级的Javascript 运行时。
JDK 9 包含一个用来解析 Nashorn 的 ECMAScript 语法树的API。这个 API 使得 IDE 和服务端框架不需要依赖 Nashorn 项目的内部实现类,就能够分析 ECMAScript 代码。

Javascript 引擎升级:Nashorn(该引擎在8中首次引入,非常好用)
java 的动态编译器

**JIT(Just-in-time)**编译器可以在运行时将热点编译成本地代码,
速度很快。但是 Java 项目现在变得很大很复杂,因此 JIT 编译器需
要花费较长时间才能热身完,而且有些 Java 方法还没法编译,性能
方面也会下降。AoT 编译就是为了解决这些问题而生的

JIT是个很大的研究课题,阿里有专门的团队搞这一块

最后:

Java9有一个重大的变化,就是垃回收器默认采用了G1。

Java 9 移除了在 Java 8 中 被废弃的垃圾回收器配置组合,同时把G1设为默认的垃圾回收器实现。替代了之前默认使用的Parallel GC,对于这个改变,evens的评论是酱紫的:这项变更是很重要的,因为相对于Parallel来说,G1会在应用线程上做更多的事情,而Parallel几乎没有在应用线程上做任何事情,它基本上完全依赖GC线程完成所有的内存管理。这意味着切换到G1将会为应用线程带来额外的工作,从而直接影响到应用的性能

CMS收集器与G1收集器的区别,参考:CMS收集器与G1收集器


关注A哥

Author A哥(YourBatman)
个人站点 www.yourbatman.cn
E-mail yourbatman@qq.com
微 信 fsx641385712
活跃平台
公众号 BAT的乌托邦(ID:BAT-utopia)
知识星球 BAT的乌托邦
每日文章推荐 每日文章推荐

【小家java】java9新特性(简述十大新特性) 褒贬不一相关推荐

  1. 【小家java】java10新特性(简述十大新特性) 小步迭代

    相关阅读 [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小 ...

  2. java9新特性(简述十大新特性)

    java 9 提供了超过 150 项新功能特性,包括备受期待的模块化系统.可交互的 REPL 工具:jshell,JDK 编译工具,Java 公共 API 和私有代码,以及安全增强.扩展提升.性能管理 ...

  3. java8新特性(简述十大新特性)

    本文的讨论,只是一个简述,更加具体的,各位可以参照各自的专题讲解 说在前面 你真的开始用JDK8了吗? 如果你没有用上一些新特性,请别说自己使用了Java8. Java 8可谓是自Java 5以来最具 ...

  4. java8新特性_JAVA8十大新特性详解

    一.接口的默认方法 Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,示例如下: interface Formula { double ...

  5. 【小家java】java8新特性之---全新的日期、时间API(JSR 310规范),附SpringMVC、Mybatis中使用JSR310的正确姿势

    [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小家java ...

  6. 【小家java】java8新特性之---Optional的使用,避免空指针,代替三目运算符

    相关阅读 [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小 ...

  7. 【小家java】一个例子让就能你彻底理解Java的Future模式,Future类的设计思想

    相关阅读 [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小 ...

  8. 【小家java】Java中Random ThreadLocalRandom 设置随机种子获取随机数精讲

    相关阅读 [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小 ...

  9. 【小家java】Java中集合List、Set、Map删除元素的方法大总结(避免ConcurrentModificationException异常)

    相关阅读 [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小 ...

最新文章

  1. 【AI】【机器人】AI与机器人的42个终极问题与解答
  2. CODEVS 3288 积木大赛
  3. 网站跳出率是SEO优化转化低的诱因之一
  4. python基础知识面试题-python基础知识的重点面试题
  5. Java数据结构-基于数组的栈和泛型
  6. LeetCode 330. 按要求补齐数组(贪心)
  7. 安卓开发文档_鸿蒙2.0,HarmonyOS开发体验!
  8. cls certificate.php,php加密解密处理类
  9. 来电语音播报软件下载apk_消息语音播报app下载-消息语音播报安卓版 v1.0.1 - 安下载...
  10. 【计算机科学基础】计算理论初步
  11. 想要高清壁纸,高图桌面壁纸网站值得收藏!
  12. 如何查找MySQL中查询慢的SQL语句
  13. Open3d之表面重建
  14. Linux系统编程 -- 多线程之基于阻塞队列生产者与消费者模型
  15. Java语言的八大优点
  16. c++复习日记3 模板和流
  17. C语言里的符号重载《C专家编程》
  18. soap错误码和获取处理错误码的详细信息
  19. SCDM(3)建立几何
  20. php拼音分组,前端 - JavaScript如何实现汉字按拼音首字母分组拼序

热门文章

  1. 英文pdf文档怎么翻译中文?免费PDF翻译的方法?
  2. 批处理判断文件夹是否为空
  3. 【视频处理】模拟视频与数字视频的区别
  4. (单片机原理与应用)智能温度监测系统(设计)
  5. Linux qt shell脚本,QT执行shell脚本或者执行linux指令
  6. DCDC12V升压22V~24V 200W大功率音箱电源芯片 SL4010
  7. 机器学习 周志华 西瓜书 第1章 绪论复习总结
  8. aspen分离膜_超滤膜甲醇分离单元的Aspen Plus用户模型开发
  9. CMS 订单管理系统
  10. 青岛科技大学本科毕业论文答辩PPT模板