还在用JDK8? 来看看新版本吧

2023-11-27 13:58:32 浏览数 (1)

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腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