Java9
概述:java9是在2017年9月21日发布,
在java8的新特性,主要有(接口、注解、新的时间日期API、Optional类、Lambda表达式、StreamAPI)
安装:
下载地址:https://www.oracle.com/java/technologies/downloads/archive
![image-20230426220307835](https://i-blog.csdnimg.cn/blog_migrate/f54872f52bf21bbf4c7d13f19d0b4941.png)
下载的安装包 - 直接解压安装,放到指定安装目录下,安装JDK9与安装JDK8一样步骤;
查看java版本
java -version
如果之前版本是jdk8,解压安装后,直接更换环境变量就可以;
![](https://i-blog.csdnimg.cn/blog_migrate/24d9618d48dc0b44a02215ff11c173bb.png)
新特性
模块化系统
模块化可以根据模块的需要加载程序运行的class。
创建模块化文件
内容定义,需要哪些包对外访问,哪些不对外。
// 导出包
module jdk9demo {
// 导出的包
exports cn.xxx.包名;
}
// 引入包
module jdk9test {
// 引入的是 模块化名
requires jdk9demo;
}
jShell脚本
命令行模式下,进行创建文件、声明类、提供单元测试方法。
多版本兼容jar包
可以在不同JDK环境下,运行不同的jar包文件。
接口定义私有方法
public interface MyInterface {
// jdk 7 声明的抽象方法
void thod1();
// jdk 8 声明的静态抽象方法
public static void thod2(){
System.out.println("默认 static 方法");
};
// jdk 8 声明的默认方法
default void thod3(){
System.out.println("默认方法");
thod1();
thod4();
};
// jdk 9 声明的私有方法
private void thod4(){
System.out.println("私有方法");
thod1();
}
}
异常处理改变
// jdk 8 之前的写法
InputStreamReader reader = null;
try {
reader = new InputStreamReader(System.in);
reader.read();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// jdk 8 的写法
try (InputStreamReader reader2 = new InputStreamReader(System.in)) {
reader2.read();
} catch (Exception e) {
e.printStackTrace();
}
// jdk 9 的写法
InputStreamReader reader3 = new InputStreamReader(System.in);
try (reader3) {
reader3.read();
} catch (Exception e) {
e.printStackTrace();
}
String底层存储结构的变化
jdk8之前,String底层是char[]存储;
jdk9:底层使用byte[] + encoding flag(指定什么结构),StringBuffer和StringBuilder也是一样。
因为:byte一个字节、char是2个字节存储,在JVM堆空间中,String占据很大一部分,并且很多abc单字节就可以存的数据,改为了byte[],节省空间。
public final class String ..{
@Stable
private final byte[] value;
}
集合工厂方法
// jdk8 之前写法 创建只读的
List<Integer> list1 = Collections.unmodifiableList(Arrays.asList(1, 3, 4));
Set<Integer> set1 = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(1, 3, 4)));
Map<Object, Object> map1 = Collections.unmodifiableMap(new HashMap<>() {{
put("Tom", 19);
put("Tim", 25);
}});
// map1.forEach((k, v) -> System.out.println(k + " -> " + v));
// jdk9 的写法:创建只读的集合
List<Integer> list2 = List.of(1, 3, 4);
Set<Integer> set2 = Set.of(2, 3, 4);
Map<String, Integer> map2 = Map.of("Tom", 12, "Jom", 23);
Map<String, Integer> map3 = Map.ofEntries(Map.entry("TT", 14), Map.entry("MK", 39));
StreamAPI
List<Integer> lsit1 = Arrays.asList(1, 3, 4, 6, 2);
// takeWhile 从开头开始获取满足的元素,直到不满足为止
List<Integer> c1 = lsit1.stream().takeWhile(x -> x < 3).collect(Collectors.toList());
System.out.println(c1); // 结果是 3
// dropWhile 与takeWhile相反,取出不满足的,直到满足为止
List<Integer> c2 = lsit1.stream().dropWhile(x -> x < 3).collect(Collectors.toList());
System.out.println(c2); // 结果是 3
// ofNullable
Stream<Object> o1 = Stream.ofNullable(null);
long count = o1.count(); // 结果是0 不会出现异常
System.out.println(count);