zoukankan      html  css  js  c++  java
  • java9新特性

    java9新特性概览

    • 模块化系统
    • jShell命令
    • 接口的私有方法
    • 钻石操作符的使用升级
    • 垃圾收集机制
    • 语法改进:try语句
    • String存储结构变更
    • 便利的集合特性of()
    • 增强的Stream API
    • 全新的HTTP客户端API

    1、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框架了。

    代码示例
    从代码结构上来看,在包名同级下多了一个module-info.java文件

    这个文件就是所谓的模块化文件
    在 module 文件中直接 exports 关键字+包名路径就可以选择需要对外暴露的class

    当外部文件需要使用这个的时候,通过requires关键字 + 项目名就可以导入该项目名下暴露的类 

    模块化系统是基于jar包和类之间存在的,目的在于尽可能的减少jar中多余类的加载,保证整体项目运行时的效率,对于项目运行肯定有一定的积极意义。但是对于开发者来看,再一次增加代码的配置工作量,让本来就冗长的java 代码变得更加复杂,不见得会得到开发者的认可,当然如果对应的编译器能够得到进一步的改进,可能会稍微好一点。

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

    3、接口的私有方法
    jdk9,允许在接口中使用私有方法,java官方在近期版本对于接口的改动有点夸张:不断的开放接口的使用权限,说不准以后的接口跟抽象类有可能会合并在一起。

    4、钻石操作符的使用升级
    钻石操作符,是官方给出的说法,其实就是之前版本的泛型操作符,图中的代码在java8中是编译不通过的,但是java9可以,这个主要涉及到匿名子类的时候

    5、垃圾收集机制
    Java 9 移除了在 Java 8 中 被废弃的垃圾回收器配置组合(DefNew + CMS,ParNew + SerialOld,Incremental CMS)。同时把G1设为默认的垃圾回收器实现。替代了之前默认使用的Parallel GC。JVM 有了统一的日志记录系统,可以使用新的命令行选项-Xlog 来控制 JVM 上 所有组件的日志记录。该日志记录系统可以设置输出的日志消息的标签、级别、修饰符和输出目标等。另外,CMS 垃圾回收器已经被声明为废弃。Java 9 也增加了很多可以通过 jcmd 调用的诊断命令。

    6、语法改进:try语句
    对于写底层的人来说,try语法的改进绝对是福音。首先摆上java7之前的时候的代码,一堆的重复代码

    再来看看java8里面的代码,需要把实例化的过程放到入口参数中,看起来简单了很多。

    接下来再看看java9的实现方式,减少了很多的冗余代码,编码风格也更加健壮

    7、String存储结构变更
    这个变化直接看源码就好了

    String的实现底层由char[] 改为byte[],存储效率变高,调用效率同样变高

    8、便利的集合特性of()
    快速创建只读集合,java8 之前

    java9 的实现方式,看起来简单的不少

    9、增强的Stream API
    takeWhile

    • dropWhile dropWhile():与 takeWhile() 整好相反,dropWhile取出的是后面的数据
    • ofNullable ofNullable(T t): t可以为null
    • iterator iterator()重载的方法

    10、全新的HTTP客户端API
    好久没有用过jdk自带的httpclient了,要么用的是公司自己的封装的,要么是外来的工具包,可以考虑更新一下公司的httpclient工具类了

    11、java9的垃圾收集机制
    java9使用G1作为默认的垃圾收集器,替代了之前默认使用的Parallel GC,对于这个改变,evens的评论是酱紫的:这项变更是很重要的,因为相对于Parallel来说,G1会在应用线程上做更多的事情,而Parallel几乎没有在应用线程上做任何事情,它基本上完全依赖GC线程完成所有的内存管理。这意味着切换到G1将会为应用线程带来额外的工作,从而直接影响到应用的性能。

    郭慕荣博客园
  • 相关阅读:
    字符编码之间的转换 utf-8 , gbk等,(解决中文字符串乱码)
    信号分帧的三种实现方法及时间效率对比
    倒谱Cepstrum本质的理解
    Matlab 中 arburg 函数的理解与实际使用方法
    包络提取的两种方法-希尔伯特变换 和 局部峰值检测
    卡尔曼滤波的自我理解
    随机生成一个长度为n的数组
    JS 数字取整等操作
    vue 跳转路由新开页
    el-form 相关自定义校验
  • 原文地址:https://www.cnblogs.com/jelly12345/p/15375528.html
Copyright © 2011-2022 走看看