官方文档:https://openjdk.org/projects
一、JDK8新特性
1、Lambda表达式
2、函数式编程
3、接口可以添加默认方法和静态方法,也就是定义不需要实现类实现的方法
4、方法引用
5、重复注解,同一个注解可以使用多次
6、引入Optional来避免空指针
7、引入Streams相关的API
8、引入新的Date/Time相关的API
9、新增jdeps命令行,来分析类、目录、jar包的类依赖层级关系
10、JVM使用MetaSpace代替了永久代(PermGen Space)
二、JDK9新特性
1、接口方法可以使用private来修饰
public interface InterfaceTest {
void getString();
default String getTest() {
return “”;
}
public interface InterfaceTest {
void getString();
default String getTest() {
return "";
}
/**
* jdk9新特性,接口方法可以使用private来修饰
* @author Yasin Liu
* @date 2023/6/1
* @return: java.lang.String
**/
private String getTest2() {
return "";
}
}
2、设置G1为JVM默认垃圾收集器
3、支持http2.0和websocket的API
http2.0: https://cloud.tencent.com/developer/article/2040982
重要特性:主要是API的优化,如支持HTTP2的Client API、JVM采用G1为默认垃圾收集器
三、JDK10新特性
1、局部变量类型推断,类似JS可以通过var来修饰局部变量,编译之后会推断出值的真实类型
/**
* JDK10 局部变量类型推断,类似JS可以通过var来修饰局部变量,编译之后会推断出值的真实类型
* @author Yasin Liu
* @date 2023/6/1
* @return: void
**/
@Test
public void testVar() {
var list = new ArrayList<>();
var stream = list.stream(); // infers Stream<String>
}
2、并行Full GC,来优化G1的延迟
3、允许在不执行全局VM安全点的情况下执行线程回调,可以停止单个线程,而不需要停止所有线程或不停止线程
重要特性:通过var关键字实现局部变量类型推断,使Java语言变成弱类型语言、JVM的G1垃圾回收由单线程改成多线程并行处理,降低G1的停顿时间
四、JDK11新特性
1、ZGC,ZGC可以看做是G1之上更细粒度的内存管理策略。由于内存的不断分配回收会产生大量的内存碎片空间,因此需要整理策略防止内存空间碎片化,在整理期间需要将对于内存引用的线程逻辑暂停,这个过程被称为"Stop the world"。只有当整理完成后,线程逻辑才可以继续运行。(并行回收)
2、Flight Recorder(飞行记录器),基于OS、JVM和JDK的事件产生的数据收集框架
3、对Stream、Optional、集合API进行增强
重要特性:对于JDK9和JDK10的完善,主要是对于Stream、集合等API的增强、新增ZGC垃圾收集器
/**
* JDK11 list新增API
* @author Yasin Liu
* @date 2023/6/1
* @return: void
**/
@Test
public void testList() {
List<String> stringList = List.of("a", "b", "c");
// stringList.remove("c");
// stringList.add("d"); 注意这里返回的list不是java.util下的list 不可继续add或remove元素
System.out.println(stringList);
}
/**
* JDK11 list新增API
* @author Yasin Liu
* @date 2023/6/1
* @return: void
**/
@Test
public void testStream() {
List<String> stringList = new ArrayList<>();
stringList.add("a");
stringList.add("b");
stringList.add("a");
stringList.add("c");
stringList.add("d");
System.out.println(stringList);
// 流中获取判定为真的元素,判定为假的时候 就停止判定
List<String> collect = stringList.stream().takeWhile(s -> s.equalsIgnoreCase("a")).collect(Collectors.toList());
System.out.println(collect);
// 从流中获取为假的元素,判定为真丢弃,直到判定为假,停止判定
List<String> strings = stringList.stream().dropWhile(s -> s.equalsIgnoreCase("a")).collect(Collectors.toList());
System.out.println(strings);
//无限流通过中间的判断创建有限流
List<Integer> collect1 = Stream.iterate(1, t -> t * 3 + 1).limit(3).collect(Collectors.toList());
System.out.println(collect1);
}
@Test
public void testStreamofNull() {
String str = null;
Stream<String> stream = Stream.of(str);
System.out.print("of: ");
stream.forEach(System.out::println);
//创建流的时候可传入null 防止出现空指针异常
Stream<String> stream2 = Stream.ofNullable(str);
System.out.print("ofNullable: ");
stream2.forEach(System.out::println);
}
五、JDK12新特性
1、Shenandoah GC,新增的GC算法
2、switch 表达式语法扩展,可以有返回值
/**
* JDK12 switch 表达式语法扩展,可以有返回值
* @author Yasin Liu
* @date 2023/6/1
* @return: void
**/
@Test
public void testSwitch() {
int i = switch (MONDAY) {
case MONDAY -> 1;
case TUESDAY -> 2;
case WEDNESDAY -> 3;
case THURSDAY -> 4;
case FRIDAY -> 5;
case SATURDAY -> 6;
case SUNDAY -> 7;
};
System.out.println(i);
}
3、G1收集器的优化,将GC的垃圾分为强制部分和可选部分,强制部分会被回收,可选部分可能不会被回收,提高GC的效率
重要特性:switch表达式语法扩展、G1收集器优化、新增Shenandoah GC垃圾回收算法
五、JDK13新特性
1、Socket的底层实现优化,引入了NIO;
NIO: https://www.cnblogs.com/mikechenshare/p/16587635.html
2、switch表达式增加yield关键字用于返回结果,作用类似于return,如果没有返回结果则使用break;
/**
* JDK13 2、switch表达式增加yield关键字用于返回结果,作用类似于return,如果没有返回结果则使用break;
* @author Yasin Liu
* @date 2023/6/1
* @return: void
**/
@Test
public void testSwitchYield() {
int errorCode = 404;
String message = switch (errorCode) {
case 404:
yield "Not found!";
case 500:
yield "Internal server error!";
// No default
default:
throw new IllegalStateException("Unexpected value: " + errorCode);
};
System.out.println(message);
}
3、ZGC优化,将标记长时间空闲的堆内存空间返还给操作系统,保证堆大小不会小于配置的最小堆内存大小,如果堆最大和最小内存大小设置一样,则不会释放内存还给操作系统;
4、引入了文本块,可以使用"""三个双引号表示文本块,文本块内部就不需要使用换行的转义字符;
/**
* JDK13,引入了文本块,可以使用"""三个双引号表示文本块,文本块内部就不需要使用换行的转义字符;
* @author Yasin Liu
* @date 2023/6/1
* @return: void
**/
@Test
public void testTextField() {
System.out.println("""
<html>
<body>
<p>Hello, world</p>
</body>
</html>
""");
System.out.println("<html>\n" +
" <body>\n" +
" <p>Hello, world</p>\n" +
" </body>\n" +
"</html>\n");
}
重要特性:ZGC优化,释放内存还给操作系统、socket底层实现引入NIO
六、JDK14新特性
1、instanceof类型匹配语法简化,可以直接给对象赋值,如if(obj instanceof String str),如果obj是字符串类型则直接赋值给了str变量;
/**
* JDK14 instanceof类型匹配语法简化,可以直接给对象赋值,如if(obj instanceof String str),如果obj是字符串类型则直接赋值给了str变量;
* @author Yasin Liu
* @date 2023/6/1
* @return: void
**/
@Test
public void testInstanceof() {
Object obj = new String("123");
if (obj instanceof String s) {
System.out.println(s);
}
}
2、引入record类,类似于枚举类型,可以向Lombok一样自动生成构造器、equals、getter等方法;
3、NullPointerException打印优化,打印具体哪个方法抛的空指针异常,避免同一行代码多个函数调用时无法判断具体是哪个函数抛异常的困扰,方便异常排查;
七、JDK15新特性(2020年9月)
1、隐藏类 hidden class;
2、密封类 sealed class,通过sealed关键字修饰抽象类限定只允许指定的子类才可以实现或继承抽象类,避免抽象类被滥用;
sealed class A {} // 密封类,必须被继承
final class A_1 extends A { } // 密封类的子类可以是final、sealed或non-sealed(即普通类)
non-sealed class A_2 extends A { }
sealed class A_3 extends A permits A_3_1, A_3_2 { } // 密封类可以指定只能哪些子类可以继承它
non-sealed class A_3_1 extends A_3 { }
final class A_3_2 extends A_3 { }
// non-sealed class A_3_3 extends A_3 {} // 没有指定该类继承A_3
八、JDK16新特性(2021年3月)
1、ZGC性能优化
2、instanceof模式匹配
3、record的引入
JDK16相当于是将JDK14、JDK15的一些特性进行了正式引入
九、JDK17新特性(2021年9月)(LTS版本)
1、正式引入密封类sealed class,限制抽象类的实现;
2、统一日志异步刷新,先将日志写入缓存,然后再异步刷新;
虽然JDK17也是一个LTS版本,但是并没有像JDK8和JDK11一样引入比较突出的特性,主要是对前几个版本的整合和完善