Java JDK8到21演升特性汇总

Java JDK 8 到 19 演升特性汇总

文章目录

  • Java JDK 8 到 19 演升特性汇总
  • 一、版本roadmap图
  • 二、版本与特性
    • JDK8 [2014-03-18]
    • JDK11[2018-09-25]
    • JDK17【2021-09-14】
    • JDK21 [2023-09-19]

一、版本roadmap图


Oracle Java SE Support Roadmap
官方地址
JDK8,JDK11,JDK17,JDK21是长期维护的版本。spring boot3最低支持JDK17。

二、版本与特性

JDK8 [2014-03-18]

1、语言新特性
1.1接口新增默认方法与静态方法:
Interface Default Method:For creating a default method in java interface, we need to use “default” keyword with the method signature.
Interface Static Method:interface static method is similar to default method except that we can’t override them in the implementation classes.

1.2 Functional Interfaces函数式接口
含有一个显式声明函数(抽象方法)的接口称为函数接口,注释@FunctionalInterface用作检查代码块,包package java.util.function,通常使用lambda expressions来实体化函数接口。
函数式接口:函数形接口 、供给形接口、消费型接口、判断型接口。

1.2 Lambda表达式
语法:( object str,…)[参数列表] ->[箭头符号] 代码块或表达式。
特性:Lambda 的类型是从使用 Lambda 的上下文推断出来的。上下文中 Lambda 表达式需要的类型称为目标类型(一个 Lambda表达式所在的类的类型。并且必须存在一个目标类型); 匿名、函数、传递、简洁。

 Arrays.sort(new SysUser[5], (SysUser a, SysUser b) -> {return a.getUserId().compareTo(b.getUserId());});

1.3 方法引用
方法引用操作符“::”,左边是类名或者某个对象的引用,右边是方法名,有下面几种方式:
(1)对象(引用)::实例方法名 new SysUser()::getUserName
(2)类名::静态方法名 Function<Long, Long> f = Math::abs;
(3)类名::实例方法名 SysUser::getUserName
(4)类名::new SysUser::new
(5)类型[]::new Function<Integer, SysUser[]> funUsers = SysUser[]::new;

1.4 重复注解@Repeatable
重复注解机制,相同的注解可在同一地方声明多次.

@Repeatable(Annotations.class) 
public @interface MyAnnotation {  String role();  
}  
public @interface Annotations {  MyAnnotation[] value();  
}  
public class RepeatAnnotationUseOldVersion {  @MyAnnotation(role="Admin")  @MyAnnotation(role="Manager")public void doSomeThing(){  }  
} 

对比以前jdk8的注解实现:

public @interface MyAnnotation {  String role();  
}  
public @interface Annotations {  MyAnnotation[] value();  
}  public class RepeatAnnotationUseOldVersion {  @Annotations({@MyAnnotation(role="Admin"),@MyAnnotation(role="Manager")})  public void doSomeThing(){  }  
}

1.5 类库新特性
●java.util.stream类库包新特性 stream
●java.util.Optional 类新特性
●java.util.Base64 类新特性
●Java.time 类新特性
●其它常用类新增特性
●HashMap类性能提升
java.util.stream 类库包新特性
Stream流的特性
定 义:支持数据处理操作的源生成的元素序列。它并非是数据结构,也不是容器,而是一个过程。
流类型:tream 串行流、parallelStream 并行流
Stream 的源数据来于 Collection、Arrays 等类型,因为它的方法参数都是函数式接口类型,所以通常和 Lambda 表达式一起使用。
Stream 不存储数据,也不改变源数据,但它提供了对集合数据进行检索和逻辑处理的功能,包括筛选、排序、统计、计数等。

Optional
主要用来处理传入的数据的空指针NullPointerException问题。

Optional.ofNullable(person).map(p -> p.getUserName()).map(h -> h.getUserId()).ifPresent(userId->System.out.println(userId));

JDK8特性一
JDK8特性二
javainuse

JDK11[2018-09-25]

在这里插入图片描述

JDK17【2021-09-14】

