JDK1.9-新特性
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-新特性的更多相关文章
- JDK1.7新特性
jdk1.7新特性 1 对集合类的语言支持: 2 自动资源管理: 3 改进的通用实例创建类型推断: 4 数字字面量下划线支持: 5 switch中使用string: 6 二进制字面量: 7 简化可变参 ...
- jdk1.6新特性
1.Web服务元数据 Java 里的Web服务元数据跟微软的方案基本没有语义上的区别,自从JDK5添加了元数据功能(Annotation)之后,SUN几乎重构了整个J2EE体 系, 由于变化很大,干脆 ...
- JDK1.8 新特性
jdk1.8新特性知识点: Lambda表达式 函数式接口 *方法引用和构造器调用 Stream API 接口中的默认方法和静态方法 新时间日期API https://blog.csdn.net/qq ...
- JDK1.6新特性,WebService强化
Web service是一个平台独立的,松耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布式的互操作的应用程序. Web ...
- JDK1.5新特性,基础类库篇,集合框架(Collections)
集合框架在JDK1.5中增强特性如下: 一. 新语言特性的增强 泛型(Generics)- 增加了集合框架在编译时段的元素类型检查,节省了遍历元素时类型转换代码量. For-Loop循环(Enhanc ...
- JDK1.7新特性(2):异常和可变长参数处理
异常 jdk1.7对try--catch--finally的异常处理模式进行了增强,下面我们依次来看增强的方面. 1. 为了防止异常覆盖,给Throwable类增加了addSuppressed方法,可 ...
- jdk1.8新特性应用之Iterable
我们继续看lambda表达式的应用: public void urlExcuAspect(RpcController controller, Message request, RpcCallback ...
- jdk1.8新特性之方法引用
方法引用其实就是方法调用,符号是两个冒号::来表示,左边是对象或类,右边是方法.它其实就是lambda表达式的进一步简化.如果不使用lambda表达式,那么也就没必要用方法引用了.啥是lambda,参 ...
- jdk1.8新特性之lambda表达式
lambda表达式其实就是指一个匿名函数,应用最广泛的就是匿名内部类的简化.在jdk1.8之前,我们定义一个匿名内部类可能需要写一大坨代码,现在有了lambda之后,可以写的很简洁了.但不是说lamb ...
- JavaSE----API之集合(Collection、List及其子类、Set及其子类、JDK1.5新特性)
5.集合类 集合类的由来: 对象用于封装特有数据,对象多了须要存储:假设对象的个数不确定.就使用集合容器进行存储. 集合容器由于内部的数据结构不同,有多种详细容器.不断的向上抽取,就形成了集合框架. ...
随机推荐
- Arch linux
这里将介绍Arch Linux使用问题的解决方法,在这里拿出来和大家分享一下Linux目前较适用于小型的网络,Arch Linux 是个针对 i686i686/x86-64 优化的 Linux 发行版 ...
- Android ANR优化 2
在实际情况中,当Android项目的用户量特别大时候,一些细小的问题也会被放大,ANR问题就是一个典型的例子. 一些ANR问题只会发生在用户实际使用的情景,当系统资源比较紧张等一些特殊情况下才会遇到, ...
- 突破,Objective-C开发速学手册
<突破,Objective-C开发速学手册> 基本信息 作者: 傅志辉 出版社:电子工业出版社 ISBN:9787121207426 上架时间:2013-7-12 出版日期:2013 年8 ...
- Mysql - 登录错误
来源: 问题的引出: 我 在CentOS上装完mysql后,用navicat链接的时候,抛出MySql - SQL Error (1130): Host IP is not allowed to co ...
- mybatis 执行传入的任意sql语句
dao类 /** * 自定义sql查询 * @param sqlContent * @return */ public List<LinkedHashMap<String, Object& ...
- 判断客户端是PC还是手持设备的JS代码【转】
1.第一种: 复制代码代码如下: function IsPC() { var userAgentInfo = navigator.userAgent; var Agents = [&quo ...
- windows环境phpstorm调试环境搭建
一:安装设置xdebug 这个一般有两个步骤1:浏览器的xdebug插件安装,一般用firefox的插件,chrome好像不太好使,chrome安装后的 效果 安装后如下图所示,需要配置IDEKEY ...
- vim配置python开发环境(转)
安装 因为许多Unix衍生系统已经预装了Vim,我们首先要确认编辑器是否成功安装: vim --version 如果已经安装了,你应该看到类似下面的文字: VIM - Vi IMproved 7.3 ...
- NetBiosDomainNamesEnabled与SharePoint User Profile Service Application
本文中的内容转自参考资料中的文章. 如果域的NetBios名字跟Fully Qualified Domain Name不同的话, 那么就需要开启UPA的NetBiosDomainNamesEnab ...
- 通用测试用例大全(转自——知了.Test)
为方便平时写测试用例,整理如下: 功能 条件 测试步骤 测试数据 预期结果 备注 搜索或查询 单独遍历各查询条件,测试按各查询条件是否都能够查询出相应的值. 查询出符合条件的记录 设置 ...