Java 9新特性
1、jdk 目录结构
JDK9 具体目录结构如下所示:
bin: 该目录包含所有的命令。 conf: 包含用户可以编辑的配置文件,例如以前位于 jre\lib 目录中的.properties 和 .policy 文件。 include: 包含一些编译本地代码时使用的 C/C++头文件。 jmods: 包含 JMOD 格式的平台模块,创建自定义运行映射时需要它。 legal: 包含法律声明。 lib: 包含非 Windows 平台上动态链接的本地库,其子目录和文件不应由开发人员直接编辑或使用。Windows 平台的动态链接库直接放在了 bin 目录下。注:JDK9 目录中不再有 jre 子目录,以前 JDK 和 JRE 是分开的,二者主要区别在于 JRE 只提供运行环境,而 JDK 额外提供了 Java 编译器。
2、模块化
module-info.java:该文件必须位于项目的根目录中。该文件用于定义模块需要什么依赖,以及那些包被外部使用。 exports:控制着那些包可以被其他模块访问到,所有不被 exports 的包默认都被封装在模块里面不被外界所使用。 requires:指明对其他模块的依赖。
3、JShell
JShell 是 Java 的交互式命令行。输入/help 查看帮助。
4、多版本兼容 jar
使用 javac、jar 等命令可以以任意版本编译、打包 Java 代码。
5、接口支持私有方法
Java8 之前接口只能定义方法的声明,这些方法都是共有的,接口的实现类必须实现这些方法。 Java8 中接口可以使用 default 关键字定义默认方法,这样接口的实现类即便不实现这些方法也不会报错。这个改进可以大大减少 Java 中 AbstractClass 的数量。 Java9 中接口可以使用 private 关键字定义私有方法,这样接口的默认方法就可以把逻辑放到私有方法中。接口的实现类无法访问接口的私有方法。
public class Haha {
interface Animal {
//Java8提供了默认方法,却没有提供私有方法,这就十分脑残
default void shout() {
this.realShout();
}
//接口只能定义default方法和私有方法,不能什么都不写
//void run(){}
//Java9接口终于提供了私有方法,以供默认方法调用
private void realShout() {
System.out.println("我该怎么叫?");
}
}
static class Dog implements Animal {
//无法重写realShout,只能重写shout
@Override
public void shout() {
System.out.println("汪汪汪");
}
}
public static void main(String[] args) {
Dog d = new Dog();
d.shout();
}
}
6、改进 try-with-resources
Java8 以前为了关闭打开的资源,需要写很多 finally 代码。 Java8 提供了增强的 try 语句,可以让 try 中的资源在抛出异常时或者正常结束时自动关闭资源。 Java9 进一步增强 try 语句,try 中可以指明让 try 接管的资源。
import java.io.Closeable;
import java.io.IOException;
class Haha {
static class Resource implements Closeable {
@Override
public void close() throws IOException {
System.out.println("I am closed");
}
}
public static void main(String[] args) {
//java8中只能把资源定义在try语句中
try (Resource r1 = new Resource(); Resource r2 = new Resource()) {
} catch (IOException e) {
e.printStackTrace();
}
//Java9中资源可以放在try外面
Resource r3 = new Resource();
Resource r4 = new Resource();
try (r3; r4) {
} catch (Exception e) {
e.printStackTrace();
}
}
}
7、增强钻石运算符
这个特性实际上是更加强大的自动类型推导机制。
Set<String> a = new HashSet<>() {
@Override
public boolean add(String s) {
return super.add(s);
}
};
8、限制使用下划线标识符
在 Java 中,_
和$
都是合法的标识符。但从 JDK9 开始,_
成为不合法的标识符。
9、更省内存的 String 实现
String 类型无疑是 Java 中最常用的非基本类型,以前它的底层实现是用char[]
来存储各个字符,这种方式导致一些 ASCII 码需要占用两个字节来保存,因为一个 char 占用 2 个字节。JDK9 中将 String 的底层实现改成了byte[]
,同样 StringBuilder 也进行了相同的变换。
10、集合的 of 函数快速创建集合
告别铅与火,走向光与电。以前的 Java 创建集合对象只能不停地 add,现在可以直接使用 of。需要注意,使用 of 创建的集合是只读的,尝试修改它们会抛出异常java.lang.UnsupportedOperationException
。 List.of()
和Set.of()
接受的变量类型会自动求类型的最近公共祖先,在 Java 中一切对象皆为 Object,整个类型系统可以视为一棵树。Map.of()
接受的变量类型是交替的 K、V 对,对于K和V会分别计算最近公共祖先。
import java.util.List;
import java.util.Map;
import java.util.Set;
class Haha {
public static void main(String[] args) {
List<String> a = List.of("one", "two", "three");
//a.add("four");//java.lang.UnsupportedOperationException
System.out.println(a);
System.out.println(List.of("one two three".split("\\s+")));
System.out.println(Set.of("one two three".split("\\s")));
System.out.println(Map.of(1, "one", 2, "two", 3, "three"));
}
}
11、增强的stream API
(1)takeWhile
从第一个元素开始,一直到不满足条件为止。
List<Integer> list = Arrays.asList(45,43,76,87,42,77,90,73,67,88);
list.stream().takeWhile((x) -> x < 80 ).forEach(System.out::println);
(2)dropWhite
从第一个元素开始,如果满足条件则忽略该元素,一直到不满足该条件才开始接受元素。
(3)ofNullable
以前Stream不能完全为null,JDK9中可以了。
//NullPointerException
//Stream<Object> stream1 = Stream.of(null);
//System.out.println(stream1.count());
//不报异常 允许这样写
Stream<String> stringStream = Stream.of("AA", "BB", null);
System.out.println(stringStream.count());
//不报异常 允许这样写
List<String> list = new ArrayList<>();
list.add("A");
list.add(null);
System.out.println(list.stream().count());
//ofNullable() :允许值为 null
Stream<Object> stream = Stream.ofNullable(null);
System.out.println(stream.count());
Stream<String> stream2 = Stream.ofNullable("Hello World");
System.out.println(stream2.count());
(4)iterate
iterate可以充当循环用,在JDK8中iterate需要配合limit作为终止条件,这样不够灵活。JDK9中提供了类似for的形式iterate函数重载。
//JDK8 使用iterate方法,需配合limit截止。
Stream.iterate(1, (x) -> x + 1).limit(10).forEach(System.out::print);
System.out.println();
//JDK9 使用iterate的重载方法可以直接使用Predicate来截止。
Stream.iterate(1,(x) -> x <= 10, (x) -> x + 1).forEach(System.out::print);
12、全新的HTTP客户端API
HTTP,用于传输网页的协议,早在 1997 年就被采用在目前的 1.1版本中。直到 2015 年,HTTP2 才成为标准。
HTTP/1.1和HTTP/2的主要区别是如何在客户端和服务器之间构建和传输数据。HTTP/1.1 依赖于请求/响应周期。 HTTP/2 允许服务器“push”数据:它可以发送比客户端请求更多的数据。 这使得它可以优先处理并发送对于首先加载网页至关重要的数据。
Apache的HTTP Client可以被淘汰了,Java标准库越来越强大。
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
class Haha {
public static void main(String[] args) throws IOException, InterruptedException {
HttpClient cli = HttpClient.newHttpClient();
HttpResponse<String> res = cli.send(HttpRequest.newBuilder().GET().uri(URI.create("https://www.cnblogs.com")).build(), HttpResponse.BodyHandlers.ofString());
System.out.println(res.body());
}
}
其它
- java.awt.image新增多分辨率API。
- 改进的Optional类
- 统一的 JVM 日志系统
- 智能 JAVA 编译工具
- Javadoc 的 HTML5 支持
- Java 动态编译器
参考资料
https://www.cnblogs.com/peter1018/p/9209951.html
Java 9新特性的更多相关文章
- Java 8新特性-4 方法引用
对于引用来说我们一般都是用在对象,而对象引用的特点是:不同的引用对象可以操作同一块内容! Java 8的方法引用定义了四种格式: 引用静态方法 ClassName :: staticMetho ...
- Spring 4支持的Java 8新特性一览
有众多新特性和函数库的Java 8发布之后,Spring 4.x已经支持其中的大部分.有些Java 8的新特性对Spring无影响,可以直接使用,但另有些新特性需要Spring的支持.本文将带您浏览S ...
- java 8 新特性
最近在IDEA的️驱使下,看了点java8的东西,链接贴一下,,,,, 1.Java 8新特性概述2.Java 8中的 Stream API 详解[3.Java 8新特性终极指南] 简单的使用看完新特 ...
- Java 8 新特性终极版
声明:本文翻译自Java 8 Features Tutorial – The ULTIMATE Guide,翻译过程中发现并发编程网已经有同学翻译过了:Java 8 特性 – 终极手册,我还是坚持自己 ...
- Java 8新特性前瞻
快端午小长假了,要上线的项目差不多完结了,终于有时间可以坐下来写篇博客了. 这是篇对我看到的java 8新特性的一些总结,也是自己学习过程的总结. 几乎可以说java 8是目前为止,自2004年jav ...
- Java 8新特性探究(八)精简的JRE详解
http://www.importnew.com/14926.html 首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 Java小组 工具资源 - 导航条 - 首页 所有文章 资讯 ...
- Java 8 新特性1-函数式接口
Java 8 新特性1-函数式接口 (原) Lambda表达式基本结构: (param1,param2,param3) -> {代码块} 例1: package com.demo.jdk8; i ...
- 【整理】Java 8新特性总结
闲语: 相比于今年三月份才发布的Java 10 ,发布已久的Java 8 已经算是老版本了(传闻Java 11将于9月25日发布....).然而很多报道表明:Java 9 和JJava10不是 LTS ...
- 一小时上手Java 8新特性
一小时上手Java 8新特性 本文摘译自 https://www.journaldev.com/2389/java-8-features-with-examples,并做了适当增补. Iterable ...
- Java 8 新特性:1-函数式接口
(原) Java 8 新特性1-函数式接口 Lambda表达式基本结构: (param1,param2,param3) -> {代码块} Lambda表达式结构: (type1 arg1,typ ...
随机推荐
- 关于UE4音效的一些小问题
前言 前几天实在忍受不了StarterContent默认音效的折磨,去网上翻罗了一下初中时很着迷的游戏<Bounce-Tales>的音效,在导入音效时出了点问题,特此说明一下解决方案,希望 ...
- NLP中的预训练语言模型(三)—— XL-Net和Transformer-XL
本篇带来XL-Net和它的基础结构Transformer-XL.在讲解XL-Net之前需要先了解Transformer-XL,Transformer-XL不属于预训练模型范畴,而是Transforme ...
- i++和++1
概述:i++和++i 这个问题困扰了我很长时间,在这段时间里自己不止一次的怀疑自己的智商,难道自己对编程一点天赋都没有吗?此问题严重打击了我的自信心.......也曾苦苦暗自琢磨,也曾百度谷歌疯狂搜索 ...
- destoon漏洞修复关于 $do->add($post); SQL注入修改
在阿里云漏洞提示查看发现destoon有关于mobile/guestbook.php $do->add($post); SQL注入修改 漏洞名称:Destoon SQL注入 补丁文件:/mobi ...
- python批量创建txt文件,以demo.txt内的内容为文件名
#批量创建txt文件import sys,osa=open("demo.txt")n=0aList=[]for line in a.readlines(): aList.appen ...
- Linux 怎样更改locale语言设置
推荐使用UTF8编码,因为这是国际标准,能兼容任何语言的编码.在CentOS VPS下修改语言编码: localedef -c -f UTF-8 -i zh_CN zh_CN.utf8 export ...
- Hive学习之修改表、分区、列
Hive学习之修改表.分区.列 https://blog.csdn.net/skywalker_only/article/details/30224309 https://www.cnblogs.co ...
- SQL Server的字符类型
Tip1. Char/Varcahr均为非Unicode字符,意味着放非英文字符放进去会需要进行编译,将来可能会出现问题,如果这个字段将来可能要输入中文韩文日文等,建议用Nchar或Nvarchar. ...
- 北漂不易,逆风前行[给想在北京工作的java同学们诚恳的建议!]
作为一个北漂程序员(java开发),从业6年,北漂十一年,走了不少弯路,也曾孤独彷徨,楼主今天特地总结了一些经验,希望能给大家(准备做北漂 或 北漂的朋友们)一点启发.从生活.专业和薪水这2个方向来分 ...
- java --后缀符号
public class Sample { public static void main(String[] args) { , num2 = ; num1--; System.out.println ...