一.JDK9新特性
1.模块系统
用模块来管理各个package,通过声明某个package暴露,模块(module)的概念,其实就是package外再裹一层,不声明默认就是隐藏。因此,模块化使得代码组织上更安全,因为它可以指定哪些部分可以暴露,哪些部分隐藏。
实现目标
-
模块化的主要目的在于减少内存的开销
-
只须必要模块,而非全部jdk模块,可简化各种类库和大型应用的开发和维护
-
改进 Java SE 平台,使其可以适应不同大小的计算设备
-
改进其安全性,可维护性,提高性能
2.JShell
Jshell是在JDK 9中引入的一个交互式的命令行工具,可以运行代码片段并立即显示运行结果。
3.接口私有方法
在Java 9中,接口更加的灵活和强大,连方法的访问权限修饰符可以声明为private,此时方法将不会成为你对外暴露的API的一部分。
public interface JDK9Demo4 {
//接口默认都是共有静态常量
public static final int NUM = 10;
//接口默认方法都是抽象方法
public abstract void method1();
//jdk8接口可以有静态方法
public static void method2(){
System.out.println("接口中的静态方法");
}
//jdk8接口可以有默认方法
public default void method3(){
System.out.println("接口中的默认方法");
}
//jdk9接口可以有私有方法
private void method4(){
System.out.println("接口中的私有方法");
}
}
4.钻石操作符
在jdk8中,下面的代码会报错,而在jdk9中代码是正确的。
Comparator<Object> com = new Comparator<>() {
@Override
public int compare(Object o1, Object o2) {
return 0;
}
};
5.try 语句
Java 8 中,可以实现资源的自动关闭,但是要求执行后必须关闭的所有资源必须在try子句中初始化,否则编译不通过。
Java 9 中,用资源语句编写try将更容易,我们可以在try子句中使用已经初始化过的资源,此时的资源是final的 ,不可再被赋值。
6.String 存储结构
String 不用 char[] 来存储,改成了 byte[] 加上编码标记,节约了一些空间。
7.集合特性of()
在jdk8中,创建一个只读、不可改变的集合,必须构造和分配它,然后添加元素,最后包装成一个不可修改的集合。 它并不能表达为单个的表达式。
Java 9因此引入了方便的方法,这使得类似的事情更容易表达。
8.InputStream增强
InputStream 有了一个非常有用的方法:transferTo,可以用来将数据直接传输到 OutputStream,这是在处理原始数据流时非常常见的一种用法。
9.Stream API增强
在 Java 9 中,Stream API 变得更好,Stream 接口中添加了 4 个新的方法:takeWhile, dropWhile, ofNullable,还有个 iterate 方法的新重载方法,可以让你提供一个 Predicate (判断条件)来指定什么时候结束迭代。
10.Optional 类中stream()使用
public static void main(String[] args) throws Exception {
List<String> list = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("王五");
list.add("赵六");
Optional<List<String>> optional = Optional.ofNullable(list);
optional.stream().flatMap(x->x.stream()).limit(2).forEach(System.out::println);
list.stream().limit(2).forEach(System.out::println);
}
二.JDK10 新特性
1.局部变量类型推断
//1.局部变量初始化
var list = new ArrayList<>();
//2.增强for循环中的索引
for(var v:list){
System.out.println(v)
}
//3.传统for循环
for(var i = 0;i<100;i++){
System.out.println(i)
}
但局部变量在下面的情况中不适用:
- 初始值为null
- 方法引用
- Lambda表达式
- 数组静态化
2.新增不可变集合方法
自 Java 9 开始,Jdk 里面为集合(List / Set / Map)都添加了 of (jdk9新增)和copyOf (jdk10新增)方法,它们两个都用来创建不可变的集合,来看下它们的使用和区别。
public static void main(String[] args) throws Exception {
//示例1
var list1 = List.of("AA","BB","CC");
var list2 = List.copyOf(list1);
System.out.println(list1==list2);//true
//示例2
var list3 = new ArrayList<String>();
list3.add("AA");
list3.add("BB");
List<String> list4 = List.copyOf(list3);
System.out.println(list3==list4); //false
}
三.JDK 11新特性
1.增加ZGC垃圾回收器
ZGC, 这应该是JDK11最为瞩目的特性。 ZGC是一个并发, 基于region, 压缩型的垃圾收集器, 只有root扫描阶段会STW, 因此GC停顿时间不会随着堆的增长和存活对象的增长而变长。
优势:
-
GC暂停时间不会超过10ms
-
既能处理几百兆的小堆, 也能处理几个T的大堆(OMG)
-
和G1相比, 应用吞吐能力不会下降超过15%
-
为未来的GC功能和利用colord指针以及Load barriers优化奠定基础
-
初始只支持64位系统
2. Optional加强
3.新增HTTP客户端API
Java 9 开始引入的一个处理 HTTP 请求的的 HTTP Client API,该API 支持同步和异步,而在 Java 11 中已经为正式可用状态,你可以在java.net 包中找到这个 API。
四.JDK 14 新特性
改进的NullPointerExceptions,jdk14的空指针异常会更加具体。
五.JDK 15新特性
在JDK 15新增加了文本块。
六.JDK 16 新特性
在Java16中正式发布Switch升级,其目的是为了解决switch语句的一些不规则性成为障碍
-
比如case标签之间的默认控制行为
-
case块中的默认范围
-
无意义的break语句。
jdk16以前switch结构用法 :
public static void main(String[] args) {
int level = new Random().nextInt(4);
String strLevel;
switch (level){
case 1:
strLevel = "优秀";
break;
case 2:
strLevel = "良好";
break;
default:
strLevel = "一般";
break;
}
System.out.println(strLevel);
}
jdk16对应用法 :
public static void main(String[] args) {
int level = new Random().nextInt(4);
String strLevel;
switch (level){
case 1 -> strLevel="优秀";
case 2 -> strLevel="良好";
default -> strLevel="一般";
}
System.out.println(strLevel);
}