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. Windows删除文件时出现,“正在准备 再循环”

    初步分析这个问题是由于文件写入时,由于意外事情的发生(如,文件太大,正在写入时你取消了,而系统又没有来得及删除没有写完的数据等原因)没有写完. 错误的类型如下 出现此问题.当你删除不成时.返回系统根目 ...

  2. Android内存优化10 内存泄漏常见情况1 静态泄漏

    1,内存泄漏到本质是该释放的对象被持久化的对象引用了,造成持久化的常见情况有1,静态持久化 2,线程持久化 线程持久化 因为存活的线程是有dvk虚拟久直接持有,所以存活的线程都是持久化的 内存泄漏1: ...

  3. [转]SSIS cannot convert between unicode and non-unicode string

    本文转自:http://www.mssqltips.com/sqlservertip/1393/import-excel-unicode-data-with-sql-server-integratio ...

  4. 【Linux】debian jessie版本安装1.9 svn

    今天封装使用官方mysql docker镜像时,发现svn版本有问题.需要更新到1.9版本.方法如下. Subversion 1.9 on Debian Jessie November 4, 2015 ...

  5. conkey conf

    update_interval 1.0 # 更新时间间隔double_buffer yes # 双缓存,解决Conky闪烁问题use_xft yes # 自定义字体xftfont DejaVu San ...

  6. Fedora 中的容器技术:systemd-nspawn

    本文将说明你可以怎样使用 Fedora 中各种可用的容器技术和学习“systemd-nspawn”的相关知识. 容器是什么? 一个容器就是一个用户空间实例,它能够在与托管容器的系统(叫做宿主系统)相隔 ...

  7. JOptionPane的经常使用4种对话框

    JOptionPane类有4个用于显示对话框的静态方法: 消息.选项.确认,输入对话框 showMessageDialog://显示一条消息并等待用户OK showConfirmDialog://显示 ...

  8. GDB+GdbServer: ARM程序调试

    arm-linux-gdb+gdbserver环境搭建以及远程调试 GDB+GdbServer: ARM程序调试 嵌入式arm linux环境中gdb+gdbserver调试 建立交叉调试环境 编译过 ...

  9. CCF-201512-3 绘图

    问题描写叙述 用 ASCII 字符来绘图是一件有趣的事情.并形成了一门被称为 ASCII Art 的艺术.比如,下图是用 ASCII 字符画出来的 CSPRO 字样. .._._.._.._-_.. ...

  10. PHP投票实现24小时间隔投票

    l  设置cookie,浏览器都有禁用或者清除cookie的功能 l  设置session,关闭浏览器就没了 所以,我们只能尽量防止重复投票现象 session_start(); //获取ip地址 i ...