【 Java 9 - 18 各个版本新特性总结,B站视频介绍】https://www.bilibili.com/video/BV1PT411P7Wn?vd_source=5a3a58ca0e99223ffb58cddf2f3a7282
一、模块化引入
模块是 Java 9 中新增的一个组件,可以简单理解为是package的上级容器,是多个package的集合,一个jar可以有多个module,一个module可以有多个package。从代码结构上看:jar > module > package > class, interface。
Java 9 的模块通过 requires 和 exports 关键字,对自身所依赖(requires)的模块和自身暴露(exports)出去的内容(package)进行了声明。本模块只能使用其他模块暴露(exports)出来的内容(package),其他模块也只能使用本模块暴露(exports)出去的内容(package)。
二、String 底层存储结构变化
对字符串采用更节省空间的内部表达,以提高字符串的内部表示中使用代替编码。
在 Java8 中String的是实现是将字符存储在一个char类型的数组中,而char类型是由两个字节组成。但是Java官方人员根据上万个应用程序的heap dump信息进行了分析,大多数String对象仅包含Latin-1字符。此类字符只需要一个字节的存储空间,因此String对象内部char中的一半空间其实是未使用的。并且字符串都是用String Pool 来存储的,String Pool 通常使用了 JVM 的 heap 内存空间,Heap 内存空间又是 JVM 垃圾清理程序活动的地方。这样做不仅仅可以提高内存空间的使用率并且还能减少JVM垃圾清理的工作量。
简单来讲就是:Java8 之前 String 的底层结构类型都是 char[] ,在 Java9 替换成 byte[] 这样就能更节省空间和提高性能。
之所以替换是因为 之前一直是最小单位是一个char,用到两个byte,但是 Java8 是基于latin1的,而这个latin1编码可以用一个byte标识,所以当你数据明明可以用到一个byte的时候,我们用到了一个最小单位chat两个byte,就多出了一个byte的空间。所以Java9 在这一方面进行了更新,现在的Java9 是基于ISO/latin1/Utf-16 ,latin1和ISO用一个byte标识,UTF-16用两个byte标识,Java9 会自动识别用哪个编码,当数据用到1byte,就会使用iSO或者latin1 ,当空间数据满足2byte的时候,自动使用utf-16,节省了很多空间。
同理,StringBuilder StringBuffer也更换了底层数据结构。
三、多版本兼容Jar
多版本JAR(MR JAR)可能包含同一类的多个变体,每个变体都针对特定的Java版本。 在运行时,类的正确变体将被自动加载,这取决于所使用的Java版本。这允许库作者在早期利用新的Java版本,同时保持与旧版本的兼容性。
应用场景:
比如某个架构师开发了一个工具类MyUtils,该工具类里面使用了jdk9的新特性,这时候该 具在推广的时候会遇到很大的阻力,因为很多用户还没有升级jdk版本,JDK9推出了多版本兼用jar的特性就允许该架构师编写一个同类名的工具MyUtils,并在该工具类中不使用jdk9的新特性,然后两个同类名的类一起打包成为一个jar,提供给用户去使用,这时候即可根据用户当前使用的jdk版本而选择不同的 工具类了。
util.jar
│ MyUtils.class
│
└─META-INF
│ MANIFEST.MF
│
└─versions
└─9
MyUtils.clas
简言之:
该jar包在java 8中可以执行最上层的MyUtils.class,在Java 9中自动选择执行目录9下的 MyUtils.class。
四、接口私有方法
当我们在一个接口里写多个默认方法或者静态方法的时候,可能会遇到程序重复的问题。我们可以把这些重复的程序提取出来,创建一个新的方法,用private进行修饰,这样就创造了一个只有接口可以调用 的私有方法。
public interface UserDao {
default void methodA(){
System.out.println("methodA...");
System.out.println("A....");
System.out.println("B....");
System.out.println("C....");
}
default void methodB(){
System.out.println("methodB...");
System.out.println("A....");
System.out.println("B....");
System.out.println("C....");
}
}
以上代码的methodA与methodB存在着代码冗余问题,我们可以把这部分公共的方法抽取成私有的方法提供给接口内部去使用。
public interface UserDao {
default void methodA(){
System.out.println("methodA...");
commons();
}
default void methodB(){
System.out.println("methodB...");
commons();
}
//定一个私有的方法,把重复部分的代码抽离出来。然后在methodA与methodB方法内部去调用。
//私有方法只能在本类中调用,这里包括接口的实现类也不能调用。
private void commons(){
System.out.println("A....");
System.out.println("B....");
System.out.println("C....");
}
五、JShell工具
针对于Java9来说,相当于cmd工具,可以和cmd一样,直接写方法等等,不过我认为只是适用于初学者做一些最简单的运算和写一些方法。
六、try-with-resources 增强
动机:try-with-resources 声明在 JDK 9 已得到改进。如果你已经有一个资源是 final 或等效于 final 变量,您可以在 try-with-resources 语句中使用该变量,而无需在 try-with-resources 语句中声明一个新变量
-
java7之前 try的使用
-
java8 中try的新用法
这里突出,资源不需要在进行显式关闭,只需要将资源的实例化对象放在try后面的括号中,使用结束后便会自动关闭。
-
java9 中try的变化
可在try后面的括号中放入已经实例化过的对象。但是需要注意的是:这里所说的实例化对象默认被final修饰,所以在try中不能再对其进行修改,否则会报错;再者,try后面的()可以放入多个实例化对象,对象之间用分号隔开。
七、语法改进(下划线使用限制)
Java8 之前 String _ ="hello"; 这样的标识符可以用,但在Java9中进行了限制使用。
八、Stream、Optional 增强,集合增强
- 在原有Stream API 新添加了4个方法,takeWhile、dropWhile、ofNullable、iterate(新重载方法)
- Optional的增强与优化
- collection集合类的增强与优化
Java 9 新特性,看这里就明白了 51CTO博客Java 9 新特性,看这里就明白了,摘要:1.目录结构2.repl工具jShell命令3.模块化4.多版本兼容jar包5.接口方法的https://blog.51cto.com/u_15486212/5287850