JDK9主要新特性介绍

1.Java 9 REPL (JShell) - 交互式编程环境

     JShell 是 Java 9 新增的一个交互式的编程环境工具,允许无需使用类或者方法包来执行 Java 语句,可以直接 输入表达式并查看其执行结果。

执行 JSHELL   

       $ jshell

         |  Welcome to JShell -- Version 9-ea

         |  For an introduction type: /help intro

      jshell>

查看 JShell 命令

       输入 /help 可以查看 JShell相关的命令:jshell> /help

JShell 执行计算

       jshell> 13%7

       $2 ==> 6

       jshell> $2

       $2 ==> 6

JShell 创建与使用函数

       jshell> int doubled(int i){ return i*2;}

       |  created method doubled(int)

       jshell> doubled(6)

       $3 ==> 12

退出 JShell jshell> /exit

参考:https://www.journaldev.com/13121/java-9-features-with-examples#private-methods
https://www.journaldev.com/9879/java-repl-jshell

2.   Factory Methods for Immutable List, Set, Map and Map.Entry

       List,Set 和 Map 接口中,新的静态工厂方法可以创建这些集合的不可变实例, 以更简洁的方式来创建集合。

新方法添加到 List,Set 和 Map 接口以及它们的重载对象。EG:

static  List of(E e1, E e2, E e3);
static  Set  of(E e1, E e2, E e3);
static  Map of(K k1, V v1, K k2, V v2, K k3, V v3);
static  Map ofEntries(Map.Entry... entries)
  • List 和 Set 接口, of(...) 方法重载了 0 ~ 10 个参数的不同方法 。
  • Map 接口, of(...) 方法重载了 0 ~ 10 个参数的不同方法 。
  • Map 接口如果超过 10 个参数, 可以使用 ofEntries(...) 方法。

JDK 9 DEMO

Set set = Set.of("A", "B", "C"); 
List list = List.of("A", "B", "C"); 
Map map = Map.of("A","Apple","B","Boy","C","Cat");

JDK 9以前DEMO

Set set = new HashSet<>(); 
set.add("A"); 
set.add("B"); 
set.add("C"); 
set = Collections.unmodifiableSet(set); 
System.out.println(set);

参考:https://www.journaldev.com/13121/java-9-features-with-examples#factory-methods-immutable

3.   Private methods in Interfaces

为了避免冗余代码和更多的可重用性,JDK9引入JavaSE9接口中的私有方法,也可以使用private关键字在接口interface中编写私有和私有静态方法。

4.   ***Java 9 Module System/Jigsaw -JAVA平台模块系统***

4.1 Advantages of Java SE 9 Module System

       1)As Java SE 9 is going to divide JDK, JRE, JARs etc, into smaller modules, we can use whatever modules we want. So it is very easy to scale down the Java Application to Small devices.

       2) Ease of(易用) Testing and Maintainability.

       3)Supports better Performance性能.

       4)As public is not just public, it supports very Strong Encapsulation. (will explore it with some useful examples soon).

       5)We cannot access Internal Non-Critical APIs anymore.

       6)Modules can hide unwanted and internal details very safely, we can get better Security.

       7)Application is too small because we can use only what ever modules we want.

       8)Its easy to support Less Coupling耦合 between components.

       9) Its easy to support Single Responsibility Principle (SRP/单一责任原则).

4.2 Compare JDK 8 and JDK 9

         JDK9主要新特性介绍_第1张图片

JDK 8 Folder Structure:

          JDK9主要新特性介绍_第2张图片

JDK 9 Folder Structure:

          JDK9主要新特性介绍_第3张图片

        Here JDK 9 does NOT contain JRE. In JDK 9, JRE is separated into a separate distribution folder. JDK 9 software contains a new folder “jmods”. It contains a set of Java 9 Modules as shown below.

     And In JDK 9 modules(95个), No rt.jar and No tools.jar. eg:

           JDK9主要新特性介绍_第4张图片

4.3 java 9 Module

        构成:JDK 9 有95 个模块,我们可以使用 JDK 模块,也可以创建自己的模块,如下所示:module com.foo.bar { }

每个模块都有一个名称、相关代码和其他资源。

               JDK9主要新特性介绍_第5张图片

       主要目的:支持Java中的模块化编程。

        Oracle公司将JDK jars和JavaSE规范分离成两组模块,分别以”jdk.*”、“java.*”开头。"java.base"模块,称为基本模块。是一个独立模块,不依赖于任何其他模块,默认情况下,所有其他模块都依赖于此模块。

4.4 Compare Java 8 and Java 9 Applications

      Java 8 application 图:

              JDK9主要新特性介绍_第6张图片

Java 9 application 图:

              JDK9主要新特性介绍_第7张图片

       Java 9 applications Modules可以将一组相关包Package放入一个组中,还有一个模块描述符的新组件Modules Description。每个 Java 9 模块只有一个模块和一个模块描述符。

      Java 9 模块包含以下主要组件:One Module、Module Name、Module Descriptor、Set of Packages、Set of Types and Resources。

       Resources资源可以是模块信息.java(模块描述符)或任何其他属性或 XML。

4.5 Module Descriptor

             JDK9主要新特性介绍_第8张图片

                                                         元数据

               JDK9主要新特性介绍_第9张图片

                                                        语法

例子:

    module blog {
        exports com.pluralsight.blog;
        requires cms;
    } 
    
    解释:依赖是通过 “requires” 来表示的。“exports” 语句控制着内部的哪些包是可以被其它模块访问到的。所有不被导出的包默认都封装在模块的里面。

