JDK 17 新特性

news2025/6/12 20:19:42

#JDK 17 新特性
/****************
文本块
*****************/
python/scala中早就支持,不稀奇

String json = “”"
{
“name”: “Java”,
“version”: 17
}
“”";

/****************
Switch 语句 + -> 表达式
*****************/
挺好的,格式漂亮,带有返回值。干劲利落。
没有break穿透问题
带有yield

/****************
String类的新方法


repeat:重复生成字符串
isBlank:不用在引入第三方库就可以实现字符串判空了
strip:去除字符串两边的空格,支持全角和半角,之前的trim只支持半角
lines:能根据一段字符串中的终止符提取出行为单位的流
indent:给字符串做缩进,接受一个int型的输入
transform:接受一个转换函数,实现字符串的转换

但是Hutool里面的功能不是更多么?

/****************
Pattern 类增强功能
****************/
替代传统 str.matches(regex),直接集成到 Stream API 中
可以不使用regular expression
复杂正则匹配效率提升 10%~30%,尤其对长文本和大规模数据。
相当于python 中的 rf""
匹配路径 “C:\Windows\System”:
- 手动转义: C:\\Windows\\System
- 使用 \Q…\E: \QC:\Windows\System\E

/****************
NullPointerException)信息增强
*****************/
//仅提示 NullPointerException,不明确具体原因
String s = null;
s.toLowerCase(); // 输出:java.lang.NullPointerException

String s = null;
s.toLowerCase(); // 输出:java.lang.NullPointerException: Cannot invoke “String.toLowerCase()” because “s” is null

/****************
Exception information
*****************/
// JDK 8:需显式转换,可能引发 ClassCastException
if (obj instanceof String) {
String str = (String) obj; // 转换可能失败
System.out.println(str.toUpperCase());
}

// JDK 17:直接绑定变量,类型安全
if (obj instanceof String str) {
System.out.println(str.toUpperCase()); // 无需转换
}

/****************
集合类工厂方法
*****************/
只对返回值,或者Enum类有用。对于大型参数,一定是读取数据库或者缓存
原先需要通过Array转,现在可以直接用。 看源码没什么花头,就是Array加强制转换
List list = List.of(99,999,999,999);

List Arrays.asList(“a”, “b”, “c”) ->>> /*17 */ List.of(“a”, “b”, “c”)
Set new HashSet<>(Arrays.asList(“a”,“b”)) ->>> /*17 */ Set.of(“a”, “b”)
Map 手动 put 或依赖 Guava 等三方库 ->>> /*17 */ Map.of(“a”, 1, “b”, 2) 或 Map.ofEntries(…)

/****************
Sealed class
****************/
public sealed class Shape permits Circle, Rectangle
对业务开发没有感觉
在架构开发中有一定作用
类似于Abstract class,也类似于Generic泛型,但可对单个 class 进行点名限制

/****************
interface 中的私有静态方法
*****************/
对业务开发没有感觉
在架构开发中有一定作用, 增强安全性

/****************
Records
*****************/
相当于scala中的case class, 但无法动态编译。也没达到python Django 中model 的高度,感觉有点鸡肋

/****************
内部静态类
****************/
//只能静态访问静态。但是静态类是线程安全的
//对返回值,Enum类封装比较有效。但因为增加代码复杂度,不符合clean code 规范

package org.example.newFeatures.StaticNestedClass;

public class StaticNestedClass {
private String name = “外部类实例字段”;
private static String STATIC_FIELD = “外部类静态字段”;

// 静态嵌套类(Static Nested Class)
public static class StaticNestedClass1 {
    public void print() {
        System.out.println(STATIC_FIELD);  // ✅ 直接访问外部类静态成员
        //System.out.println(name);      // ❌ 编译错误:无法访问实例字段
    }
}

// 内部类(Inner Class)
public class InnerClass {
    public void print() {
        System.out.println(name);          // ✅ 访问外部类实例字段
        System.out.println(STATIC_FIELD);  // ✅ 访问外部类静态字段
    }
}

public static void main(String[] args) {
    StaticNestedClass.StaticNestedClass1 staticNestedClass1 = new StaticNestedClass.StaticNestedClass1();
    staticNestedClass1.print();

    StaticNestedClass staticNestedClass = new StaticNestedClass();
    StaticNestedClass.InnerClass innerClass = staticNestedClass.new InnerClass();
    innerClass.print();
}

}

