前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >还在用JDK8? 来看看新版本吧

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

原创
作者头像
Kokomo
发布2023-11-27 13:58:32
3600
发布2023-11-27 13:58:32
举报
文章被收录于专栏:灵墨AI探索室灵墨AI探索室

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 1\n"+"line 2\n"+"line 3\n"

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Lambda 参数的局部变量语法: var可以用于声明隐式类型的 Lambda 表达式的形式参数
    • instanceof增强:JDK 14增强了instanceof,可以直接在instanceof中进行赋值
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档