从此以后六个月迭代一次,小步快跑,快速迭代。
官方提供的新特性列表:
https://docs.oracle.com/javase/9/whatsnew/toc.htm#JSNEW-GUID-C23AFD78-C777-460B-8ACE-58BE5EA681F6
或参考 OpenJDK
http://openjdk.java.net/projects/jdk9/
在线 OracleJDK9Documentation
https://docs.oracle.com/javase/9/

1:下载安装

与以前版本不冲突,安装 jdk 并安装 jre
配置环境变量

1:目录结构的改变

Java9 - 图1

Java9 - 图2

不包含 jre 目录了

2:模块系统

最大变化之一引入模块系统(Jigsaw 项目)—>
运行环境的碰撞与臃肿,需要加载 rt.jar
减少内存消耗
对外暴露
java9demo 模块
Java9 - 图3

在引入模块
Java9 - 图4

3:REPL 工具:jShell 命令

Java9 - 图5

REPL(read-evaluate-print-loop)交互式编程环境
bin 目录下 jshell.exe
配好环境变量后
cmd 输入 jshell
输出:
定义变量
定义方法:
如果定义一个已经存在的方法则直接修改原本的方法
/edit add
可以直接修改 add 方法
tab 键补全
从外部文件加载源代码
/open 文件路径
受检异常
编译前异常,比如 IOExcetption
jshell 直接隐藏处理了

4:多版本兼容 jar 包

向后兼容
Java9 - 图6

5:接口的私有方法

接口中放啊的访问权限修饰符可以声明为 private 的了
Java9 - 图7

//声明私有方法
抽象类和接口的异同
1:声明的方式
2:内部结构
3:共同点
不能实例化,以多态的方式使用
4:不同点
单继承,多实现

6:钻石操作符的使用升级

即泛型
//JDK7
Set set = new HashSet();
//JDK8可以进行类型推断
Set set = new HashSet<>();
//JDK9中能够与匿名实现类共同使用钻石操作符
Set set = new HashSet<>(){};
匿名实现类与钻石操作符共同使用在 8 中会报错,Java9 可以
Java9 - 图8

7:try 语句优化

流资源的关闭
JDK7 以前
InputStreamReader reader = null;
try{
reader = new InputStreamReader(System.in);
//读取数据的过程
reader.read();
}catch(IOException e){
e.printStackTrace();
}finally{
//资源的关闭操作
if(reader!=null){
try{
reader.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
JDK8 在 try 中声明的资源会自动关闭,不用显示处理资源的关闭,必须在资源对象实例化必须放在 try()中
try(InputStreamReader reader = new InputStreamReader(System.in)){
reader.read();
}catch(IOException e){
e.printStackTrace();
}
JDK9 支持在外部声明资源文件,此时的 reader 是 final 的,不可再被赋值。而且可以传多个,然后用;分开
InputStreamReader reader = new InputStreamReader(System.in);
OutputStreamReader writer = new OutputStreamWriter(System.in);
try(reader;writer){
reader.read();
}catch(IOException e){
e.printStackTrace();
}

8:下划线

String _是不允许的,是一个特殊的关键字

API 层面

9:String

JDK8 以前 String 以前是 char[]存储的,每个是两个字节
JDK9 使用 byte[]数组,并使用 encodeFlag 标记编码类型,防止中文等两个字节存储
UTF-16 存储都是两个字节
StringBuilder 和 StringBuffer 也是做了同样的改变。
问题:String,StringBuilder 和 StringBuffer?

10:集合

创建只读集合,不可改变的集合
//调用Collection中方法,将list变成只读的
List newList = Collections.unmodifiablelist(list);
//遍历JDK8
newList.forEach(System.out::println);
//对只读 Map 的创建
//匿名子类和泛型可以一起使用
Map map = COllections.unmodifiableMap(new HashMap<>(){
{
put(“1”,1);
put(“2”,2);
put(“3”,3);
}
})
//遍历
map.forEach((k,v)->System.out.println(k + “:” + v));
//JDK9 中提供了更加方便的只读集合方法
//创建只读list
List list = List.of(1,2,3);
list.forEach(System.out::println);
//创建只读Set
Set set = Set.of(2,3,4);
//创建只读Map法一
Map map = Map.of(“1”,1,”2”,2,”3”,3);
//创建只读Map法二
Map map = Map.ofEntries(Map.entry(“1”,1),Map.entry(“2”,2));

11:增强的 StreamAPI

JDK9 中针对 Stream 中添加了四个方法
1:takeWhile():一直取直到满足条件就不取了,不同于 filter
List list = Arrays.asList(1,2,3,4,5,6,7,8);
Stream stream = list.stream();
stream.takeWhile(x-x<5).forEach(System.out::println);
//此时输出为:1,2,3,4
2:dropWhile():与 takeWhile 正好相反
List list = Arrays.asList(1,2,3,4,5,6,7,8);
Stream stream = list.stream();
stream.dropWhile(x-x<5).forEach(System.out::println);
//此时输出为:5,6,7,8
3:ofNullable
Java8 中 Stream 不能完全为 null,否则会报空指针异常。而 Java9 中可以使用 ofNullable 方法创建一个单元素
//Stream其中一种实例化方法of

Stream stream = Stream.of(1,2,3,null);
//此时没有问题
stream.forEach(System.out::println);

//如果单元素且为null就会报空指针异常
Stream stream = Stream.of(null);

//JDK9中可以创建
Stream stream = Stream.ofNullAble(“Tom”);
System.out.println(stream.count());//输出1
Stream stream = Stream.ofNullAble(null);
System.out.println(stream.count());//输出0
4:iterator()的重载
Stream 的实例化方法:
通过集合的 stream()
通过数组工具类 Arrays
Stream 中静态方法 of
iterator()/gen
//JDK8中
Stream.iterator(0,x->x+1).limit(10).forEach(System.out::println);
//输出0 1 2 3 4 5 6 7 8 9
//JDK9中对其进行重载,添加一个判定条件
Stream.iterate(0,x->x<10,x->x+1).forEach(System.out::println);

12:optional 的变化

可以转换成 stream
Optional> optional = Optional.ofNullable(list);

Stream stream = optional.stream().flatMap(x->x.stream());
stream.forEach(System.out::println);

13:高分辨率图像 API

14:全新的 HTTP 客户端 API

2015 年推出 HTTP2
HTTP1.1 和 HTTP2 的主要区别在哪里?
区别在如何在客户端和服务器之间构件和传输数据
Http1 依赖于请求响应周期,Http2 允许服务器 push 数据,它可以发送比客户端请求更多的数据,这使得他可以优先处理并发送对于首先加载网页至关重要的数据
//JDK9中可以使用HttpClient替换原有的HttpURLConnection
HttpClient client = HttpClient.newHttpClient();
HttpRequest req = HttpRequest.newBuilder(URL.create(“http://www.baidu.com")).GET().build();
HttpResponse response = null;
response = client.send(req,HttpResponse.BodyHandler.asString());
System.out.println(response.statusCode());
System.out.println(response.version.name());
System.out.println(response.body());

15:Deprecated 的 API

抛弃了几个不常用的 API,主要是 Applet API

16:智能 Java 编译工具

sjavac 慢慢代替 javac

17:统一的 JVM 日志系统

G1 作为了默认垃圾回收器

转载 https://www.yuque.com/jykss/jykss/zezf4y#VxCy7