1. Java平台级模块系统

该特性使Java9最大的一个特性,Java提供该功能的主要的动机在于,减少内存的开销,JVM启动的时候,至少会有30~60MB的内存加载,主要原因是JVM需要加载rt.jar,不管其中的类是否被classloader加载,第一步整个jar都会被JVM加载到内存当中去,模块化可以根据模块的需要加载程序运行需要的class,那么JVM是如何知道需要加载哪些class的呢。具体请参考:【JDK9-模块化系统】

2. Linking

当你使用具有显式依赖关系的模块和模块化的JDK时,新的可能性出现了。你的应用程序模块现在讲声明其对其他应用程序模块的依赖以及对其所使用的JDK模块的依赖。为什么不实用这些信息创建一个最小的运行时环境,其中只包含运行应用程序所需的那些模块呢?这可以通过Java9中的新的jlink工具实现。你可以创建针对应用程序进行优化的最小运行时映像而不需要使用完全加载JDK按照版本。

3. JShell:交互式Java REPL

许多语言已经具有交互式编程环境,Java现在加入了,可以从控制台启动jshell,并直接启动输入和执行Java代码。

交互式shell还可以提供良好的学习环境以及提高生产力。

4. 改进的Javadoc

Javadoc现在支持在API文档中的进行搜索,另外Javadoc的输出现在符合兼容HTML5标准,此外每个Javadoc页面都包含有关JDK模块类或接口来源的信息。

实例,对Welcome类生成javadoc文档:

5. 集合工厂方法

通常,希望在代码中创建一个集合(如:List,Set等),并直接用一些元素填充它。实例化集合,几个“add”调用,使得代码重复,Java9添加了几种集合工厂方法:

package com.jdk9.m;

import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set; public class TestFactoryMethods { public static void main(String[] args) {
Set<Integer> set = Set.of(1, 2, 3);
Set<Integer> mySet = new HashSet<Integer>(set);
mySet.add(4);
System.out.println(mySet);
System.out.println(set.getClass() + ", " + set); List<String> list = List.of("a", "b");
System.out.println(list.getClass() + ", " + list);
Map<String, String> map = Map.of("k1", "v1", "k2", "v2");
System.out.println(map.getClass() + ", " + map);
} }

运行截图:

除了更短和更好阅读之外,这些方法也可以避免你选择特定的集合实现,事实上,从工厂方法返回已放入数个元素的集合实现是高度优化的,因为它们时不可变的:在创建后,继续添加元素到这些集合会导致“UnsupportedOperationException”。

6. 改进的Stream API

Java9中,Stream接口中添加了4个新的方法:dropWhile,takeWhile,ofNullable。还有一个iterate方法的新重载方法,可以让你提供一个Predicate来指定什么时候结束迭代:

package com.jdk9.m;

import java.util.stream.IntStream;

public class TestStream {

    public static void main(String[] args) {
IntStream.iterate(1, i -> i < 100, i -> i + 1).forEach(System.out::println);
}
}  

除了对Stream本身的扩展,OPtional和Stream之间的结合也得到了改进,可以通过OPtional的新方法stream将一个Optional对象转换为一个Stream对象:

Stream<Integer> s = Optional.of(1).stream();

7. 私有接口方法

Java8带来了接口的默认方法,接口现在也可以包含行为,而不仅仅是方法签名,但是如果在接口上几个默认方法,代码几乎相同,通常将重构这些方法,调用一个可复用的私有方法,但默认方法不能是私有的。将复用代码创建为一个默认方法不是一个解决方案。Java9可以向接口添加私有辅助方法来解决此问题:

package com.jdk9.m;

public interface TestPrivate {
void im(); default void m1() {
init();
} default void m2() {
init();
} private void init() {
System.out.println("Initializing");
} } 

如果使用默认方法开发API,那么私有接口方法可能有助于构建其实现。

8. HTTP/2

JDK9之前,JDK提供的HTTP访问功能,几乎都需要依赖HttpURLConnection,但是这个类大家在写代码的时候很少使用,我们一般都会选择Apache的HttpClient,此处在Java9的版本中引入了一个新的HTTP相关模块,里面提供了堆HTTP访问很好的支持,不仅支持HTTP1.1而且还支持HTTP2,以及WebSocket,但是目前这个模块还在孵化阶段,因此这套API不能保证100%正确。

实例:

package com.jdk9.m;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException; import jdk.incubator.http.HttpClient;
import jdk.incubator.http.HttpRequest;
import jdk.incubator.http.HttpResponse; public class TestHttpClient { public static void main(String[] args) throws URISyntaxException, IOException, InterruptedException {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder(URI.create("http://www.baidu.com")).GET().build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandler.asString());
System.out.println(response.statusCode());
} }  

运行截图:

注意:JDK9的Java工程默认只可以访问java.base模块里面的包,但是HttpClient类是在模块jdk.incubator.httpclient里面,所以如果要访问HttpClient必须要创建模块化文件module-info.java并且在里面显式声明引入jdk.incubator.httpclient,否则无法访问HttpClient

module com.jdk9.m {
requires jdk.incubator.httpclient;
}

9. 多版本兼容JAR

当一个新版本的Java出现的时候,你的库用户要花费数年时间才会切换到这个新的版本,这就意味着库得去向后兼容你想要支持的最老的Java版本。这实际上意味着未来的很长一段时间,你都不能在库中运行Java9锁提供的新特性。多版本兼容JAR功能让你创建仅在特定版本Java环境中运行库程序时选择使用的class版本。