/****************
instance of 功能很棒
JDK17新特性6 - 模式匹配,避免了强制转换
*****************/
if (obj instanceof String s) {
System.out.println(s.toUpperCase()); // 直接使用变量 s
}

/****************
Transform 流式处理
****************/
//stream表达式太长,调试不方便。
//除非有特定性能要求,一般不使用
public void transformTest3_filter() {
List numbers = List.of(10, 3, 8, 15, 6, 1);
// 保留大于5的偶数 [8, 6]
List result = numbers.stream()
.filter(n -> n > 5 && n % 2 == 0)
.toList();
System.out.println(result);
}

/****************
List.of
****************/
List words = List.of(“Java”, “JDK17”, “Pattern”, “OpenJDK”);
//实际上是做了个封装,然后强制转换
static {
CDS.initializeFromArchive(ImmutableCollections.class);
if (archivedObjects == null) {
EMPTY = new Object();
EMPTY_LIST = new ListN<>(new Object[0], false);
EMPTY_LIST_NULLS = new ListN<>(new Object[0], true);
EMPTY_SET = new SetN<>();
EMPTY_MAP = new MapN<>();
archivedObjects =
new Object[] { EMPTY, EMPTY_LIST, EMPTY_LIST_NULLS, EMPTY_SET, EMPTY_MAP };
} else {
EMPTY = archivedObjects[0];
EMPTY_LIST = (ListN)archivedObjects[1];
EMPTY_LIST_NULLS = (ListN)archivedObjects[2];
EMPTY_SET = (SetN)archivedObjects[3];
EMPTY_MAP = (MapN)archivedObjects[4];
}
}

/****************
Stream API 增强
****************/
List list = Stream.of(1, 2, 3).filter(x -> x > 1).toList();

/****************
Http Request 异步处理
****************/
private CompletableFuture<HttpResponse>
sendAsync(HttpRequest userRequest,
BodyHandler responseHandler,
PushPromiseHandler pushPromiseHandler,
Executor exchangeExecutor)

/****************
jshell
****************/
无用的功能,无法像python Django 一样交互
也不如scala

/****************
ZGC
****************/
在ParallelOldGC、CMS和G1之后,JDK 11引入了全新的ZGC(Z Garbage Collector)。
一般很难了解ZGC改进有
###重点,JDK 17 对 ZGC 和 G1 GC 进行了显著改进,特别适合 Spark 的大内存和低延迟场景:

ZGC(Z Garbage Collector)
支持 TB 级堆内存下保持亚毫秒级停顿(通常 <10ms),避免 Full GC 导致的分钟级卡顿。
通过染色指针(Colored Pointers) 和并发压缩技术,减少内存碎片问题,提升 Spark Shuffle 和缓存数据的稳定性。

堆外内存控制
JDK 17 优化了 MaxDirectMemorySize 的默认行为,减少 Spark 因堆外内存溢出(如 java.lang.OutOfMemoryError: Direct buffer memory)导致的失败。
统一内存池
Spark 的 Off-Heap 内存(用于 Shuffle、缓存)与 JDK 17 的 Native Memory Tracking(NMT) 集成,便于监控和调优。

###好文,好参数
优化方向 JDK 17 特性 Spark 配置建议
垃圾回收 启用 ZGC(亚毫秒停顿) --conf spark.executor.extraJavaOptions=“-XX:+UseZGC”
向量化计算 Vector API 或 Gluten-Velox 使用 Spark 3.4+ 并集成 Gluten 插件
内存管理 监控 NMT + 调整堆外内存 spark.memory.offHeap.enabled=true
版本兼容性 优先选择 LTS 版本 升级至 Spark 3.3+(官方支持 JDK 17)