JDK 17 是一个长期维护的版本(LTS)。Java 17 提供了数千个性能、稳定性和安全性更新,以及 14 个 JEP(JDK 增强提案),进一步改进了 Java 语言和平台,以帮助开发人员提高工作效率。JDK 17 包括新的语言增强、库更新、对新 Apple (Mx CPU)计算机的支持、旧功能的删除和弃用,并努力确保今天编写的 Java 代码在未来的 JDK 版本中继续工作而不会发生变化。

  • 1.语言特性增强:密封的类和接口
  • 2.工具库的更新:恢复始终严格的浮点语义、增强的伪随机数生成器
  • 3.新功能的预览和孵化API:
    • JEP 406:新增switch模式匹配(预览版)、
    • JEP 412:外部函数和内存api (第一轮孵化)、
    • JEP 414:Vector API(第二轮孵化)、
    • JEP 389:外部链接器 API(孵化器)、
    • JEP 393:外部存储器访问 API(第三次孵化)

JDK21 [2023-09-19]

JDK21共有15个新特性,较为重要新特性:

  • JEP 430:String Templates(字符串模板)
  • JEP 431:Sequenced Collections(序列化集合)
  • JEP 439:Generational ZGC(分代 ZGC)
  • JEP 441:Pattern Matching for switch(switch 的模式匹配)
  • JEP 442:Foreign Function & Memory API(外部函数和内存 API)
  • JEP 444:Virtual Threads(虚拟线程)

String Templates(字符串模板)
String Templates 提供了一种更简洁、更直观的方式来动态构建字符串。通过使用占位符${},我们可以将变量的值直接嵌入到字符串中,而不需要手动处理。
目前支持三种模板处理器:

    • STR:自动执行字符串插值,即将模板中的每个嵌入式表达式替换为其值(转换为字符串)。
    • FMT:和 STR 类似,但是它还可以接受格式说明符,这些格式说明符出现在嵌入式表达式的左边,用来控制输出的样式
    • RAW:返回一个 StringTemplate 对象,这个对象包含了模板中的文本和表达式的信息。
String name = "Lokesh";
//STR
String message = STR."Greetings \{name}.";
//FMT
String message = STR."Greetings %-12s\{name}.";
//RAW
StringTemplate st = RAW."Greetings \{name}.";
String message = STR.process(st);

Sequenced Collections(序列化集合)
Sequenced Collections(序列化集合,也叫有序集合),这是一种具有确定出现顺序(encounter order)的集合(无论我们遍历这样的集合多少次,元素的出现顺序始终是固定的)。序列化集合提供了处理集合的第一个和最后一个元素以及反向视图(与原始集合相反的顺序)的简单方法。
Sequenced Collections 包括以下三个接口:

    • SequencedCollection
    • SequencedSet
    • SequencedMap

SequencedCollection 接口:继承了 Collection接口, 提供了在集合两端访问、添加或删除元素以及获取集合的反向视图的方法。

interface SequencedCollection<E> extends Collection<E> {// New MethodSequencedCollection<E> reversed();// Promoted methods from Deque<E>void addFirst(E);void addLast(E);E getFirst();E getLast();E removeFirst();E removeLast();
}

SequencedSet接口:继承了 SequencedCollection 接口并重写了 reversed() 方法。
SequencedMap 接口:继承了 Map接口, 提供了在集合两端访问、添加或删除键值对、获取包含 key 的 SequencedSet、包含 value 的 SequencedCollection、包含 entry(键值对) 的 SequencedSet以及获取集合的反向视图的方法。

interface SequencedMap<K,V> extends Map<K,V> {// New MethodsSequencedMap<K,V> reversed();SequencedSet<K> sequencedKeySet();SequencedCollection<V> sequencedValues();SequencedSet<Entry<K,V>> sequencedEntrySet();V putFirst(K, V);V putLast(K, V);// Promoted Methods from NavigableMap<K, V>Entry<K, V> firstEntry();Entry<K, V> lastEntry();Entry<K, V> pollFirstEntry();Entry<K, V> pollLastEntry();
}

