• JDK9新特性


    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将会为应用线程带来额外的工作,从而直接影响到应用的性能

  • 相关阅读:
    Codeforces Round #260 (Div. 2)
    面试题:给定数组a,找到最大的j-i, 使a[j]>a[i]
    ssh自动输入密码脚本 切换目录脚本
    make工作时的执行步骤
    Codeforces Round #259 (Div. 2)
    Codeforces Round #258 (Div. 2)
    如何在半径为1的圆中随机选取一个点
    面试中常问的有关随机选取k个数的总结
    topcoder SRM 628 DIV2 BracketExpressions
    topcoder SRM 628 DIV2 BishopMove
  • 原文地址:https://www.cnblogs.com/cbxBlog/p/9123217.html
Copyright © 2020-2023  润新知