实例:

multirelease.jar
├── META-INF
│ └── versions
│ └── 9
│ └── multirelease
│ └── Helper.class
├── multirelease
├── Helper.class
└── Main.class  

multirelease.jar可以在Java9中使用,不过Helper这个类使用的不是顶层的multirelease.Helper这个class,而是处在META-INFO/version/9下面的类。这是特别为Java9准备的class版本,可以运行Java9所提供的特性和库。同时,在早期的Java诸版本中使用这个JAR也是能运行的,因为较老版本的Java只会看到顶层的Helper类。  

JDK1.9-新特性的更多相关文章

  1. JDK1.7新特性

    jdk1.7新特性 1 对集合类的语言支持: 2 自动资源管理: 3 改进的通用实例创建类型推断: 4 数字字面量下划线支持: 5 switch中使用string: 6 二进制字面量: 7 简化可变参 ...

  2. jdk1.6新特性

    1.Web服务元数据 Java 里的Web服务元数据跟微软的方案基本没有语义上的区别,自从JDK5添加了元数据功能(Annotation)之后,SUN几乎重构了整个J2EE体 系, 由于变化很大,干脆 ...

  3. JDK1.8 新特性

    jdk1.8新特性知识点: Lambda表达式 函数式接口 *方法引用和构造器调用 Stream API 接口中的默认方法和静态方法 新时间日期API https://blog.csdn.net/qq ...

  4. JDK1.6新特性,WebService强化

    Web service是一个平台独立的,松耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布式的互操作的应用程序. Web ...

  5. JDK1.5新特性,基础类库篇,集合框架(Collections)

    集合框架在JDK1.5中增强特性如下: 一. 新语言特性的增强 泛型(Generics)- 增加了集合框架在编译时段的元素类型检查,节省了遍历元素时类型转换代码量. For-Loop循环(Enhanc ...

  6. JDK1.7新特性(2):异常和可变长参数处理

    异常 jdk1.7对try--catch--finally的异常处理模式进行了增强,下面我们依次来看增强的方面. 1. 为了防止异常覆盖,给Throwable类增加了addSuppressed方法,可 ...

  7. jdk1.8新特性应用之Iterable

    我们继续看lambda表达式的应用: public void urlExcuAspect(RpcController controller, Message request, RpcCallback ...

  8. jdk1.8新特性之方法引用

    方法引用其实就是方法调用,符号是两个冒号::来表示,左边是对象或类,右边是方法.它其实就是lambda表达式的进一步简化.如果不使用lambda表达式,那么也就没必要用方法引用了.啥是lambda,参 ...

  9. jdk1.8新特性之lambda表达式

    lambda表达式其实就是指一个匿名函数,应用最广泛的就是匿名内部类的简化.在jdk1.8之前,我们定义一个匿名内部类可能需要写一大坨代码,现在有了lambda之后,可以写的很简洁了.但不是说lamb ...

  10. JavaSE----API之集合(Collection、List及其子类、Set及其子类、JDK1.5新特性)

    5.集合类 集合类的由来: 对象用于封装特有数据,对象多了须要存储:假设对象的个数不确定.就使用集合容器进行存储. 集合容器由于内部的数据结构不同,有多种详细容器.不断的向上抽取,就形成了集合框架. ...

随机推荐

  1. HDU 4665 Unshuffle (2013多校6 1011 )

    Unshuffle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  2. 移动端调试神器(eruda)

    在日常的移动端开发时,一般都是试用chrome浏览器的移动端模式进行开发和调试,只有在chrome调试完成,没有问题了才会上到真机测试,移动端开发的一大问题就在于此, 各种品牌各种型号手机,手机中各种 ...

  3. String.format("%0"+length+"d", arr)中的%0和"d"分别代表什么

    public static void main(String[] args) { int a = 8; String s = String.format("%04d", a); S ...

  4. UITabBarControlller 和 UINavigationController

  5. Eclipse 生成WebService客户端代码

    1. 打开Eclipse,新建一个普通的Javaproject,然后在新建的项目上右键点击项目,New---->other---->Web Services -------->Web ...

  6. web.config及<customErrors>节点之说明

    Web.config文件是一个XML文本文件,它用来储存ASP.NETWeb 应用程序的配置信息(如最常用的设置ASP.NETWeb 应用程序的身份验证方式),它可以出现在应用程序的每一个目录中.当你 ...

  7. asset bundle打包策略

    一次引用的 不单独打包 2次的看大小 小的不单独打包 2次以上单独打包 2这个值 可以测一测 取平衡

  8. 【Javascript】如何实现点的wave效果 && sinewave效果

    参考资料: sinewave效果:http://www.oneapm.com/ci/docker.html?utm_source=BaiduPaid&utm_medium=cpc&ut ...

  9. (转)Scala中协变(+)、逆变(-)、上界(<:)、下界(>:)简单介绍

    看源码的时候看到: trait ExtensionId[T <: Extension] { 没见过这个符号啊<: Scala上界(<:)和下界(>:) 1) U >: T ...

  10. PAAS云服务平台

    云计算是一种可以方便.按需从网络訪问的.可配置的.共享的资源池(如网络.server.存储.应用程序和服务)模型,且仅仅需最少的管理(服务提供方交互)就可以高速供应和公布该模型. 云计算平台的核心部分 ...