news 2026/7/15 21:17:45

JDK 12 新特性详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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==
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/15 21:15:35

Redis典型应用 - 分布式锁,引入过期时间,Lua脚本原子解锁操作,看门狗机制实现过期时间动态续约,Redlock算法

目录 什么是分布式锁? 多节点对共享资源的访问 分布式锁的基础实现 实现步骤引入过期时间引入校验机制引入 Lua 对 Lua 的介绍 引入看门狗 (watch dog) 两个时间概念具体例子注意点(对锁的续约时间理解) 引入 Redlock 算法 解决方案 什么是分布式锁? 多节点对…

作者头像 李华
网站建设 2026/7/15 21:15:05

新材料制造工业数据中台解决方案

某新材料制造型企业拥有多个生产厂房及自动化生产设备,涵盖配料、成型、切割、中涂、分色、包装等工艺流程。为全面推进数字化转型,企业计划构建数字化车间管理机系统,重点在于全面采集各工艺及产线设备数据,并实现对设备监控、故…

作者头像 李华
网站建设 2026/7/15 21:13:47

构建高性能存储网络:NVMe-oF、SPDK与RDMA的融合实践

1. 为什么需要高性能存储网络?现代数据中心对存储性能的要求越来越高。传统存储架构在应对AI训练、高频交易、实时分析等场景时,往往面临延迟高、吞吐低的瓶颈。想象一下,当你在玩在线游戏时,如果每次加载地图都要等待几秒钟&…

作者头像 李华
网站建设 2026/7/15 21:13:03

2026免费数字人平台怎么选:基于功能、成本、体验的实测选型框架,新手、老板IP和商用团队分别看什么

2026免费数字人平台怎么选:基于功能、成本、体验的实测选型框架,新手、老板IP和商用团队分别看什么 如果你正在搜“免费数字人平台怎么选”,很容易被两类内容带偏。 一类是单纯的排行榜:把平台从第一名排到第十名; 另一…

作者头像 李华
网站建设 2026/7/15 21:12:05

HTTP状态码404:从“死链接”到“软404”的SEO陷阱与实战修复

1. 404错误的本质:从"死链接"到"软404"的认知升级当你在浏览器地址栏输入一个网址,却看到"404 Not Found"的提示时,这意味着服务器无法找到你请求的资源。这种标准404错误就像图书馆里找不到的书——系统明确告…

作者头像 李华
网站建设 2026/7/15 21:10:32

小白程序员转行AI必看:Agent开发vs大模型开发,谁更适合你?

本文详细对比了大模型开发与Agent开发的区别,指出大模型开发薪资高但门槛极高,适合顶尖人才;而Agent开发则更注重AI落地,学习曲线平缓,适合广泛人群。文章建议初学者关注Agent开发,抓住行业发展红利期&…

作者头像 李华