当前位置: 首页 > news >正文

JDK 12 新特性详解

JDK 12 新特性详解

JDK 12 于2019年3月19日正式发布,是一个非 LTS(Non-LTS)版本。该版本引入了多个重要的语言特性预览(Switch 表达式、Pattern Matching),以及多项 JVM 和 GC 优化(G1 增强、ZGC 改进、Shenandoah GC 正式纳入)。JDK 12 为后续 LTS 版本(JDK 17)的多项核心特性奠定了基础。


目录

  1. Switch 表达式(Preview)
  2. Pattern Matching for instanceof(Preview)
  3. String 新方法:transform()
  4. NumberFormat 增强:紧凑数字格式
  5. Files.mismatch() 方法
  6. JVM Constants API
  7. Shenandoah GC(实验性)
  8. G1 GC 多项增强
  9. ZGC 未提交内存回收(实验性)
  10. 默认 CDS 归档
  11. Microbenchmark Suite
  12. AArch64 统一端口
  13. JDK 12 特性总览表
  14. 总结

1. Switch 表达式(Preview)

1.1 概述

JEP 325 引入了Switch 表达式作为预览特性。Switch 表达式支持箭头语法(->),无需break语句,并且可以作为表达式返回值。这是 Java 语言演进中最受期待的特性之一,最终在 JDK 14 正式定稿。

核心改进

  • 箭头标签(->):无需break,不会穿透(fall-through)
  • 作为表达式使用:可以返回值给变量
  • yield关键字:在代码块中返回值

1.2 代码案例

// ============ 1. 传统 switch vs Switch 表达式 ============// 传统 switch(需要 break,容易遗漏)Stringday="MONDAY";Stringtype;switch(day){case"MONDAY":case"TUESDAY":case"WEDNESDAY":case"THURSDAY":case"FRIDAY":type="工作日";break;case"SATURDAY":case"SUNDAY":type="周末";break;default:type="未知";}// Switch 表达式(箭头语法,无需 break)Stringtype2=switch(day){case"MONDAY","TUESDAY","WEDNESDAY","THURSDAY","FRIDAY"->"工作日";case"SATURDAY","SUNDAY"->"周末";default->"未知";};System.out.println(type2);// "工作日"// ============ 2. 多值匹配 ============intnumLetters=switch(day){case"MONDAY","FRIDAY","SUNDAY"->6;case"TUESDAY"->7;case"THURSDAY","SATURDAY"->8;case"WEDNESDAY"->9;default->thrownewIllegalStateException("Invalid day: "+day);};System.out.println(numLetters);// 6// ============ 3. yield 关键字(代码块返回值) ============// 当 case 分支需要多行逻辑时,使用 yield 返回值Stringresult=switch(day){case"MONDAY"->{System.out.println("新的一周开始了");yield"工作日";}case"FRIDAY"->{System.out.println("快到周末了");yield"工作日";}case"SATURDAY","SUNDAY"->{System.out.println("享受周末");yield"周末";}default->{yield"未知";}};// ============ 4. 结合枚举使用 ============enumStatus{PENDING,APPROVED,REJECTED,COMPLETED}StringdescribeStatus(Statusstatus){returnswitch(status){casePENDING->"待审批";caseAPPROVED->"已批准";caseREJECTED->"已拒绝";caseCOMPLETED->"已完成";};// 编译器知道所有枚举值已覆盖,无需 default}System.out.println(describeStatus(Status.APPROVED));// "已批准"// ============ 5. 结合模式匹配(Preview) ============Objectobj="Hello JDK 12";Stringdescription=switch(obj){caseIntegeri->"整数: "+i;caseStrings->"字符串: "+s;caseLongl->"长整数: "+l;casenull->"空值";default->"未知类型: "+obj.getClass().getSimpleName();};System.out.println(description);// "字符串: Hello JDK 12"// ============ 6. 在表达式中使用 ============// 直接作为方法参数System.out.println(switch(day){case"MONDAY"->"周一";case"TUESDAY"->"周二";case"WEDNESDAY"->"周三";case"THURSDAY"->"周四";case"FRIDAY"->"周五";default->"其他";});// 用于三元表达式intx=5;Stringparity=switch(x%2){case0->"偶数";case1->"奇数";default->"未知";};// ============ 7. 传统 switch 的穿透问题对比 ============// 传统 switch 容易遗漏 break 导致穿透Stringfruit="apple";switch(fruit){case"apple":System.out.println("苹果");// 忘记 break,会穿透到下一个 casecase"banana":System.out.println("香蕉");break;case"orange":System.out.println("橙子");break;}// 输出:苹果 香蕉(穿透了!)// Switch 表达式不会穿透switch(fruit){case"apple"->System.out.println("苹果");case"banana"->System.out.println("香蕉");case"orange"->System.out.println("橙子");}// 输出:苹果(不会穿透)

