hello,大家好 。
就在前几日oracle发布了JDK21,这个原本计划在今年年初就发行的版本终于和我们见面了,JDK21都发布了,不会有人还在用JDK8吧,话又说回来,JDK21的确不是一个LTS(Long Term Support,长期支持版) 的版本,随着新版JDK的发布,各位是不是该把JDK的升级提上日程了,下面为大家主要介绍一下JDK8后直到17,也就是最新的LTS版本有哪些新特性。
JDK 9:
模块化系统(Java Platform Module System,JPMS):引入了一种新的模块化编程概念,使得开发者可以将代码和依赖关系组织成更小、更可管理的模块。这有助于提高代码的可维护性和安全性。关于模块化相关的信息大家可以看下这篇文章
https://zhuanlan.zhihu.com/p/24800180
JShell:JShell是一个交互式的编程环境,允许开发者在不需要编写完整程序的情况下,快速尝试和测试Java代码片段。它提供了一个命令行界面,可以即时执行代码,并立即看到结果。
接口中定义私有方法:JDK9支持用户在接口中定义私有方法
JDK 10:
局部变量类型推断:JDK 10引入了var关键字,允许在局部变量声明时进行类型推断。编译器会根据初始化表达式的类型自动推断变量的类型,从而简化了代码,并提高了可读性。这个功能在引入lombok后也可以使用,但这个功能笔者不太建议大家用,在查看代码时看不到变量类型,着实是一件痛苦的事,写代码一时爽,但可读性并不高
代码语言:javascript复制var name = "灵墨AI探索室";System.out.println(a);
应用程序类数据共享(Application Class-Data Sharing,AppCDS):AppCDS允许多个Java进程共享相同的类元数据。这可以减少每个进程的启动时间和内存占用,因为类数据只需要加载和解析一次。
JDK 11:
JDK11是继JDK8后的第二个LTS版本
HTTP客户端标准化:JDK 11引入了一个标准化的HTTP客户端API,使得进行HTTP请求和处理响应更加方便。它提供了异步和同步的请求方式,并支持HTTP/2和WebSocket。
支持动态类文件常量(Dynamic Class-File Constants):动态类文件常量允许在类文件中引用常量,并通过动态方法进行处理。这使得Java字节码可以更灵活地处理常量,从而提供了更多的编程选项。
Lambda 参数的局部变量语法: var可以用于声明隐式类型的 Lambda 表达式的形式参数
代码语言:javascript复制String result = list.stream() .map((var x) -> x.getName()) .collect(Collectors.joining(","))
JDK 12:
紧凑型字符串(Compact Strings):JDK 12通过使用一种更紧凑的内部表示形式,减少了字符串对象的内存占用。这对于那些使用大量字符串的应用程序来说,可以显著节省内存。
Switch表达式:JDK 12扩展了switch语句的功能,允许switch作为表达式使用,并且可以使用更简洁的语法。这使得处理多个条件的逻辑更加清晰和简洁。
普通写法
代码语言:javascript复制switch (name) {
case XIAOMING:
case XIAOLI:
System.out.println("爱学习");
break;
case XIAOZHANG:
System.out.println("爱运动");
break;
case XIAOSUN:
case XIAOMENG:
System.out.println("爱睡觉");
break;}
优化后的写法
代码语言:javascript复制switch (name) { case XIAOMING, XIAOLI -> System.out.println("爱学习"); case XIAOZHANG -> System.out.println("爱运动"); case XIAOMENG, XIAOMENG -> System.out.println("爱睡觉");
}
JDK 13:
文本块(Text Blocks):文本块是一种新的字符串形式,它可以跨越多行,并且可以保留源代码中的缩进格式。这使得编写包含大段文本的字符串更加方便,提高了代码的可读性。
代码语言:javascript复制===========新版写法============
"""line 1line 2line 3"""
===========旧版写法=========
"line 1n" "line 2n" "line 3n"
动态CDS(Dynamic CDS):动态CDS允许在运行时生成类数据共享(CDS)归档文件。这进一步减少了应用程序的启动时间和内存占用,因为可以根据应用程序的特定配置动态创建CDS归档文件。
JDK 14:
instanceof增强:JDK 14增强了instanceof,可以直接在instanceof中进行赋值
代码语言:javascript复制=========旧版写法=========
Object obj = "灵墨AI探索室"; // 旧写法
if (obj instanceof String) { String s = (String) obj; System.out.println(s);}
==========新版写法========
if (obj instanceof String s) { System.out.println(s);}
Records:Records是一种新的类声明形式,用于定义不可变的数据类。它自动提供了一些标准方法,如equals()、hashCode()和toString(),从而简化了定义简单数据传输对象的代码。可以理解为简单版的lombok
JDK 15:
Sealed类:Sealed类是一种限制继承的机制,它允许开发者明确指定哪些类可以继承自该Sealed类,从而提供了更严格的类的访问控制。这有助于提高代码的安全性和可维护性。
JDK 16:
本地模式匹配(Pattern Matching for Switch):JDK 16扩展了switch表达式的模式匹配功能,使得处理复杂的条件逻辑更加方便。它允许在switch分支中使用模式匹配,并可以将匹配的结果绑定到变量。
Unix域套接字通道:JDK 16添加了对Unix域套接字(Unix Domain Socket)的支持。这允许Java应用程序通过本地文件系统进行进程间通信,从而提供了更多的通信选项。
JDK 17:
Sealed接口:类似于Sealed类,Sealed接口允许开发者限制可以实现该接口的类的范围。这提供了更严格的接口实现的访问控制,从而提高了代码的可维护性和稳定性。
基于嵌套的访问控制(Nest-Based Access Control):JDK 17引入了一种新的访问控制机制,称为基于嵌套的访问控制。它允许在类之间进行更细粒度的访问控制,并提供了更灵活的权限管理选项。
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!