4.6 Eclipse IDEs HelloWorld模块的开发与测试

   Step By Post:https://www.journaldev.com/13630/javase9-helloworld-module-ides-part4

PS:4.1-4.5章节摘自

https://www.journaldev.com/13106/java-9-modules

https://www.journaldev.com/13596/javase9-module-basics-part2

5.   Process API Improvements

       Process API 添加了一个名为 ProcessHandle 的接口来增强 java.lang.Process 类。

       ProcessHandle 接口的实例标识一个本地进程,它允许查询进程状态并管理进程。

       ProcessHandle 嵌套接口 Info 来让开发者逃离时常因为要获取一个本地进程的 PID 而不得不使用本地代码的窘境。

6.   Try With Resources Improvement

       JDK 9 已得到改进,如果已经有一个资源是 final 或等效于 final 变量,您可以在 try-with-resources 语句中使用该变量,而无需在 try-with-resources 语句中声明一个新变量。

7. CompletableFuture API Improvements

     改进点

  • 支持 delays 和 timeouts
  • 提升了对子类化的支持
  • 新的工厂方法

   支持 delays 和 timeouts

public CompletableFuture completeOnTimeout(T value, long timeout, TimeUnit unit)
public CompletableFuture orTimeout(long timeout, TimeUnit unit)

8.   Reactive Streams

9.   Diamond Operator for Anonymous Inner Class

          钻石操作符<>可以与匿名的内部类一起使用,从而提高代码的可读性。Eg:

public class Tester { 
  public static void main(String[] args) { 
    Handler intHandler = new Handler<>(1) { 
        @Override 
        public void handle() { 
            System.out.println(content); 
        }
   }; 
   intHandler.handle(); 

  Handler intHandler1 = newHandler<>(2){ 
        @Override 
        public void handle() { 
            System.out.println(content);
        } 
  }; 
  intHandler1.handle(); 

  Handler handler = new Handler<>("test") { 
        @Override 
        public void handle() { 
            System.out.println(content);
         } 
   }; 
   handler.handle(); 
  } 
} 

abstract class Handler { 
    public T content; 
    public Handler(T content) { 
        this.content = content; 
    } 
    abstract void handle(); 
}

10. Optional Class Improvements

        JDK8基础上增加3个方法:stream()、ifPresentOrElse()、or()

        参考:https://www.runoob.com/java/java9-enhanced-deprecated-annotation.html

11. Stream API Improvements

        Stream 新增了几个方法:dropWhile、takeWhile、ofNullable,为 iterate 方法新增了一个重载方法。

        参考:https://www.runoob.com/java/java9-enhanced-deprecated-annotation.html

12. Enhanced @Deprecated annotation

         注解增加了两个新元素:since 和 forRemoval。since: 元素指定已注解的API元素已被弃用的版本。 forRemoval: 元素表示注解的 API 元素在将来的版本中被删除,应该迁移 API。

         参考:https://www.runoob.com/java/java9-enhanced-deprecated-annotation.html

13. HTTP 2 Client

         发布新的 HTTP 2 客户端 API,支持 HTTP/2 协议和 WebSocket 功能。它同时支持 HTTP/1.1 和 HTTP/2 协议。它同时支持同步模式(阻止模式)和异步模式。它支持使用 WebSocket API 的异步模式。

        HTTP 2 Client Example demo参考:https://www.cnblogs.com/IcanFixIt/p/7229611.html

14. Multi-Resolution Image API

       定义多分辨率图像 API,开发者可以很容易的操作和展示不同分辨率的图像了。

       以下是多分辨率图像的主要操作方法:

       Image getResolutionVariant(double destImageWidth, double destImageHeight) − 获取特定分辨率的图像变体-表示一张已知分辨率单位为DPI的特定尺寸大小的逻辑图像,并且这张图像是最佳的变体。。

       List getResolutionVariants() − 返回可读的分辨率的图像变体列表。

       demo参考:https://www.runoob.com/java/java9-multiresolution-image_api.html

15. 其他 Java 9 功能

  • GC (Garbage Collector) Improvements
  • Stack-Walking API
  • Filter Incoming Serialization Data
  • Deprecate the Applet API
  • Indify String Concatenation
  • Enhanced Method Handles
  • Java Platform Logging API and Service
  • Compact Strings
  • Parser API for Nashorn
  • Javadoc Search
  • HTML5 Javadoc

PS:GC (Garbage Collector) Improvements

提高 G1 可用性、确定性和性能

统一 JVM 日志记录

删除 JDK 8 已弃用的 GC 组合

This means that the following GC combinations no longer exist:

  • DefNew + CMS
  • ParNew + SerialOld
  • Incremental CMS

The "foreground" mode for Concurrent Mark Sweep (CMS) has also been removed. The following command-line flags have been removed:

  • -Xincgc
  • -XX:+CMSIncrementalMode
  • -XX:+UseCMSCompactAtFullCollection
  • -XX:+CMSFullGCsBeforeCompaction
  • -XX:+UseCMSCollectionPassing

The command line flag -XX:+UseParNewGC no longer has an effect. ParNew can only be used with CMS and CMS requires ParNew. Thus, the -XX:+UseParNewGC flag has been deprecated and will likely be removed in a future release.

统一 GC日志记录

弃用CMS[并发标记扫描Concurrent Mark Sweep]垃圾回收器

你可能感兴趣的:(JAVA,JDK8SRC研究,JAVA基础)