Generational ZGC(分代 ZGC)
分代 ZGC 可以显著减少垃圾回收过程中的停顿时间,并提高应用程序的响应性能。这对于大型 Java 应用程序和高并发场景下的性能优化非常有价值。 ZGenerational 设为默认值,即默认打开 ZGC 的分代 GC。

Pattern Matching for switch(switch 的模式匹配)
增强 Java 中的 switch 表达式和语句,允许在 case 标签中使用模式。当模式匹配时,执行 case 标签对应的代码。
如下代码switch 表达式使用类型模式来进行匹配:

static String formatterPatternSwitch(Object obj) {return switch (obj) {case Integer i -> String.format("int %d", i);case Long l    -> String.format("long %d", l);case Double d  -> String.format("double %f", d);case String s  -> String.format("String %s", s);default        -> obj.toString();};
}

Foreign Function & Memory API(外部函数和内存 API)
外部函数和内存 API 在 Java 17 中进行了第一轮孵化,由 JEP 412open in new window 提出。Java 18 中进行了第二次孵化,由JEP 419open in new window 提出。Java 19 中是第一次预览,由 JEP 424open in new window 提出。JDK 20 中是第二次预览,由 JEP 434open in new window 提出。JDK 21 中是第三次预览,由 JEP 442open in new window 提出。

Java 程序可以通过该 API 与 Java 运行时之外的代码和数据进行互操作。通过高效地调用外部函数(即 JVM 之外的代码)和安全地访问外部内存(即不受 JVM 管理的内存),该 API 使 Java 程序能够调用本机库并处理本机数据,而不会像 JNI 那样危险和脆弱。

Foreign Function & Memory API (FFM API) 定义了类和接口:

  • 分配外部内存:MemorySegment、MemoryAddress和SegmentAllocator;
  • 操作和访问结构化的外部内存:MemoryLayout, VarHandle;
  • 控制外部内存的分配和释放:MemorySession;
  • 调用外部函数:Linker、FunctionDescriptor和SymbolLookup。

Virtual Threads(虚拟线程)
虚拟线程在 Java 19 中进行了第一次预览,由JEP 425提出。JDK 20 中是第二次预览。最终,虚拟线程在 JDK21 顺利转正。
虚拟线程(Virtual Thread-)是 JDK 而不是 OS 实现的轻量级线程(Lightweight Process,LWP),许多虚拟线程共享同一个操作系统线程,虚拟线程的数量可以远大于操作系统线程的数量。
虚拟线程避免了上下文切换的额外耗费,兼顾了多线程的优点,简化了高并发程序的复杂,可以有效减少编写、维护和观察高吞吐量并发应用程序的工作量。
在引入虚拟线程之前,java.lang.Thread 包已经支持所谓的平台线程,也就是没有虚拟线程之前,我们一直使用的线程。JVM 调度程序通过平台线程(载体线程)来管理虚拟线程,一个平台线程可以在不同的时间执行不同的虚拟线程(多个虚拟线程挂载在一个平台线程上),当虚拟线程被阻塞或等待时,平台线程可以切换到执行另一个虚拟线程。虚拟线程、平台线程和系统内核线程的关系图如下所示:
在这里插入图片描述
四种创建虚拟线程的方法:

