1.模块化:
模块化特性是Java 9 最大的一个特性,Java 9起初的代号就叫Jigsaw,后来被更改为Modularity,
Modularity提供了类似于OSGI框架的功能,模块之间存在相互的依赖关系,可以导出一个公共的API,
并且隐藏实现的细节.
Java提供该功能的主要的动机在于,减少内存的开销,我们大家都知道,在JVM启动的时候,
至少会有30~60MB的内存加载,主要原因是JVM需要加载rt.jar,不管其中的类是否被classloader加载,
第一步整个jar都会被JVM加载到内存当中去,模块化可以根据模块的需要加载程序运行需要的class,
那么JVM是如何知道需要加载那些class的呢?
这就是在Java 9 中引入的一个新的文件module.java我们大致来看一下一个例子(module-info.java)
module
com.baoxing.java9.modules.car
{
requires
com.baoxing.java9.modules.engines;
exports
com.baoxing.java9.modules.car.handling;
}
Java 平台级模块系统
Java 9的定义功能是一套全新的模块系统。当代码库越来越大,创建复杂,盘根错节的“意大利面条式代码”的几率呈指数级的增长。
这时候就得面对两个基础的问题: 很难真正地对代码进行封装, 而系统并没有对不同部分(也就是 JAR 文件)之间的依赖关系有个明确的概念。
每一个公共类都可以被类路径之下任何其它的公共类所访问到, 这样就会导致无意中使用了并不想被公开访问的 API。
此外,类路径本身也存在问题: 你怎么知晓所有需要的 JAR 都已经有了, 或者是不是会有重复的项呢? 模块系统把这俩个问题都给解决了。
模块化的 JAR 文件都包含一个额外的模块描述器。在这个模块描述器中, 对其它模块的依赖是通过 “requires” 来表示的。
另外, “exports” 语句控制着哪些包是可以被其它模块访问到的。所有不被导出的包默认都封装在模块的里面。
如下是一个模块描述器的示例,存在于 “module-info.java” 文件中:
module
blog {
exports
com.pluralsight.blog;
requires
cms;
}
2.改进的 Stream API:
长期以来,Stream API 都是 Java 标准库最好的改进之一。通过这套 API 可以在集合上建立用于转换的申明管道。
在 Java 9 中它会变得更好。Stream 接口中添加了 4 个新的方法:dropWhile, takeWhile, ofNullable。
还有个 iterate 方法的新重载方法,可以让你提供一个 Predicate (判断条件)来指定什么时候结束迭代:
IntStream.iterate(1,i-> i <100,i -> i+1).forEach(System.out::println);
第二个参数是一个 Lambda,它会在当前 IntStream 中的元素到达 100 的时候返回 true。因此这个简单的示例是向控制台打印 1 到 99。
除了对 Stream 本身的扩展,Optional 和 Stream 之间的结合也得到了改进。
现在可以通过 Optional 的新方法 stram将一个 Optional 对象转换为一个(可能是空的) Stream 对象:
Stream<Integer> s = Optional.of(1).stream();
3.私有接口方法
interface InterfaceWithPrivateMethods { private static String staticPrivate() { return "static private"; } private String instancePrivate() { return "instance private"; } default void check() { String result = staticPrivate(); InterfaceWithPrivateMethods pvt = new InterfaceWithPrivateMethods() { // anonymous class 匿名类 }; result = pvt.instancePrivate(); } }
4.钻石(diamond)操作符范围的延伸
Java 7给出的钻石操作符使我们编写代码更简单了。
在下面的例子中,你可以看见Java 7中List(列表)的可读性更强了,并且使代码更加的简洁了
List<String> preJava7 = new ArrayList<String>();//java 7 之前的写法 List<String> java7 = new ArrayList<>();//java 7 之后的写法
但是Java 7中钻石操作符不允许在匿名类上使用。但在Java 9中改善了这一情况,允许钻石操作符在匿名类上使用。
下面的例子只有在Java 9中才能通过编译。
List<String> list = new ArrayList<>(){};
5.保留下划线字符。变量不能被命名为_;
6.String 地下底层存储结构更换
Java8之前,String的底层结构类型都是char[],但是java9就替换成byte[]。
7.不可变集合工厂方法
Java 9增加了List.of()、Set.of()、Map.of()和Map.ofEntries()等工厂方法来创建不可变集合。
List strs = List.of("Hello", "World"); List strs List.of(1, 2, 3); Set strs = Set.of("Hello", "World"); Set ints = Set.of(1, 2, 3); Map maps = Map.of("Hello", 1, "World", 2);
8.java9的垃圾收集机制
Java 9 移除了在 Java 8 中 被废弃的垃圾回收器配置组合,同时把G1设为默认的垃圾回收器实现。
替代了之前默认使用的Parallel GC,对于这个改变,evens的评论是酱紫的:这项变更是很重要的,
因为相对于Parallel来说,G1会在应用线程上做更多的事情,而Parallel几乎没有在应用线程上做任何事情,
它基本上完全依赖GC线程完成所有的内存管理。这意味着切换到G1将会为应用线程带来额外的工作,从而直接影响到应用的性能