需要导包吗_这些Java9新特性,你用过吗?

前言

虽然Java已经出到14了,但是大部分公司用的依然是Java8,用的不是Java8的小伙伴请举手。Java8大家应该都很熟悉了。

接下来我们从Java9开始介绍他的新特性,一直到Java14,话不多说,快上车吧。

新特性概览

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

模块化系统:Jigsaw->Modularity

解决越来越臃肿的java运行环境,主要目的在于减少内存的开销,只须必要模块,而非全部jdk模块。

可简化各种类库和大型应用的开发和维护, 改进 Java SE 平台,使其可以适应不同大小的计算设备,改进其安全性,可维护性,提高性能。

代码示例

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

8d268cf5dd4b7f51fb87298cce64a6c3.png

这个文件就是所谓的模块化文件

module 文件中直接 exports 关键字+包名路径就可以选择需要对外暴露的class

362d29c9cafdbddf37a48af11d90a62d.png

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

235cfa8dcb6e17a3db77bd883fbb6266.png

小总结

模块化系统是基于jar包之间存在的,目的在于尽可能的减少jar中多余类的加载,保证整体项目运行时的效率,对于项目运行肯定有一定的积极意义。

但是对于开发者来看,再一次增加代码的配置工作量,让本来就冗长的java 代码变得更加复杂,不见得会得到开发者的认可,当然如果对应的编译器能够得到进一步的改进,可能会稍微好一点

jShell命令

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

使用方法

  • jdk的bin目录下,有一个jshell文件,打开进入

70c693f542e19c015883e2dc11fe6adf.png

可以利用这个窗口进行java的代码段的运行

a4350477e497f65738d847e8d98326a5.png

这种方式通过import导包的,当时这个也有默认的导入的包,通过/imports命令就可以查看

8257339e2ca6de38c9b879a5adb50215.png

这个对于初学者来说简直的福音啊!

接口的私有方法

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

7aa4ad7cd854927e5a29ae6b808a8d05.png

钻石操作符的使用升级

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

cfc8c5c3326907842880cf072071ea3d.png

垃圾收集机制

Java 9 移除了在 Java 8 中 被废弃的垃圾回收器配置组合(DefNew + CMS,ParNew + SerialOld,Incremental CMS)

同时把G1设为默认的垃圾回收器实现。替代了之前默认使用的Parallel GC

JVM 有了统一的日志记录系统,可以使用新的命令行选项-Xlog 来控制 JVM 上 所有组件的日志记录。该日志记录系统可以设置输出的日志消息的标签、级别、修饰符和输出目标等。

另外,CMS 垃圾回收器已经被声明为废弃。Java 9 也增加了很多可以通过 jcmd 调用的诊断命令。

语法改进:try语句

对于写底层的人来说,try语法的改进绝对是福音。

  • 首先摆上java7之前的时候的代码,一堆的重复代码

a33c3947c974312f3cba284cce990dd3.png

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

1f9d162f505c478c319d2cb421491465.png

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

9ccb6e38ff0ab7e86294d08bcbb7b9ad.png

String存储结构变更

这个变化直接看源码就好了

45457b63e0d52906270c8e690307d82e.png

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

f223b259ea48f3aa3c2d400b9da43551.png

便利的集合特性of()

  • 快速创建只读集合,java8 之前

b3c6a42978fcaa7d6f6d1510e8d8b1e6.png

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

1b2469f26274c57900ea31f5ff539e4d.png

增强的Stream API

  • takeWhile

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

全新的HTTP客户端API

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

e6cf46d4aa56cf3fc41ac7b921bda380.png
原文:这些Java9新特性,你用过吗? - 云+社区 - 腾讯云
作者:IT老哥
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值