// 1、通过 Thread.ofVirtual() 创建
public class VirtualThreadTest {public static void main(String[] args) {CustomThread customThread = new CustomThread();// 创建不启动Thread unStarted = Thread.ofVirtual().unstarted(customThread);unStarted.start();// 创建直接启动Thread.ofVirtual().start(customThread);}
}
static class CustomThread implements Runnable {@Overridepublic void run() {System.out.println("CustomThread run");}
}// 2、通过 Thread.startVirtualThread() 、创建
public class VirtualThreadTest {public static void main(String[] args) {CustomThread customThread = new CustomThread();Thread.startVirtualThread(customThread);}
}
static class CustomThread implements Runnable {@Overridepublic void run() {System.out.println("CustomThread run");}
}// 3、通过 Executors.newVirtualThreadPerTaskExecutor() 创建
public class VirtualThreadTest {public static void main(String[] args) {CustomThread customThread = new CustomThread();ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();executor.submit(customThread);}
}
static class CustomThread implements Runnable {@Overridepublic void run() {System.out.println("CustomThread run");}
}//4、通过 ThreadFactory 创建
public class VirtualThreadTest {public static void main(String[] args) {CustomThread customThread = new CustomThread();ThreadFactory factory = Thread.ofVirtual().factory();Thread thread = factory.newThread(customThread);thread.start();}
}static class CustomThread implements Runnable {@Overridepublic void run() {System.out.println("CustomThread run");}
}

Java19 正式 GA!看虚拟线程如何大幅提高系统吞吐量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/599982.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

D-Link DES-108 交换机

D-Link DES-108 交换机 1. 百兆交换机 8 口References ​ D-Link Corporation is a Taiwanese multinational networking equipment manufacturing corporation headquartered in Taipei, Taiwan. Taiwanese&#xff1a;adj. 台湾的 n. 台湾人 headquarter [hedkwɔ:tə]&#…

汽车电子学习总结

国内的主要有比亚迪、联合汽车电子&#xff08;联电&#xff09;、麦格米特、上海电驱动&#xff1b;国外的主要有欧美系的博世、麦格纳、大陆、博格华纳&#xff1b;日系的电装、电产等公司。

AIOps探索 | 基于大模型构建高效的运维知识及智能问答平台(2)案例分享

原作者&#xff1a;擎创科技产品专家 布博士 案例分享 所需要的软件列表 本次案例的实现&#xff0c;全部采用开源或SAAS的产品来提供&#xff0c;并不涉及到私有化部署的软件产品。软件列表如下所示&#xff0c;如何申请apikey请自行研究&#xff0c;在这里不再详细说明&…

VIT用于图像分类 学习笔记(附代码)

论文地址&#xff1a;https://arxiv.org/abs/2010.11929 代码地址&#xff1a;https://github.com/bubbliiiing/classification-pytorch 1.是什么&#xff1f; Vision Transformer&#xff08;VIT&#xff09;是一种基于Transformer架构的图像分类模型。它将图像分割成一系列…

如何实现安卓端与苹果端互通

在移动应用开发中&#xff0c;如何实现安卓端和苹果端的互通是一个重要的问题。二者缺少一个都会有损失&#xff0c;那如何实现安卓端跟苹果端互通&#xff0c;下面简单的介绍几点方法来帮助你再不同的平台上实现数据交互和功能互通。 基于Web技术 使用Web技术是一种常见并且…

数字孪生与大数据和分析技术的结合

数字孪生与大数据和分析技术的结合可以为系统提供更深入的见解、支持实时决策&#xff0c;并优化模型的性能。以下是数字孪生在大数据和分析技术中的一些应用&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流…

美年大健康黄伟:从选型到迁移,一个月升级核心数据库

核心生产系统的数据库&#xff0c;从接到替换需求到完成分布式升级&#xff0c;需要多久&#xff1f;一个月&#xff0c;这是美年大健康的回答。一个月集中调配各种资源&#xff0c;美年大健康完成了应用程序基本零改造的平滑迁移&#xff0c;新数据库在成本更低的前提下&#…

2023-RunwayML-Gen-2 AI视频生成功能发展历程

RunwayML是一个人工智能工具&#xff0c;它为设计师、艺术家和创意人士提供了一种简单的方式来探索和应用机器学习技术。 RunwayML官方网页地址&#xff1a;Runway - Advancing creativity with artificial intelligence. RunwayML专区RunwayML-喜好儿aigcRunwayML 是一种先进…

P1192 台阶问题————C++

目录 台阶问题题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 解题思路Code运行结果 台阶问题 题目描述 有 N N N 级台阶&#xff0c;你一开始在底部&#xff0c;每次可以向上迈 1 ∼ K 1\sim K 1∼K 级台阶&#xff0c;问到达第 N N N 级台阶有多少种不同方…

电商平台低价品牌要如何处理

低价会影响品牌渠道的长期发展&#xff0c;同时还会衍生很多问题&#xff0c;如为了追求低价而导致的店铺窜货、商品假货等&#xff0c;对于渠道来说&#xff0c;都是要及时解决的问题&#xff0c;否则渠道乱了&#xff0c;最终腐蚀的是品牌价值&#xff0c;同时还会影响经销商…

【LeetCode-剑指offer】--1.两数相除

1.两数相除 方法&#xff1a;使用减法实现除法 用“被减数”能减去几次“减数”来衡量最后的结果&#xff0c;这时候我们想到求x的幂次的快速解法&#xff0c;将x成倍成倍的求幂&#xff0c;这里将减数成倍成倍的增大&#xff0c;次数对应也是成倍成倍的增大&#xff0c;例如&…

虚幻UE 增强输入-第三人称模板增强输入分析与扩展

本篇是增强输入模块&#xff0c;作为UE5.0新增加的模块。 其展现出来的功能异常地强大&#xff01; 让我们先来学习学习一下第三人称模板里面的增强输入吧&#xff01; 文章目录 前言一、增强输入四大概念二、使用步骤1、打开增强输入模块2、添加IA输入动作2、添加IMC输入映射内…

【亚马逊云科技】自家的AI助手 - Amazon Q

写在前面&#xff1a;博主是一只经过实战开发历练后投身培训事业的“小山猪”&#xff0c;昵称取自动画片《狮子王》中的“彭彭”&#xff0c;总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域&#xff0c;如今终有小成…

C语言预备知识_hello world_数据类型_变量(入门到入神)

为什么要学习 C语言 学习 C语言是非常接近底层的一种编程语言C语言是学习其它编程语言第基础&#xff0c;基础不牢&#xff0c;地动山摇考研会用到 C语言 C语言预备知识 CPU 内存条 硬盘 显卡 主板 显示器之间的关系 当你在电脑上观看一部存储在硬盘上的电影时&#xff0c;各…

如何在 ChatGPT 上使用 Wolfram 插件回答数学问题

这里写自定义目录标题 写在最前面Wolfram是什么&#xff1f;ChatGPT 如何与 Wolfram 相结合&#xff0c;为什么有效&#xff1f;如何在 ChatGPT 上安装 Wolfram 插件&#xff1f; 写在最前面 参考&#xff1a;https://clickthis.blog/zh-CN/how-to-answer-math-questions-usin…

大一C语言查缺补漏 12.28

在C语言中&#xff0c;5%&#xff08;-3&#xff09;答案是什么 在C语言中&#xff0c;5 % -3的结果是2。因为在C语言中&#xff0c;取余运算&#xff08;%&#xff09;的结果的符号与被除数相同。所以&#xff0c;5 % -3的计算结果为2。 在C语言种引用数组元素时&#xff0c;其…

Unity 使用Sprite绘制一条自定义图片的线

Unity 使用Sprite绘制一条自定义图片的线 前言项目场景布置代码编写总结 运行效果感谢 前言 遇到一个需要绘制自定义形状的需求。那只能利用Sprite来绘制一条具有自定义图片的线&#xff0c;通过代码动态设置起点、终点以及线宽&#xff0c;实现灵活的线条效果。 项目 场景…

【Linux Shell】6. echo 命令

文章目录 【 1. 显示普通字符串 】【 2. 显示转义字符 】【 3. 显示变量 】【 4. 显示换行 】【 5. 显示不换行 】【 6. 显示命令执行结果 】 Shell 的 echo 指令用于字符串的输出。命令格式&#xff1a; echo string【 1. 显示普通字符串 】 #!/bin/bashecho "It is a …

arr.prototype 数组的方法

1.forEach 作用:遍历这个数组 代码&#xff1a; let arr [10, 20, 30, 40, 50];arr.forEach((item) > {console.log(item);}); 返回值:没有返回值 2.fiflter 作用:过滤数组 代码&#xff1a; let arr [10, 20, 30, 40, 50];let newArr arr.filter((item) > {retu…

机器学习(三) -- 特征工程(1)

系列文章目录 机器学习&#xff08;一&#xff09; -- 概述 机器学习&#xff08;二&#xff09; -- 数据预处理&#xff08;1-3&#xff09; 机器学习&#xff08;三&#xff09; -- 特征工程&#xff08;1-2&#xff09; 未完待续…… 目录 系列文章目录 前言 一、特征…