2. Pattern Matching for instanceof(Preview)

2.1 概述

JEP 305 引入了instanceof 模式匹配作为预览特性。当instanceof检测成功后,自动将对象转换为指定类型并绑定到一个新变量,省去显式类型转换。该特性最终在 JDK 16 正式定稿。

2.2 代码案例

// ============ 1. 传统 instanceof vs 模式匹配 ============Objectobj="Hello JDK 12";// 传统写法:先判断,再强制转换if(objinstanceofString){Stringstr=(String)obj;System.out.println(str.length());}// 模式匹配写法:判断的同时绑定变量if(objinstanceofStringstr){System.out.println(str.length());// 直接使用 str}// ============ 2. 简化条件分支 ============// 传统写法if(objinstanceofInteger){intvalue=(Integer)obj;System.out.println("Integer: "+value);}elseif(objinstanceofLong){longvalue=(Long)obj;System.out.println("Long: "+value);}elseif(objinstanceofString){Stringvalue=(String)obj;System.out.println("String: "+value);}elseif(obj==null){System.out.println("null");}else{System.out.println("Unknown: "+obj.getClass());}// 模式匹配写法if(objinstanceofIntegeri){System.out.println("Integer: "+i);}elseif(objinstanceofLongl){System.out.println("Long: "+l);}elseif(objinstanceofStrings){System.out.println("String: "+s);}elseif(obj==null){System.out.println("null");}else{System.out.println("Unknown: "+obj.getClass());}// ============ 3. 结合逻辑表达式 ============// instanceof 模式匹配可以与 && 结合// 变量只在条件为 true 时可用if(objinstanceofStrings&&s.length()>5){System.out.println("长字符串: "+s);}// ============ 4. 在 equals 方法中使用 ============classPoint{privatefinalintx;privatefinalinty;Point(intx,inty){this.x=x;this.y=y;}// 传统 equals@Overridepublicbooleanequals(Objectobj){if(this==obj)returntrue;if(!(objinstanceofPoint))returnfalse;Pointother=(Point)obj;returnthis.x==other.x&&this.y==other.y;}// 模式匹配简化 equalspublicbooleanequalsV2(Objectobj){if(this==
http://www.cnnetsun.cn/news/3409316.html

相关文章:

  • Redis典型应用 - 分布式锁,引入过期时间,Lua脚本原子解锁操作,看门狗机制实现过期时间动态续约,Redlock算法
  • 新材料制造工业数据中台解决方案
  • 构建高性能存储网络:NVMe-oF、SPDK与RDMA的融合实践
  • 2026免费数字人平台怎么选:基于功能、成本、体验的实测选型框架,新手、老板IP和商用团队分别看什么
  • HTTP状态码404:从“死链接”到“软404”的SEO陷阱与实战修复
  • 小白程序员转行AI必看:Agent开发vs大模型开发,谁更适合你?
  • Gemini 3.5 到底适合做什么?2026最新大模型实用边界与选型攻略
  • 《VLOOKUP/XLOOKUP 匹配不到受局限!Python写一个 多条件模糊匹配,更强的提升excel处理效率》
  • LTC4417IUF#TRPBF是一款36V 工业级防反灌电源控制器
  • springboot外卖点餐系统00198-计算机课程设计/毕业设计
  • 【Springboot毕设全套源码+文档】基于springboot图书管理系统的设计与实现(丰富项目+远程调试+讲解+定制)
  • 功率电路死区时间测量与计算:从理论到工程实践
  • 从示波器带宽反推信号上升沿:0.35系数的实战应用与选型指南
  • R Shiny生产级仪表盘实战:架构设计、缓存优化与权限部署
  • 《Java 100 天进阶之路》第60.4篇:多线程代码示例集(2026版)
  • 2026年云计算运维实战:Docker与Kubernetes全链路技能指南
  • 命名空间:面试官问“using namespace std到底好不好”,我差点说错
  • 别再用默认设置跑 Claude Code 了:12 个需要立刻开启的配置
  • Audacity音频编辑神器:5个步骤从零开始创作专业音频作品
  • 模板驱动型文档自动化:从内容到专业PDF的确定性工作流
  • 8051存储空间深度解析:从哈佛结构到SFR位寻址的实战指南
  • UI与代码平衡:提升开发效率与产品质量的关键策略
  • 多维聚合数据变形术:Slice/Dice/Rollup/Drill-down实战
  • 大模型的底层秘密:数据结构如何决定LLM的推理速度与上下文
  • KLayout版图比对工具strmxor的顶层单元命名优化:解决LVS验证中的导航难题
  • AM574x PRU-ICSS手动IO时序配置:从原理到实战的精密调校指南
  • 指令重排序
  • docker mysql主从安装-元一软件
  • 博客重构三次后的心得
  • [计算机入门] 键盘分区与高效操作指南