/****************
web socket 比较
****************/
特性 JDK 8 JDK 17
I/O 模型 基于阻塞式 I/O(BIO) 异步 NIO(非阻塞),支持高并发
资源消耗 每个连接占用一个线程,并发能力受限 基于 Selector 多路复用,线程复用率高
HTTP/2 支持 无原生支持 原生支持 HTTP/2,提升传输效率

/****************
JDK 17中的Vector API用于做什么
****************/
金融建模(蒙特卡洛模拟优化), 但问题是Python中有其他的量化库。 挺有意思,但java写在底层有什么意义?
真正的模拟我会放在 spark 中做分布式计算
Incubator 功能,感觉挺鸡肋的

场景优势:

吞吐量:单次模拟处理 8 组数据,性能达 850 万次/秒(标量仅 120 万次/秒)
精度保障:内置 sqrt() 等数学函数支持向量化计算

FloatVector simulatePayoff(float strikePrice) {
FloatVector rand1 = generateRandomVector(SPECIES); // 生成随机数向量
FloatVector rand2 = generateRandomVector(SPECIES);

// 并行计算期权收益:sqrt(rand1*rand2) - strikePrice
FloatVector payoff = rand1.mul(rand2)
                         .sqrt()
                         .sub(strikePrice)
                         .max(0); // 收益最小为0

return payoff;

}

/****************
NEW IO
****************/
//这类有2GB内存限制,用起来要小心
String content = Files.readString(path);

//异步读取设计不错
// 4. 发起异步读取操作(从文件位置0开始)
Future readResult = channel.read(buffer, 0);

// 5. 非阻塞等待(可在此处执行其他任务)
System.out.println(“主线程继续执行其他任务…”);
while (!readResult.isDone()) {
Thread.sleep(100); // 避免CPU空转3,5
System.out.print(“.”);
}

//java 源码刨析
/ public abstract class AsynchronousFileChannel
// – reading and writing –
// 利用了Future对象的异步返回
abstract Future implRead(ByteBuffer dst,
long position,
A attachment,
CompletionHandler<Integer,? super A> handler);

/****************
JDK 17中对于并发编程的改进有哪些
****************/
StampedLock的改进,提高了并发编程的效率, 增强了线程池的安全控制
StampledLock的秘密在于,源码中定义了一系列的node, 然后通过acquire readNode, 找到这个node的状态,然后 break 无限循环 。。。。
喜欢这个大胆粗暴的想法

public class StampedLock implements java.io.Serializable {
private long acquireRead(boolean interruptible, boolean timed, long time) {
boolean interrupted = false;
ReaderNode node = null;
/*
* Loop:
* if empty, try to acquire
* if tail is Reader, try to cowait; restart if leader stale or cancels
* else try to create and enqueue node, and wait in 2nd loop below
*/
for (;😉 {
ReaderNode leader; long nextState;
Node tailPred = null, t = tail;
if ((t == null || (tailPred = t.prev) == null) &&
(nextState = tryAcquireRead()) != 0L) // try now if empty
return nextState;
else if (t == null)
tryInitializeHead();
else if (tailPred == null || !(t instanceof ReaderNode)) {
if (node == null)
node = new ReaderNode();
if (tail == t) {
node.setPrevRelaxed(t);
if (casTail(t, node)) {
t.next = node;
break; // node is leader; wait in loop below
}
node.setPrevRelaxed(null);
}

/****************
安全算法
****************/

  1. 开启TLS
  2. SHA256
  3. 上下文反序列化过滤器
  4. 强封装内部API: 默认禁止反射访问JDK内部API
  5. 细粒度策略文件: 支持动态策略加载和条件化权限控制 ,应用层配置保护。

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

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

相关文章

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…