JDK9重磅增加了以下功能:
1.1. 模块化,可以将代码进行模块化的组装,需要用到什么模块再引用什么模块.减少了不必要的内存消耗和浪费.
1.2. JShell,添加了和其他的语言(比如Python)一样的交互式命令行页面,再也不必为了打印一段"Hello,World"需要先去新建一个类,然后输入一大段文字了
1.3. JavaDoc支持Html5格式规范,同时支持进行全文搜索
1.4. String内部使用byte数组保存而不是以前的char数组保存
1.5. 垃圾收集器统一采用G1进行收集
具体更多请参阅
jdk9更新内容
2.1 支持钻石操作符中操作匿名类
HashMap<String, String> map = new HashMap<>(){
@Override
public String put(String key, String value) {
System.out.println("放入了键为:" + key + "值为:" + value);
return super.put(key, value);
}
};
map.put("1", "2");
输出结果:
放入了键为:1值为:2
2.2 支持模块化
在每个模块下,都可以创建module-info.java
文件,然后在文件中可以导入其他模块或者是导出包,默认对其他模块而言是不可见的.
module cn {
requires junit;//导入所需要的包
exports cn.test;//导出,只能导出包名,而不是具体的类名,导出之后才能被其他模块引用
}
2.3 Collection和Map新增加一个静态方法of
,其中Map多了一个ofEntries
方法
List<Integer> integerList = List.of(1, 2, 3, 4, 5, 6);
integerList.forEach(System.out::println);
Set<Integer> integerSet = Set.of(1, 2, 3, 4, 5, 6);
integerSet.forEach(System.out::println);
Map<String, String> stringMap = Map.of("1", "2", "3", "4");
stringMap.forEach((k, v) -> System.out.println(k + ":" + v));
Map<String, String> entries = Map.ofEntries(Map.entry("1", "2"), Map.entry("2", "3"));
entries.forEach((k, v) -> System.out.println(k + ":" + v));
注意:创建出来的集合均是不可变更的集合,也就是不能发生任何的元素变更,包括添加,删除,修改等,只能进行获取
2.4 新增加两个Stream方法takeWhile
和dropWhile
List<Integer> integerList = List.of(1, 2, 3, 4, 5, 6, 1);
integerList.stream().takeWhile(x -> x < 5).forEach(System.out::println);
输出结果:
1
2
3
4
takeWhile
表示从头开始找适合此条件的,遇到便输出,如果碰到不合适的条件,则不输出
同理dropWhile
则刚好相反
2.5 接口中可定义private私有方法
public interface MyInterface {
//jdk7之前的版本,默认均为public
void method1();
//jdk8允许静态方法和default方法
static void method2() {
System.out.println("method2");
}
default void method3() {
System.out.println("method3");
method4();
}
//jdk9允许私有方法
private void method4() {
System.out.println("method4");
}
}
但是如果实现类中有两个同名的default方法,那么子类必须实现同名方法覆盖
2.6 流的改进
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));
try (reader;writer) {
reader.read();
} catch (IOException e) {
e.printStackTrace();
}
可以在try中进行自动的关闭流,但是请注意,此时的reader
和writer
默认都是final
的,你无法进行修改.