JDK 各版本部分特性说明
jdk1.8
- Lambda 表达式和函数式接口
定义: 允许将函数作为一个方法的参数(函数作为参数)或将代码作为数据(函数作为值)。
示例:(a, b) -> a + b
说明: 通过invokedynamic指令实现() ‐> { 代码语句 }
的函数形式代替内部匿名类。lambda在编译时,不会创建一个单独的class文件,说明编译之后lambda并不是以匿名内部类的形式存在。 - 类型注解
定义:提供了在任何使用类型的地方添加注解的能力。
示例:@NonNull String name; - 新的日期/时间 API
定义:全新的API,用于日期和时间的操作,替代旧的Date和Calendar。
示例:LocalDate.now(); - 默认方法和静态方法
定义:允许在接口中定义有具体实现的方法,不破坏与旧版本的兼容性。
示例:default void show() { System.out.println(“Default Method”); } - Stream API
定义:新的抽象,允许以函数式方式处理数据序列。
示例:list.stream().filter(x -> x > 5).collect(Collectors.toList()); - Nashorn JavaScript 引擎
定义:一个新的JavaScript引擎,用于在Java应用程序中执行JavaScript代码。
示例:ScriptEngine engine = new ScriptEngineManager().getEngineByName(“nashorn”); - 类加载器改进
定义:对类加载器进行的一系列改进,提高其性能和灵活性。
示例:使用ClassLoader的新方法和改进。 - 并行数组操作
定义:提供并行处理数组的能力,利用多核处理器的优势。
示例:Arrays.parallelSort(myArray); - 改进的线程局部变量
定义:对ThreadLocal类的增强,以更高效地存储线程特定的数据。
示例:ThreadLocal threadLocal = ThreadLocal.withInitial(() -> 0); - Optional 类型
定义:一个可以包含或不包含值的容器对象,可以有效地表示“值或无值”并避免null。
示例:Optional<String> optional = Optional.of("test");
public static void hello(String str){
if(str != null) {
System.out.println(str.toLowerCase());
}
}
可写为
public static void hello(String str){
Optional
.ofNullable(str) //将str包装进Optional
.ifPresent(s -> { //ifPresent表示只有对象不为null才会执行里面的逻辑,实现一个Consumer(接受一个参数,返回值为void)
System.out.println(s);
});
}
或
public static void hello(String str){
Optional
.ofNullable(str) //将str包装进Optional
.ifPresent(System.out::println);
//println也是接受一个String参数,返回void,所以这里使用我们前面提到的方法引用的写法
}
jdk1.9
- Jigsaw 模块化系统 (JPMS)
定义:为Java引入的模块系统,允许将应用程序或库划分为不同的模块。
示例:module com.myapp { requires java.base; }
- 钻石操作符的适用范围扩展
定义:允许在匿名内部类中使用钻石操作符,使代码更简洁。
示例:Handler<String> handler = new Handler<>() { /*...*/ };
- 接口私有方法
定义:在接口中定义私有方法,帮助组织方法实现,而不暴露给外部。
示例:interface MyInterface { private void myPrivateMethod() { /*...*/ } }
- 改进的 try-with-resources 语句
定义:允许在try-with-resources语句中引用在外部声明的final或effectively final变量。
示例:
final Resource resource = new Resource();
try (resource) { /*...*/ }
- 改进的 Optional 类型
定义:为Optional添加了新的有用的方法。
示例:optional.orElseThrow(); - 改进的 Stream API
定义:为Stream添加了新的方法和特性。
示例:list.stream().takeWhile(x -> x < 5).collect(Collectors.toList()); - 集合工厂方法
定义:简洁的方法创建不可变集合。
示例:List list = List.of(“A”, “B”, “C”); - Flow API
定义:定义了发布-订阅框架的标准。
示例:使用Flow.Publisher, Flow.Subscriber等进行响应式编程。 - 改进的 Javadoc
定义:Javadoc工具的改进,包括更好的HTML5支持和搜索功能。
示例:生成的Javadoc页面中的搜索框。 - 改进的 Process API
定义:改进的API,用于管理和控制操作系统进程。
示例:ProcessHandle.current().pid(); - 改进的 HTTP/2 客户端
定义:引入了新的HTTP/2客户端API,替代HttpURLConnection。
示例:使用HttpClient, HttpRequest, HttpResponse进行HTTP请求。 - JShell交互式编程
Java 9为我们通过了一种交互式编程工具JShell - 集合类新增工厂方法
Map<String, Integer> map = Map.of("AAA", 18, "BBB", 20);
- 改进的 Stream API
Stream
.of(null) //如果传入null会报错
.forEach(System.out::println);
jdk 10
- 局部变量类型推断
定义:允许Java编译器推断局部变量的类型,使代码更简洁。
示例:var list = new ArrayList<String>();
- 并行全垃圾回收器
定义:并行GC的改进,使其能够在Full GC阶段并行处理。
示例:在JVM启动参数中使用-XX:+UseParallelGC。 - 应用类数据共享
定义:允许应用程序之间共享类元数据,以减少启动时间和JVM内存使用。
示例:在JVM启动参数中使用-XX:+UseAppCDS。 - 基于时间的版本控制
定义:新的版本命名策略,基于时间而不是任意命名。
示例:使用如10.2018.04这样的版本号。
jdk 11
Java 11 是继Java 8之后的又一个TLS长期维护版本,在Java 17出现之前,一直都是此版本作为广泛使用的版本,其中比较关键的是用于Lambda的形参局部变量语法。
- 支持lambda中使用 var
Counsumer<String> consumer = (var str)->{}
- 针对于String类的方法增强
var str = "AB\nC\nD";
System.out.println(str.isBlank()); //isBlank方法用于判断是否字符串为空或者是仅包含空格
str
.lines() //根据字符串中的\n换行符进行切割,分为多个字符串,并转换为Stream进行操作
.forEach(System.out::println);
String str = "ABCD"; //比如现在我们有一个ABCD,但是现在我们想要一个ABCDABCD这样的基于原本字符串的重复字符串
System.out.println(str.repeat(2)); //一个repeat就搞定了
String str = " A B C D ";
System.out.println(str.strip()); //去除首尾空格
System.out.println(str.stripLeading()); //去除首部空格
System.out.println(str.stripTrailing()); //去除尾部空格
- HTTP/2 客户端增强
定义:HTTP/2的正式客户端,代替JDK 9中的试验版本。
示例:使用HttpClient, HttpRequest, 和HttpResponse进行HTTP/2请求。新的API支持最新的HTTP2和WebSocket协议。
public static void main(String[] args) throws URISyntaxException, IOException, InterruptedException {
HttpClient client = HttpClient.newHttpClient(); //直接创建一个新的HttpClient
//现在我们只需要构造一个Http请求实体,就可以让客户端帮助我们发送出去了(实际上就跟浏览器访问类似)
HttpRequest request = HttpRequest.newBuilder().uri(new URI("https://www.baidu.com")).build();
//现在我们就可以把请求发送出去了,注意send方法后面还需要一个响应体处理器(内置了很多)这里我们选择ofString直接吧响应实体转换为String字符串
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
//来看看响应实体是什么吧
System.out.println(response.body());
}
- 单元测试框架 JUnit 5
定义:新的单元测试框架,提供了许多新特性和改进。
示例:@Test和Assertions.assertEquals(expected, actual); - ZGC 垃圾回收器
定义:一个可扩展的低延迟垃圾回收器。
示例:在JVM启动参数中使用-XX:+UseZGC。 - 改进的启动器
定义:允许直接运行源代码文件,无需先编译。
示例:运行java MyFile.java直接执行Java源代码。 - Unicode 10.0 支持
定义:支持最新的Unicode标准,增加了新的字符集。 - 原生 TLS 1.3 支持
定义:增加了对最新的安全传输层协议的支持。 - 改进的 Epsilon 垃圾回收器
定义:一个不做任何内存回收的垃圾回收器,主要用于性能测试。
示例:在JVM启动参数中使用-XX:+UseEpsilonGC。
jdk 12
- Shenandoah 垃圾回收器
定义:一个低延迟的并发垃圾回收器。
示例:在JVM启动参数中使用-XX:+UseShenandoahGC。 - 默认 CDS 归档
定义:提高启动速度通过默认的类数据共享归档。
示例:使用JVM参数-Xshare:auto。 - 增强的 Switch 语句
定义:为Switch语句添加多值情况和其他增强功能。
示例:switch (day) { case MONDAY, TUESDAY -> System.out.println(“Early week”); } - 改进的 G1 清理阶段
定义:优化G1垃圾回收器的清理阶段,提高性能。
5. 改进的 AArch64 处理器支持
定义:增强了对AArch64架构的支持和优化。
JDK 13
1.改进的 Switch 表达式
定义:Switch表达式的进一步改进,提供更简洁的语法。
示例:int num = switch (day) { case MONDAY -> 1; case TUESDAY -> 2; };
2. Text Blocks
定义:允许多行字符串,使字符串字面值更加简洁。编写复杂字符串,这样就不用再去用那么多的转义字符了.
示例:
String s = """
adsdf"dfd"/df\sdfds
""";
- ZGC 调整策略
定义:ZGC的优化和调整,以更好地应对不同的工作负载。 - 通过 JVM 选项打印垃圾回收事件
定义:更详细的垃圾回收日志选项,帮助调试和性能分析。 - ZGC 和 Shenandoah 增加副本数
定义:这两种垃圾回收器的改进,以提高效率和吞吐量。
JDK 14
- Switch 表达式增强
定义:进一步的Switch表达式增强,使其更加功能强大和灵活。
public static String grade(int score){
score /= 10; //既然分数段都是整数,那就直接整除10
return switch (score) { //增强版switch语法
case 10, 9 -> "优秀"; //语法那是相当的简洁,而且也不需要我们自己考虑break或是return来结束switch了(有时候就容易忘记,这样的话就算忘记也没事了)
case 8, 7 -> "良好";
case 6 -> "及格";
default -> "不及格";
};
}
- 简化的局部变量类型推断, 新的instanceof语法
定义:进一步简化了局部变量的类型推断,使代码更加简洁。
if(obj instanceof Student student) { //首先判断是否为Student类型
return student.name.equals(this.name); //最后比对属性是否一样
}
- 特定的 NullPointerException 堆栈跟踪
定义:当发生NullPointerException时,提供更详细的信息来确定问题的来源。 - Pattern Matching for instanceof
定义:简化了instanceof操作的类型检查和类型转换。
示例:if (obj instanceof String s) { System.out.println(s.length()); } - 双倍精度浮点数和整数算术操作 API
定义:新增的API,支持大数字的浮点和整数运算。
示例:使用Math.multiplyExact, Math.addExact等方法。
JDK 15
- 全局垃圾收集器
定义:一个实验性的垃圾收集器,旨在为所有内存分配提供低延迟。 - 改进的 G1 垃圾回收器
定义:对G1垃圾回收器的继续改进,提高其性能和效率。 - 简化的元注解语法
定义:提供了一种简化的方式来指定注解的目标类型。
示例:@Target(TYPE_USE) @interface NonNull {} - Records 类型(预览功能)
定义:为简单的数据传输对象提供一个简洁的语法。
示例:record Point(int x, int y) {} - 改进的 ZGC
定义:对ZGC垃圾收集器的进一步优化和改进。
JDK 16
- record 记录类型
记录类型在Java 16才正式开放使用
public record Account(String username, String password) { //直接把字段写在括号中
}
- 更好的垃圾回收日志信息
定义:增强了垃圾回收日志的详细度和可读性。 - 改进的 Vector API
定义:为SIMD硬件指令提供了Java API,允许更高效的并行计算。
示例:使用Vector类进行并行操作。 - 操作系统信息访问 API
定义:提供API来查询和访问操作系统的详细信息。
示例:使用OperatingSystemMXBean。 - 优化的方法/调用 API
定义:改进的方法调用API,提供更高的性能和灵活性。 - 改进的 AES 密码算法实现
定义:提供了更高效的AES加密和解密实现。
jdk 17
- 密封类型
在Java中,我们可以通过继承(extends关键字)来实现类的能力复用、扩展与增强。但有的时候,可能并不是所有的类我们都希望能够被继承。所以,我们需要对继承关系有一些限制的控制手段,而密封类的作用就是限制类的继承。
public sealed class A permits B{ //在class关键字前添加sealed关键字,表示此类为密封类型,permits后面跟上允许继承的类型,多个子类使用逗号隔开
}
密封类型有以下要求:
1、可以基于普通类、抽象类、接口,也可以是继承自其他接抽象类的子类或是实现其他接口的类等。
2、必须有子类继承,且不能是匿名内部类或是lambda的形式。
3、sealed写在原来final的位置,但是不能和final、non-sealed关键字同时出现,只能选择其一。
4、继承的子类必须显式标记为final、sealed或是non-sealed类型。
- 嵌套的代码块作用域
定义:允许在单个方法或代码块中定义多个嵌套的作用域。
示例:
{
int x = 10;
{
int y = 5;
System.out.println(x + y);
}
}
- 自定义的垃圾回收器策略
定义:允许开发者使用自定义的垃圾回收策略。 - 支持 C++ 14 语言特性
定义:JVM的内部代码现在可以使用C++ 14的语言特性。 - 改进的弱引用
定义:对WeakReference类的改进,使其更加高效。 - 改进的 ZGC 和 Shenandoah 垃圾回收器
定义:对这两个垃圾回收器的进一步优化和改进。
JDK 18
- 增强的垃圾回收器接口
定义:提供了更加灵活和强大的垃圾回收器接口。 - 支持 Loom 协程的 JVM 机制
定义:为Java引入的协程支持,提供轻量级的并发模型。
示例:使用Fiber和FiberScope进行协程编程。 - ZGC 和 Shenandoah 垃圾回收器进一步改进
定义:对这两个垃圾回收器的进一步优化。 - 底层 JVM 线程池的重新设计
定义:对JVM内部线程池的架构进行的重大改进。
参考摘录:
https://blog.csdn.net/WNX10086/article/details/135006982
https://blog.csdn.net/yueerba126/article/details/133487598
若有凝问或错误,请指出,我好及时改正,让我们一起进步!
email : binary_space@126.com
qq : 103 586 2795
敲门砖: 代码谱写人生