美文网首页饥人谷技术博客
JDK9的这些新特征你知道吗?

JDK9的这些新特征你知道吗?

作者: _Jun | 来源:发表于2020-11-25 21:37 被阅读0次
    • 模块化系统
    • jShell命令
    • 接口的私有方法
    • 钻石操作符的使用升级
    • 垃圾收集机制
    • 语法改进:try语句
    • String存储结构变更
    • 创建只读集合
    • 增强的Stream API

    1,Java平台模块化系统:

    引入了一种新的Java编程组件模块,它是一个命名的、自描述的代码和数据集合。本质上说,模块(module)的概念,其实就是 package 外再包裹一层,也就是说,用模块来管理各个 package ,通过声明某个 package 暴露,不声明默认就是隐藏。因此模块化是的代码组织上更安全,因为它可以指定哪些部分暴露,哪些部分隐藏。

    过程:

    ① 创建一个 java9demo 的工程,然后在这个工程下面创建 2 个 module。一个 java9A ,一个 java9B

    ② 在 java9A 中创建一个实体类 Person,然后想在 java9B 中引用它,正常情况下是引用不到的,因为是存在两个模块中。

    ③ 我们在 java9A 模块的 src 目录下新建 module-info.java 文件(这个文件就是所谓的模块化文件)

    module java9A {
     // 这里 exports 后面跟具体的包名
     exports com.hepingfly.bean;
    }
    

    ④ 我们在 java9B 模块的 src 目录下新建 module-info.java 文件

    module java9demo {
     // requires 后面跟具体要引入的 module 的名字
     requires java9A;
    }
    

    ⑤ 这样在 java9B 模块中就能引用 java9A 模块暴露出来的实体类了。

    public class ModuleTest {
     // 我在 java9B 模块中想引用 java9A 模块中的 Person 类
     public static void main(String[] args) {
            Person person = new Person();
            person.setName("hepingfly");
            System.out.println(person.getName());   // 打印 hepingfly
        }
    }
    

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

    2、JShell:

    它表示 Java Shell,是大家熟知的 REPL (读取-执行-打印-循环) 形式。利用 jshell 可以在没有创建类的情况下直接声明变量,计算表达式,执行语句。即开发时可以在命令行里直接运行 Java 代码,无需创建 Java 文件。

    基本使用:

    ① JDK9 以上的版本如果你配置好了环境变量直接在命令行输入 jshell 即可进入交互界面原因是 JDKbin 目录下有 jshell 这个工具)

    ② 输入命令获得帮助信息
    【jshell> /help intro】输入 /help intro获得一些帮助信息

    ③ 定义变量,计算变量值

    ④ 定义方法,调用方法

    ⑤ 导入指定的包
    【jshell> import java.util.*】可以通过import命令导入指定的包
    【jshell> /imports】查看默认导入了哪些包

    ⑥ 列出当前 session 内所有有效的代码片段
    【jshell> /list】判断当前session内所有有效的代码片段

    ⑦ 查看当前 session 下所有创建过的变量
    【jshell> /var】

    ⑧ 查看当前 session 下所有创建过的方法
    【jshell> /methods】

    ⑨ 从外部文件加载源代码

    源代码:

    // hello.java 文件中的内容
    public void hello() {
     System.out.println("hello hepingfly");
    }
    hello();
    

    ⑩ 退出 jshell
    【jshell> /exit】

    注:

    • jshell 可以使用 tab 键进行自动补全
    • jshell 可以从文件中加载语句或者将语句保存到文件中
    • 在 jshell 中定义相同方法名和参数列表的方法,即为对现有方法的覆盖。
    • 在 jshell 中你会发现不会出现编译时异常,因为 jshell 帮你隐藏了。

    3,接口的私有方法:

    jdk9,允许在接口中使用私有方法。在 Java9 中,接口更加灵活和强大,方法的访问权限修饰符可以声明为 private 的了,此时方法将不会成为你对外暴露的 API 的一部分。

    //jdk9:声明私有方法
    private void method4(){
         System.out.println("私有方法");
    }
    

    4,钻石操作符的使用升级

    java9 添加了匿名内部类的功能 后面添加了大括号{} 可以做一些细节的操作

    Map<String,String> map9 = new HashMap<>(){};
    

    5,垃圾收集机制

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

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

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

    6,语法改进:try语句

    在 Java9 中可以在 try 子句中使用已经初始化过的资源。

     public void testJava() {
             /**
              * 可以在 try 后面的小括号中调用已经实例化好的资源对象
              * 多个资源对象以分号分隔
              */
             InputStreamReader is = new InputStreamReader(System.in);
             OutputStreamWriter os = new OutputStreamWriter(System.out);
             try (is;os) {
                 System.out.println(is.read());
             } catch (Exception e) {
                 e.printStackTrace();
             }
         }
    

    7,String存储结构变更

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

    @Stable
    private final byte[] value;
    

    8,创建只读合集

    public static void testJava() {
        // 创建一个只读的 list
        List<String> list = List.of("heping", "fly");
        // 创建一个只读的 set
        Set<String> set = Set.of("heping", "fly");
        // 创建一个只读的 map
        Map<String, String> map = Map.of("name", "heping", "age", "18");
        Map<String, String> map2 = Map.ofEntries(Map.entry("name", "heping"), Map.entry("age", "12"));
    }
    

    9,增强的Stream API

    在 Java9 中,Stream API 变的更好,Stream 接口中添加了 4 个新的方法,dropWhiletakeWhileofNullable 、 还有个 iterator 方法的新重载方法。

    • takeWhile :用于从 Stream 中获取一部分数据,接收一个 predicate 来进行选择。在有序的 Stream 中,takeWhile 返回从开头开始的尽量多的元素。

      public static void test1() {
          List<Integer> list = Arrays.asList(13,11,45,18,20,16,96);
          Stream<Integer> stream = list.stream();
          stream.takeWhile((x) -> x < 20).forEach(System.out::println);
      }
      
    • dropWhile:与 takeWhile() 整好相反,dropWhile返回剩余的元素。

      public static void test2() {
          List<Integer> list = Arrays.asList(13,11,45,18,20,16,96);
          Stream<Integer> stream = list.stream();
          stream.dropWhile((x) -> x < 20).forEach(System.out::println);
      }
      
    • ofNullable : 可以包含一个非空元素,也可以创建一个空 Stream 。

      public static void test3() {
          Stream<Integer> stream = Stream.of(1, 2, 3, null);
          stream.forEach(System.out::println);
          // 如果只有单个元素,此元素不能为 null,否则报空指针异常
          Stream<Object> stream1 = Stream.of(null);
          // Java9 新增 ofNullable 允许单个元素为空
          Stream<Object> stream2 = Stream.ofNullable(null);
          System.out.println(stream2.count());   // 0
      }
      
    • iterate:重载的方法
      public static void test4() {
        // 需要通过 limit 来控制终止
        Stream.iterate(0, x -> x + 1).limit(10).forEach(System.out::println);
        // 这里就可以通过传入一个断言型函数来进行终止
        Stream.iterate(0, x -> x < 10, x -> x + 1).forEach(System.out::println);
      }
      

    相关文章

      网友评论

        本文标题:JDK9的这些新特征你知道吗?

        本文链接:https://www.haomeiwen.com/subject/mekoiktx.html