JDK 12核心特性解析:Shenandoah GC、Switch表达式与JMH性能测试
1. 从“够用”到“好用”为什么我们需要关注JDK 12如果你是一个Java开发者可能已经习惯了这样的节奏每隔半年Oracle就会发布一个新版本的JDK。从JDK 9引入模块化这个“重磅炸弹”开始后续的版本更新似乎总给人一种“小修小补”的感觉。很多人包括一些团队可能还停留在JDK 8甚至更早的版本心里想着“新版本等它稳定了再说吧反正JDK 8够用了。”这种想法很普遍但也很危险。技术栈的停滞往往意味着开发效率和软件质量的停滞。JDK 12作为Java长期支持版本LTSJDK 11之后的第一个非LTS版本它承载的使命并非颠覆而是“精进”。它没有引入像模块化那样需要重构整个项目架构的特性而是聚焦于解决那些日常开发中真实存在的“痒点”和“痛点”让Java从“够用”变得“更好用”。这些改进很多是来自真实生产环境的反馈是JVM工程师和社区开发者们共同努力的成果。理解并应用它们意味着你能写出更简洁、更高效、更健壮的代码能在问题排查时拥有更强大的工具能在微服务、云原生等现代架构下更好地驾驭Java这艘大船。这次“奇妙之旅”我们将深入JDK 12的几个核心新特性看看它们如何悄无声息地提升你的开发体验。2. Shenandoah GC为低延迟而生的“降维打击”垃圾回收器一直是Java性能调优的核心战场。在JDK 12之前我们熟悉的有追求吞吐量的Parallel GC有追求响应延迟的CMS和G1 GC。而Shenandoah的加入可以说是对“低延迟”这个目标的一次“降维打击”。它最核心的目标是在堆内存很大比如几百GB的情况下依然能将GC停顿时间控制在10毫秒以内并且这个停顿时间几乎不随堆大小的增长而增加。2.1 核心原理并发压缩与Brooks指针Shenandoah实现这一目标的秘诀在于其“并发压缩”能力。传统的GC包括G1在进行垃圾回收的某个阶段尤其是“标记-复制”或“压缩”阶段时必须暂停所有应用线程Stop-The-World, STW以便安全地移动存活对象到新的内存区域。当堆很大、存活对象很多时这个STW时间会非常可观。Shenandoah通过一种称为“Brooks指针”的间接引用技术打破了这一限制。它的工作方式可以这样理解对象布局变化在Shenandoah管理的堆中每个对象除了原有的对象头和数据字段外还多了一个额外的“转发指针”字段。你可以把它想象成对象的“替身”或“影子”。并发移动当GC决定要移动一个存活对象比如从Eden区移到Survivor区或者进行老年代压缩时它不需要STW。GC线程可以在应用程序线程正常运行的同时将对象复制到新的位置。指针更新对象被复制后旧位置的那个“转发指针”字段会被更新指向对象的新地址。而对象头中的“标记”等信息则存储在新对象上。访问拦截关键在于应用程序线程在访问对象时代码逻辑并没有改变它仍然通过原有的引用去访问。JVM会在内存访问的底层机制中插入一个“读屏障”。当线程通过一个引用去读对象时读屏障会悄悄地检查这个引用指向的对象是否已经被移动即检查它的转发指针。如果已经被移动读屏障会“拦截”这次访问自动地、透明地将访问重定向到新的地址并可能更新线程本地缓存中的引用值。这个过程对Java代码是完全透明的。正是通过这套机制Shenandoah将最耗时的对象移动操作与应用程序并发执行从而将STW时间缩减到仅包括初始标记和最终标记-清理等极短的阶段实现了近乎恒定的低停顿。2.2 启用与基础调优Shenandoah在JDK 12中是作为实验性特性引入的你需要显式启用它。对于生产环境请务必在充分测试后再考虑。启用命令java -XX:UnlockExperimentalVMOptions -XX:UseShenandoahGC -jar your-application.jar关键调优参数-XX:ShenandoahGCHeuristics设置启发式模式默认是adaptive它会根据应用行为动态调整。static模式则提供更可预测但可能保守的GC行为。对于需要严格满足SLA服务等级协议的延迟敏感型应用可以测试static模式。-XX:ShenandoahGCMode设置GC模式。satbSnapshot-At-The-Beginning是默认模式适合大多数场景。iuIncremental Update模式在某些写操作非常频繁的场景下可能表现更好但通常更复杂。-XX:ShenandoahPacing这个参数控制GC线程的工作量以避免它们“掠夺式”地占用CPU导致应用吞吐量骤降。默认是启用的一般不需要调整。实操心得与避坑指南性能不是免费的Shenandoah的低停顿是通过额外的读屏障和内存开销每个对象的转发指针换来的。这会导致吞吐量下降读屏障会增加每条对象访问指令的开销通常会导致应用吞吐量有5%-15%的下降。如果你的应用是计算密集型或对吞吐量极其敏感需要仔细权衡。内存占用增加每个对象多了个指针堆内存占用会轻微上升。并非银弹Shenandoah擅长处理大堆和低延迟但对于堆很小比如小于4G的应用其开销可能得不偿失传统的G1或Parallel可能更合适。监控是关键使用jstat -gcutil或更先进的监控工具如JMX, Prometheus JMX Exporter来观察GC行为。重点关注S0C/S1CSurvivor区容量、S0U/S1USurvivor区使用量以及FGCTFull GC时间。Shenandoah的设计目标是避免Full GC如果出现了长时间的Full GC需要立刻检查配置和内存使用模式。与ZGC对比JDK 11引入了另一款低延迟GC——ZGC。两者目标相似但实现原理不同ZGC使用彩色指针和读屏障而非Brooks指针。在JDK 15中ZGC和Shenandoah都转正了。选择哪一个简单来说在JDK 11-15阶段Shenandoah更成熟支持特性更全如卸载类而ZGC最初不支持类卸载等。现在两者都已成熟选择更多取决于具体场景的基准测试结果。3. Switch表达式预览告别繁琐的Break语句如果你写过稍微复杂一点的switch语句肯定对下面这种模式深恶痛绝int day 3; String dayType; switch (day) { case 1: case 2: case 3: case 4: case 5: dayType Weekday; break; // 必须的否则会“贯穿” case 6: case 7: dayType Weekend; break; default: dayType Invalid; break; } System.out.println(dayType);这种代码不仅冗长而且极易因为忘记写break而导致bugcase穿透。JDK 12引入了Switch表达式作为预览特性旨在彻底解决这个问题让switch变得更简洁、更安全、更强大。3.1 新语法从语句到表达式Switch表达式的核心思想是switch可以作为一个表达式来使用它本身就能产生一个值。这样就不再需要为每个case分支声明一个外部变量并反复赋值了。基本语法String dayType switch (day) { case 1, 2, 3, 4, 5 - Weekday; case 6, 7 - Weekend; default - Invalid; }; System.out.println(dayType);看代码瞬间清爽了这里有几个关键点-操作符新的case标签使用箭头-它取代了传统的冒号:。箭头右侧可以是一个表达式、一个代码块或者一个throw语句。最重要的是使用-的case分支不会发生穿透执行完右侧的表达式或代码块后整个switch表达式就结束了。多case标签同一个箭头左侧可以列出多个case值用逗号分隔如case 1, 2, 3, 4, 5 -这极大地简化了代码。必须穷举Switch表达式要求覆盖所有可能的值。对于枚举类型或密封类编译器可以检查是否穷举。对于int、String等则必须提供default分支否则编译会报错。这强制开发者考虑边界情况增强了代码的健壮性。yield关键字如果箭头右侧是一个代码块用{}包裹并且需要从中返回一个值那么必须使用新的yield关键字在JDK 13中引入并成为标准JDK 12预览时用的是break value但最终定型为yield。String dayType switch (day) { case 1, 2, 3, 4, 5 - { // 这里可以做一些复杂的计算 String result Weekday; // 使用 yield 返回结果 yield result; } case 6, 7 - Weekend; default - { System.err.println(Invalid day: day); yield Invalid; } };3.2 启用预览特性及注意事项在JDK 12中Switch表达式是预览特性需要额外参数来启用。编译和运行# 编译时启用预览特性 javac --enable-preview --release 12 YourClass.java # 运行时启用预览特性 java --enable-preview YourClass实操心得思维转变最大的改变是从“控制流语句”到“值计算表达式”的思维转变。尝试在适合的地方用Switch表达式替代复杂的if-else链或旧的switch语句代码可读性会显著提升。类型推断Switch表达式的结果类型是所有分支返回值的“最小公共类型”。例如如果分支返回Integer和Double结果类型会是Number。确保所有分支返回类型兼容。与模式匹配的结合Switch表达式为未来Java的模式匹配特性打下了完美的基础。在后续版本中case后面不仅可以接常量还可以接类型模式实现更强大的解构能力。现在习惯Switch表达式是为未来更强大的特性做准备。迁移策略对于现有项目可以逐步将旧的switch语句重构为Switch表达式。IDE如IntelliJ IDEA通常提供一键重构功能。但要注意如果旧代码依赖case穿透特性虽然不推荐重构时需要显式处理。4. JMH性能测试套件成为标准告别“拍脑袋”式性能评估在JDK 12之前如果你想做严谨的Java微基准测试大概率会用到JMHJava Microbenchmark Harness。但它是一个需要单独引入的第三方库。JDK 12做了一个看似微小但意义重大的改变将JMH的示例基准测试套件集成到了JDK源码中jmh-samples模块。这标志着Oracle官方正式认可并推广了JMH所代表的科学性能测试方法论。4.1 为什么微基准测试如此困难写一个看似简单的性能对比测试比如比较StringBuilder和StringBuffer在单线程下的性能很容易写成这样public class NaiveBenchmark { public static void main(String[] args) { long start System.currentTimeMillis(); for (int i 0; i 100000; i) { // 测试代码 } long end System.currentTimeMillis(); System.out.println(Time: (end - start) ms); } }这种测试问题非常多JVM预热JVM有JIT编译器热点代码会被编译优化。前几次循环运行的是解释执行的字节码速度慢不能代表稳定状态。死代码消除如果循环体内的计算结果没有被使用JIT编译器可能会认为这是无用代码直接将其优化掉导致测试时间极短甚至为0。循环展开JIT可能会将循环展开改变了实际的执行次数。环境噪声GC、操作系统调度、CPU频率缩放等因素都会影响单次运行的结果。JMH通过一套复杂的框架解决了所有这些问题预热迭代在正式测量前先运行若干轮迭代让JVM达到稳定状态方法已被JIT编译。测量迭代在预热后进行多轮测量并统计结果平均时间、吞吐量、标准差等。防止优化通过Blackhole类“消费”掉计算结果防止死代码消除。控制粒度可以精确控制每个基准测试方法运行的时间、迭代次数、线程数等。4.2 如何使用JDK自带的JMH示例JDK 12将JMH示例作为了一个模块。你可以通过以下步骤学习获取示例代码如果你有JDK 12的源码可以在src/jmh-samples目录下找到。更简单的方式是从JMH官网或Maven中央仓库获取独立的示例项目。一个简单的JMH基准测试import org.openjdk.jmh.annotations.*; import java.util.concurrent.TimeUnit; BenchmarkMode(Mode.AverageTime) // 测试模式平均执行时间 OutputTimeUnit(TimeUnit.NANOSECONDS) // 输出时间单位 State(Scope.Thread) // 每个测试线程一个实例 public class MyBenchmark { Benchmark public void testMethod() { // 这里写你要测试的代码 // 例如Math.log(123.456); } }编译与运行你需要将JMH的依赖库jmh-core,jmh-generator-annprocess加入项目然后使用JMH提供的运行器来执行。通常通过Maven或Gradle插件来运行最为方便。实操心得不要过早优化JMH是用于测量“已知热点”的微小性能差异的利器。在项目初期关注架构和代码清晰度远比微优化重要。只有通过Profiler如Async Profiler, VisualVM定位到真正的性能瓶颈后才需要用JMH来对比不同实现方案的细微差别。关注结果的统计意义JMH输出的不仅有平均值还有误差范围如± 99.9%置信区间。如果两个方法的性能区间有大量重叠那么就不能武断地说谁比谁快。要关注有统计显著性的差异。理解State的作用域Scope.Thread表示每个线程有自己的状态对象副本Scope.Benchmark表示所有线程共享同一个状态对象。错误的使用会导致数据竞争或不符合实际的测试场景。官方示例是最好的老师JDK源码中的jmh-samples包含了各种场景的示例如如何测试String拼接、如何避免常量折叠、如何使用Param进行参数化测试等。花时间研究这些例子能让你避开绝大多数基准测试的坑。5. 其他不容忽视的实用改进除了上述三大亮点JDK 12还包含了一系列“小而美”的改进它们同样能切实提升开发体验。5.1 文件不匹配方法Files.mismatch这是一个非常实用的工具方法用于比较两个文件的内容是否完全相同。在它出现之前我们可能需要自己写循环读取字节进行比较或者依赖Files.isSameFile它主要比较路径而非内容。Path path1 Paths.get(file1.txt); Path path2 Paths.get(file2.txt); long mismatch Files.mismatch(path1, path2); if (mismatch -1L) { System.out.println(文件内容完全相同); } else { System.out.println(文件在位置 mismatch 处开始不同); // mismatch 返回的是第一个不匹配字节的索引 }它的实现是高效的会在发现第一个不匹配的字节时立即返回而不会读取整个文件。这对于比较大型文件如备份校验非常有用。5.2 Compact Number Format人性化的数字格式化CompactNumberFormat类可以将数字格式化为更紧凑、更易读的形式特别是在显示大数字时比如在社交媒体上显示“1.2K followers”而不是“1200 followers”。import java.text.NumberFormat; import java.util.Locale; NumberFormat fmt NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT); System.out.println(fmt.format(1_200)); // 输出: 1.2K System.out.println(fmt.format(3_000_000)); // 输出: 3M NumberFormat longFmt NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.LONG); System.out.println(longFmt.format(1_200)); // 输出: 1.2 thousand这个特性对于开发需要国际化显示用户数量、文件大小、金额等的应用程序非常方便。5.3 微基准测试套件JMH的官方背书如前所述将JMH示例纳入JDK是推动Java开发者进行科学性能测试的重要一步。它鼓励开发者在做性能断言时“用数据说话”而不是凭感觉或简单的System.currentTimeMillis()。5.4 JVM常量API的引入这是一个底层特性主要为编译器、分析工具和框架开发者服务。它提供了一套标准的APIjava.lang.constant包来表示各类字节码可加载的常量并对它们进行建模。简单来说它让程序在运行时能够以类型安全的方式描述类、方法、字段等符号信息。这对于实现动态语言特性、增强反射、或构建更智能的代码生成工具如注解处理器非常有帮助。普通应用开发者可能不会直接使用但它会使得你依赖的某些高级框架如Spring AOP、Lombok等变得更强大、更可靠。6. 升级到JDK 12策略与实战考量面对一个新版本我们最关心的是要不要升级怎么升级6.1 评估升级的必要性对于JDK 12这样一个非LTS版本在生产环境升级需要谨慎。可以从以下几个维度评估特性驱动你的项目是否迫切需要某个JDK 12的特性例如你的服务是否正受困于GC停顿而Shenandoah GC经测试能完美解决或者你的代码库中是否有大量冗长的switch语句重构为Switch表达式能极大提升可维护性如果答案是肯定的升级的价值就很大。技术债与安全虽然JDK 8/11是LTS但长期停留在旧版本会积累技术债并可能错过重要的安全补丁和性能优化。非LTS版本通常包含更多前沿优化即使不直接用新特性JVM本身的改进如解释器、C2编译器优化也可能带来免费的性能提升。生态兼容性检查项目所依赖的所有第三方库Spring, Hibernate, Netty, 各种数据库驱动等是否明确支持JDK 12。通常主流库对新版本JDK的支持都很快但需要验证尤其是那些使用了大量反射、字节码操作或JNI的库。6.2 渐进式升级策略不建议直接将生产环境从JDK 8跳跃到JDK 12。一个稳妥的策略是本地与CI环境先行首先在开发者的本地机器和持续集成CI服务器上安装JDK 12。确保CI流水线能在JDK 12下成功编译、运行所有单元测试和集成测试。这是第一道安全网。使用多版本JDK利用JAVA_HOME和环境管理工具如jenv,sdkman让开发环境可以轻松切换不同JDK版本。确保代码在目标版本如JDK 8或11和JDK 12下都能通过编译。启用预览特性需明确如果使用了Switch表达式等预览特性记住它们不能用于生产环境。预览特性是用于收集反馈的其语法和API在后续版本中可能会改变。如果项目想用应仅限于内部工具或非核心模块并且做好随JDK版本升级而修改代码的准备。性能基准测试在准生产环境Staging进行全面的性能基准测试和压力测试。对比升级前后的关键指标吞吐量QPS/TPS、响应时间P99 Latency、内存占用、GC停顿时间。特别是如果启用了Shenandoah GC要密切关注其吞吐量影响是否在可接受范围内。灰度发布在生产环境采用灰度发布策略。先在一小部分、非关键的流量或实例上部署JDK 12版本监控运行状态应用日志、JVM指标、系统指标至少一个完整的业务周期如一周确认无误后再逐步扩大范围。6.3 常见问题与回滚方案依赖冲突某些依赖可能基于旧版本JDK编译或内部使用了在新版本中被移除的API虽然从JDK 9开始强调模块化和封装但仍有风险。使用jdeps工具分析依赖或直接运行测试来暴露问题。工具链兼容性确保你的构建工具Maven/Gradle、IDEIntelliJ IDEA/Eclipse、监控工具APM, Profiler都支持JDK 12。制定回滚计划在升级前必须准备好一键回滚到旧版本JDK的方案。这包括完整的部署脚本、配置备份和验证步骤。确保在出现不可预知的问题时能在最短时间内恢复服务。升级JDK尤其是非LTS版本更像是一次基础设施的“精装修”目的是获得更好的开发体验和运行时性能。它需要周密的计划、充分的测试和谨慎的推进但带来的长期收益代码更简洁、性能更优、更安全对于保持项目的技术活力至关重要。JDK 12的这些“奇妙”特性正是推动我们迈出这一步的绝佳理由。

相关新闻

AI文学抄袭检测:从文本指纹到语义分析

AI文学抄袭检测:从文本指纹到语义分析

1. AI文学创作中的抄袭检测技术现状 最近在测试几个主流AI写作工具时,发现一个有趣现象:不同平台生成的短篇小说开头惊人地相似。这让我开始思考AI创作中的抄袭边界问题。目前业内主要通过三种算法来检测AI文本的原创性: 基于n-gram的文本指…

2026/8/6 4:07:36 阅读更多 →
Apache Spark实战指南:从核心概念到生产环境调优

Apache Spark实战指南:从核心概念到生产环境调优

在实际大数据处理项目中,Apache Spark 早已超越了其最初作为 MapReduce 加速器的定位。它凭借内存计算、DAG 调度和丰富的 API,成为了构建批流一体、机器学习、图计算等复杂数据流水线的核心引擎。然而,从“知道 Spark 是什么”到“能在生产环…

2026/8/6 4:07:36 阅读更多 →
2026零基础网页视频转文字教程避坑包教包会看完就能直接上手

2026零基础网页视频转文字教程避坑包教包会看完就能直接上手

2026年零基础完成网页视频转文字,可通过AI工具在网页端三步操作完成转写整理,看完就能上手。适合需要做内容二次创作的自媒体从业者,关键依据是截至2026年AI转写已经能覆盖绝大多数主流视频转写场景,处理效率远高于手动。前提是你…

2026/8/6 4:06:36 阅读更多 →

最新新闻

【国产大模型实战评估报告】:2024年TOP10模型在推理速度、中文理解、幻觉率与API成本四大维度硬核对比(附实测数据表)

【国产大模型实战评估报告】:2024年TOP10模型在推理速度、中文理解、幻觉率与API成本四大维度硬核对比(附实测数据表)

更多请点击: https://kaifayun.com 第一章:国产大模型实战评估报告总览 本报告基于2024年Q2真实生产环境下的多维度实测数据,覆盖通义千问、文心一言、讯飞星火、智谱GLM及百川智能等5款主流国产大模型。评估聚焦推理性能、中文语义理解、工…

2026/8/6 4:59:00 阅读更多 →
从CCPC哈尔滨站9题解析到算法竞赛思维跃迁与实战技巧

从CCPC哈尔滨站9题解析到算法竞赛思维跃迁与实战技巧

1. 写在前面:从“看题解”到“会做题”的思维跃迁又到了赛季末,各大网络社区里关于区域赛的题解分享又多了起来。最近看到不少朋友在找“2023CCPC哈尔滨站”的题解,尤其是卡在9题这个坎上的同学,心情我特别能理解。当年我也是这么…

2026/8/6 4:59:00 阅读更多 →
深度解析Resource Override:浏览器网络拦截架构设计与实战应用

深度解析Resource Override:浏览器网络拦截架构设计与实战应用

深度解析Resource Override:浏览器网络拦截架构设计与实战应用 【免费下载链接】ResourceOverride An extension to help you gain full control of any website by redirecting traffic, replacing, editing, or inserting new content. 项目地址: https://gitco…

2026/8/6 4:59:00 阅读更多 →
如何轻松下载B站大会员专属4K视频?这个开源工具让你永久保存心爱内容

如何轻松下载B站大会员专属4K视频?这个开源工具让你永久保存心爱内容

如何轻松下载B站大会员专属4K视频?这个开源工具让你永久保存心爱内容 【免费下载链接】bilibili-downloader B站视频下载,支持下载大会员清晰度4K,持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 你是…

2026/8/6 4:59:00 阅读更多 →
建设网站常见问题深度解析:从域名注册到售后维护,新手必须避开的50个坑

建设网站常见问题深度解析:从域名注册到售后维护,新手必须避开的50个坑

现在的互联网时代,谁不想拥有一个属于自己的网站呢?无论是个人博主想记录生活,还是小微企业想拓展业务,亦或是创业团队展示品牌形象,网站都是一张至关重要的“电子名片”。但是,很多初次接触建站的朋友,往往在满怀期待开始动手时,瞬间就被各种复杂的技术术语、混乱的服…

2026/8/6 4:59:00 阅读更多 →
Agent记忆管理技巧

Agent记忆管理技巧

记忆压缩&整理随着交互的持续进行,记忆系统面临存储空间和检索效率的双重挑战。简单的累积式存储会导致记忆爆炸,不仅消耗存储空间,还降低检索准确性。 实践中可以采用多层次的记忆压缩策略。 第一层:通过重要性评分筛选。 一种常见的重要…

2026/8/6 4:58:00 阅读更多 →

日新闻

深入解析LimboAI C++内核:架构设计与性能优化实战

深入解析LimboAI C++内核:架构设计与性能优化实战

1. 项目概述:为什么我们需要深入LimboAI的C内核?如果你是一名使用Godot引擎的游戏开发者,尤其是对AI行为逻辑有较高要求的项目,那么LimboAI这个名字你大概率不会陌生。它作为Godot 4生态中一个备受瞩目的行为树与状态机插件&#…

2026/8/6 0:00:06 阅读更多 →
Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

1. 项目概述与核心思路大家好,我是老张,一个在游戏开发一线摸爬滚打了十多年的老码农。今天咱们接着聊《空洞骑士》风格2D动作游戏的Demo制作。上一期我们搭好了基础框架,处理了角色移动和碰撞,这一期,我们要让游戏世界…

2026/8/6 0:00:06 阅读更多 →
被动防火门市场前景发展趋势

被动防火门市场前景发展趋势

被动防火门依靠材质结构、密闭构造阻隔烟火蔓延,无需电控启动,是建筑被动消防系统核心构件,行业依托新规管控、城市更新、工业安全升级迎来稳定扩容,整体朝着合规化、专项化、低碳化、智能化方向发展。现阶段 GB12955‑2024 新版国…

2026/8/6 0:00:06 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/5 15:00:43 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/5 13:13:56 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/5 10:20:36 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/5 21:00:14 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →