从此以后六个月迭代一次,小步快跑,快速迭代。
官方提供的新特性列表:
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:下载安装
1:目录结构的改变
2:模块系统
最大变化之一引入模块系统(Jigsaw 项目)—>
运行环境的碰撞与臃肿,需要加载 rt.jar
减少内存消耗
对外暴露
java9demo 模块
在引入模块
3:REPL 工具:jShell 命令
REPL(read-evaluate-print-loop)交互式编程环境
bin 目录下 jshell.exe
配好环境变量后
cmd 输入 jshell
输出:
定义变量
定义方法:
如果定义一个已经存在的方法则直接修改原本的方法
/edit add
可以直接修改 add 方法
tab 键补全
从外部文件加载源代码
/open 文件路径
受检异常
编译前异常,比如 IOExcetption
jshell 直接隐藏处理了
4:多版本兼容 jar 包
向后兼容
5:接口的私有方法
接口中放啊的访问权限修饰符可以声明为 private 的了
//声明私有方法
抽象类和接口的异同
1:声明的方式
2:内部结构
3:共同点
不能实例化,以多态的方式使用
4:不同点
单继承,多实现
6:钻石操作符的使用升级
即泛型
//JDK7
Set
//JDK8可以进行类型推断
Set
//JDK9中能够与匿名实现类共同使用钻石操作符
Set
匿名实现类与钻石操作符共同使用在 8 中会报错,Java9 可以
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:下划线
API 层面
9:String
JDK8 以前 String 以前是 char[]存储的,每个是两个字节
JDK9 使用 byte[]数组,并使用 encodeFlag 标记编码类型,防止中文等两个字节存储
UTF-16 存储都是两个字节
StringBuilder 和 StringBuffer 也是做了同样的改变。
问题:String,StringBuilder 和 StringBuffer?
10:集合
创建只读集合,不可改变的集合
//调用Collection中方法,将list变成只读的
List
//遍历JDK8
newList.forEach(System.out::println);
//对只读 Map 的创建
//匿名子类和泛型可以一起使用
Map
11:增强的 StreamAPI
JDK9 中针对 Stream 中添加了四个方法
1:takeWhile():一直取直到满足条件就不取了,不同于 filter
List
Stream
stream.takeWhile(x-x<5).forEach(System.out::println);
//此时输出为:1,2,3,4
2:dropWhile():与 takeWhile 正好相反
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.forEach(System.out::println);
//如果单元素且为null就会报空指针异常
Stream