JDK 1.4

JDK 1.4(J2SE 1.4)于 2002 年 2 月发布。对外称 Java 2 Platform, Standard Edition 1.4;命名体系与后续演变见 Java 版本历史。 1.4 GA 后,下一代 Tiger(JDK 5) 的语言特性即在 JCP 并行规划——含 JSR 175 注解(2002 年 3 月立项),并非等 1.4 维护多年后才起步。详见 JDK 5 §发布历程。 注意:jdk14.md 记录的是 JDK 14(2020),与本文的 JDK 1.4 不是同一版本。 版本号说明 维度 JDK 1.4 平台品牌 J2SE 1.4 java.version 1.4.2_19 等 class major version 48 下一版本 JDK 5 完整命名演变见 Java 版本历史。 概览 语言 assert 断言(-source 1.4 编译,运行时 -ea 开启) 类库 java.util.regex 正则表达式(详见 分组与捕获) NIO(java.nio):Buffer、Channel、Selector、内存映射文件 java.util.logging(JUL,Java 原生日志,见 commons-logging 与 log4j、jcl-over-slf4j) java.util.prefs Preferences API(用户/系统配置持久化) URI 与 URL 区分(java.net.URI) 链式异常(Throwable.initCause()) Image I/O、Java Web Start、Sound API 等 JVM 与性能 HotSpot 成为唯一 VM(1.4.0 起移除 Classic VM;HotSpot 自 JDK 1.3 起已是默认实现,见 HotSpot) Parallel Scavenge 新生代收集器(1.4.0);1.4.1 起 GC 调优选项增强(见 Java GC) 1.4.2 引入自旋锁(-XX:+UseSpinning,见 Java Lock) 工具与诊断 JPDA(Java Platform Debugger Architecture)架构完善 assert 断言 JDK 1.4 在语言层新增 assert 关键字,用于开发/测试阶段的条件检查;默认关闭,生产环境通常不启用。语法、-ea / -da 运行参数及设计取舍详见 Java assertion。 ...

Created 20206-06-20 · Updated 15156-07-15 · 3 min · 461 words · -

JDK 1.0

JDK 1.0 于 1995 年 5 月 23 日由 Sun Microsystems 正式发布,是 Java 语言与平台的第一个对外产品版本。命名与后续演变见 Java 版本历史。 1.0 之前还有别的「版本」吗? 没有更早的对外编号版本。 在 1.0 之前只有 Sun 内部的研发代号与预览构建,不算正式产品线: 阶段 时间(约) 说明 Green 项目 1991 起 Sun 内部面向消费电子设备的研究项目 Oak 1991~1995 语言与运行时的内部代号(James Gosling 等) 更名 Java 1995 初 因商标冲突放弃 Oak,改用 Java Alpha / Beta 1995 上半年 面向开发者的预览版,供 Applet 等场景试用 JDK 1.0 1995-05 首个公开发布、可商用的 JDK 因此讨论「Java 最早版本」时,1.0 就是起点;Oak、Alpha、Beta 是开发史里的名称,不是 0.x 或更早的正式版本号。下一版为 JDK 1.1(1997 年 2 月)。 版本号说明 维度 JDK 1.0 对外名称 Java 1.0 / JDK 1.0 java.version 1.0.x class major version 45(1.0.2 起常见为 45.3) 下一版本 JDK 1.1 概览 1.0 已经具备今天仍熟悉的核心语言形态:类与接口、继承、包、final / static / synchronized、异常(含 checked exception)、数组、基本类型与 String。标准库规模很小——大约 212 个类、8 个包,许多今天常用的 API 尚未出现。 ...

Created 20206-06-20 · Updated 15156-07-15 · 2 min · 324 words · -

JDK 1.1

JDK 1.1 于 1997 年 2 月 19 日发布,是 JDK 1.0 之后的首个重要更新。1.0 以 Applet 与 AWT 打开知名度,1.1 则补上了企业开发所需的一批基础能力:数据库、远程调用、反射、序列化、JAR 打包等。命名与后续演变见 Java 版本历史。 版本号说明 维度 JDK 1.1 对外名称 Java 1.1 / JDK 1.1 java.version 1.1.x class major version 45(minor 3,即 45.3) 上一版本 JDK 1.0 下一版本 JDK 1.2(1998-12,集合框架与 Swing) 概览 语言 内部类(nested classes):成员内部类、局部内部类、匿名内部类、静态嵌套类(详见 Java 内部类) 类库与规范 反射(java.lang.reflect):运行时检查类、方法、字段并调用 JDBC(java.sql):标准数据库访问 API,Java 进入服务端开发的入口之一 RMI(java.rmi):远程方法调用 JavaBeans(java.beans):组件化与 IDE 工具链约定 对象序列化(java.io.Serializable 等):对象持久化与网络传输 JAR(Java ARchive):类与资源的打包格式,配套 jar 命令 国际化(java.util.Locale、ResourceBundle 等)与 Unicode 文本流(Reader / Writer) java.text:日期、数字格式化 java.math:BigDecimal、BigInteger AWT 委托事件模型(delegation event model):用监听器(如 ActionListener)替代 1.0 的 handleEvent() 继承式写法;GUI 代码结构变化较大,属于不兼容的 API 调整 JVM 与性能 引入 JIT 编译器(因平台而异),热点 bytecode 可编译为本地代码,性能较 1.0 纯解释执行明显提升 类卸载(class unloading)等运行时能力增强 仍为 Sun 早期 JVM;HotSpot 要到 1.3 才成为默认实现 工具 jar:打包与解包 JAR serialver:查看序列化类的 serialVersionUID jdb 等调试工具随 JDK 增强 1.1 尚未具备(后续版本才加入) 能力 大致引入版本 Swing、集合框架(HashMap 等) 1.2 java.lang.ref(软/弱/虚引用) 1.2 HotSpot 默认 VM 1.3(1.4 起唯一,见 HotSpot) assert、NIO、标准正则 1.4 泛型、enum、for-each、JUC 5 内部类 1.0 只有顶层类;1.1 起可在类或方法内部定义嵌套类,为回调、封装 helper、匿名监听器等场景提供语法支持: ...

Created 20206-06-20 · Updated 15156-07-15 · 3 min · 487 words · -

JDK 1.3

JDK 1.3(对外称 Java 2 Platform, Standard Edition, v1.3,代号 Kestrel)于 2000 年 5 月 8 日发布,是 JDK 1.2 之后又一次以运行时为核心的升级——最重要的变化不在语言语法,而在 JVM 本身:HotSpot 从此成为默认 VM。命名与后续演变见 Java 版本历史。 版本号说明 维度 JDK 1.3 对外名称 Java 2 SE 1.3 / JDK 1.3 代号 Kestrel java.version 1.3.x class major version 47 上一版本 JDK 1.2 下一版本 JDK 1.4 概览 JVM:HotSpot 成为默认 VM 这是 1.3 最重要的变化。HotSpot 早在 1999 年 4 月就以独立产品 Java HotSpot Performance Engine 发布,可配合 JDK 1.2 使用,但当时不是默认项;JDK 1.3 起 HotSpot 成为默认 VM,旧的 Classic VM 仍可通过参数选用,直到 JDK 1.4 才被彻底移除。详见 HotSpot。 ...

Created 14146-07-14 · Updated 15156-07-15 · 3 min · 437 words · -

JDK 1.2

JDK 1.2(对外称 Java 2 Platform, Standard Edition, v1.2,代号 Playground)于 1998 年 12 月 8 日发布,是 JDK 1.1 之后的一次「平台级」大版本——类库规模扩大近三倍(约 1520 个类、59 个包),并首次启用 Java 2 品牌。命名与后续演变见 Java 版本历史。 版本号说明 维度 JDK 1.2 对外名称 Java 2 SE 1.2 / JDK 1.2 代号 Playground java.version 1.2.x class major version 46 上一版本 JDK 1.1 下一版本 JDK 1.3 「Java 2」中的 2 指平台代际(1.2 这次大改),并非版本号跳到了 2.0;这一代还拆出了 J2SE / J2EE / J2ME 三个平台方向。完整命名脉络见 Java 版本历史。 概览 语言 strictfp 关键字:约束浮点运算严格遵循 IEEE 754,保证跨平台一致性;这个「严格模式 vs. 默认模式」的区分后来被认为没必要,JDK 17 的 JEP 306 让所有浮点运算恢复为始终严格,strictfp 从此变成没有实际效果的保留字(详见下文「与现代 Java 的关系」) 类库 集合框架(java.util.Collection / List / Set / Map 等):统一的容器体系,ArrayList、HashMap、HashSet 等新增实现;1.0/1.1 的 Vector、Hashtable 被改造为实现 List / Map 接口以便互操作(详见 Collection List Set Map 区别) Swing(javax.swing)并入核心,与 AWT、Java 2D、Accessibility、Drag and Drop 一起构成 JFC(Java Foundation Classes) java.lang.ref:软引用(SoftReference)、弱引用(WeakReference)、虚引用(PhantomReference),配合 ReferenceQueue 提供比 finalize() 更可控的对象回收前/回收后通知机制 Java 2D API(java.awt.geom 等):矢量图形、坐标变换、复杂渲染 拖放 API(java.awt.dnd):跨组件、跨应用的拖放交互 Accessibility API(javax.accessibility):屏幕阅读器等辅助技术支持 Java IDL(org.omg.CORBA):内置 CORBA ORB,是后续 RMI-IIOP(JDK 1.3)的基础 安全模型重写:java.security.Policy / ProtectionDomain 引入细粒度、可配置的权限模型,取代 1.1「Applet 沙箱 vs. 本地代码完全信任」的二元划分 Java Plug-in:让浏览器脱离自带(常常过时)的 JVM,改用独立安装、可控版本的 JRE 运行 Applet JVM 与性能 内置改进版 JIT 编译器——但仍是 Classic VM 自带的实现,不是 HotSpot(HotSpot 此时尚未发布,详见下文「与 HotSpot 的关系」) 默认虚拟机依旧是 Classic VM;HotSpot 要到 JDK 1.3 才成为默认项 1.2 尚未具备(后续版本才加入) 能力 大致引入版本 HotSpot 成为默认 VM 1.3 RMI 可选兼容 CORBA IIOP 1.3 JNDI 并入核心 1.3 assert、NIO、标准正则 1.4 泛型、enum、for-each、JUC 5 集合框架 1.0/1.1 只有 Vector、Hashtable、Stack 等各自为政的容器类,缺少统一抽象。1.2 引入的集合框架用一组接口(Collection、List、Set、Map)加多种实现(ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap)统一了这块: ...

Created 14146-07-14 · Updated 15156-07-15 · 3 min · 536 words · -

JDK 7

JDK 7(Java SE 7)于 2011 年 7 月发布,是 Java 6 之后的一次重要版本更新。相对 JDK 6,主要变化集中在语言语法、NIO 文件 API、并发框架、JVM/GC 和诊断工具几方面。 概览 语言与编译器 钻石操作符(Diamond Operator)<> try-with-resources 自动资源管理 多异常捕获(multi-catch) switch 支持 String 二进制整数字面量(0b 前缀) 数字字面量中的下划线 类库 NIO.2(java.nio.file):Path、Files、目录遍历、WatchService 异步 I/O:AsynchronousSocketChannel 等 并发增强:ForkJoinPool、Phaser、LinkedTransferQueue、ThreadLocalRandom JDBC 4.1 invokedynamic 与 Method Handles(JSR 292,为 JVM 动态语言与后续 Lambda 铺路) JVM 与 GC G1 垃圾收集器(6u14 起实验性提供,7u4 起转为正式支持) 字符串常量池从 PermGen 移至 Java Heap 64 位 HotSpot 默认启用 Compressed Oops 工具与诊断 jcmd 与 Diagnostic Command 框架(见 Attach API) VisualVM 随 JDK 分发 钻石操作符 泛型实例化时,若右侧类型参数可从左侧声明推断,可省略重复的类型参数,写 <>: ...

Created 25256-03-25 · Updated 14146-07-14 · 3 min · 521 words · -

JDK 9

JDK 9(Java SE 9)于 2017 年 9 月 21 日发布。相对 JDK 8,最重要的变化是 Java 平台模块系统(JPMS),以及 java.version 去掉前导 1.(JEP 223)。版本号背景见 Java 版本历史。 版本号说明 维度 JDK 8 JDK 9 java.version 1.8.0_xxx 9、9.0.1 等 里程碑 对外 Java 8、对内仍 1.x 对外与系统属性一致 详见 Java 版本历史。 概览 平台与模块化 Java 平台模块系统(JPMS,Project Jigsaw) jlink:定制运行时镜像 jmod:模块打包格式 基于模块的 Runtime 镜像 语言与 API JShell(REPL) 接口 private 方法 集合工厂方法(List.of、Set.of、Map.of 等) Stream API 增强(takeWhile、dropWhile、iterate) Optional 增强 Process API 改造 VarHandle、Stack-Walking API 多版本 JAR(Multi-Release JARs) HTTP/2 Client(孵化) JVM、GC 与工具 G1 成为默认 GC 移除 JDK 8 标记过时的 GC 组合(JEP 214);CMS 被标记废弃(JEP 291) 统一 JVM 日志(Unified JVM Logging) 从 JDK 中移除 Java EE / CORBA 等模块(改由外部维护) Compact Strings(内部字符串存储优化) 模块系统(JPMS) JDK 9 引入 module-info.java 描述模块依赖与导出包,目标是强封装、可裁剪的运行时: ...

Created 5056-01-05 · Updated 14146-07-14 · 2 min · 421 words · -

JDK 8

JDK 8 相对于 JDK 7 引入的主要特性: Lambda 表达式 函数式接口(Functional Interface) Stream API 方法引用(Method Reference) 默认方法(Default Method) Optional 新的日期时间 API(java.time) Nashorn JavaScript 引擎 Base64 并发增强(CompletableFuture、StampedLock、LongAdder) 重复注解(Repeating Annotations) 类型注解(Type Annotations) PermGen 移除,改用 Metaspace HashMap 内部实现优化:链表转红黑树 GC 组合废弃(JEP 173) Lambda 表达式 Lambda 来自数学中的 λ 演算(Lambda Calculus),是函数式编程的理论基础。函数式编程的核心思想是:函数是"一等公民",可以像普通值一样被传递、赋值、返回。JDK 8 引入 Lambda,本质上是给 Java 这门面向对象语言加入了函数式编程的能力。 Lambda 表达式允许将函数(即 Lambda 表达式本身)作为参数传递,简化匿名内部类的写法。 语法结构 (参数列表) -> 方法体 (参数列表):传入的参数,无参数时写空括号 () ->:箭头操作符,读作 “goes to”,分隔参数列表和方法体 方法体:要执行的逻辑 Runnable 是一个接口(java.lang.Runnable),只有一个无参方法 void run(),因此参数列表为空 ()。 // JDK 7:匿名内部类写法 Runnable r = new Runnable() { @Override public void run() { System.out.println("Hello"); } }; // JDK 8:Lambda 写法,箭头右边等价于 run() 的方法体 Runnable r = () -> System.out.println("Hello"); 将函数作为参数传递 JDK 8 之前,Java 无法直接传递"一段逻辑",只能把逻辑包装成匿名对象再传递。Lambda 表达式让你可以直接把逻辑作为参数传入方法,这就是"将函数作为参数传递"的含义。 ...

Created 25256-04-25 · Updated 14146-07-14 · 3 min · 618 words · -

Java version history, jdk history

Java 由 Sun Microsystems 于 1995 年发布,2010 年起由 Oracle 维护。讨论「版本」时容易混用 J2SE 1.4、Java 5、Java SE 8、JDK 17 等说法——它们分属平台品牌、对外版本号、运行时版本字符串、class 文件格式等不同层次。下文先列发布简史与各版本文档链接,再分节说明命名如何演变。 发布简史 时间 版本 备注 1995-05 Java 1.0 语言与平台首次发布 → JDK 1.0 1997-02 Java 1.1 内部类、JAR、RMI 等 → JDK 1.1 1998-12 Java 1.2 Java 2 Platform;Swing、集合框架 1999-04 HotSpot 首次发布 独立 JVM 产品,可配 JDK 1.2 → HotSpot 1999-06 J2SE / J2EE / J2ME 三版平台划分 2000-05 Java 1.3 HotSpot 成为 JDK 默认 VM(Classic 仍可选) 2002-02 J2SE 1.4 assert、NIO、regex、JUL;Classic VM 移除 → JDK 1.4 2004-02 J2SE 1.5 Beta Tiger 公开 Beta(泛型、注解等);早于 GA 2004-09 Java 5 泛型、enum、for-each、注解、JUC → JDK 5 2005-06 Java SE 6 公布 J2SE 更名为 Java SE 2006-12 Java SE 6 GA 脚本引擎、Web Service 增强 2011-07 Java SE 7 GA NIO.2、ForkJoin → JDK 7 2014-03 Java SE 8 GA Lambda、Stream → JDK 8;后被 Oracle 追溯认定为 LTS 2017-09 Java SE 9 GA 模块系统、半年发布模型 → JDK 9 2018-03 Java SE 10 短期版本 2018-09 Java SE 11 新发布策略下首个 LTS 2019~2021 Java 12~16 短期版本 2021-09 Java SE 17 LTS 间隔改为每 2 年 → JDK 17 2022~2023 Java 18~20 短期版本 2023-09 Java SE 21 → JDK 21 相对 JDK 17 的变化 2024~2025 Java 22~24 短期版本 2025-09 Java SE 25 → JDK 25 相对 JDK 21 的变化 2026-03 Java SE 26 → JDK 26 相对 JDK 25 的变化 2027-09 Java SE 29(计划) 下一 LTS 2010 年 Oracle 收购 Sun;2017 年起 OpenJDK 成为参考实现。发行版选型见 OpenJDK;企业版演变见 Java EE。 ...

Created 20206-06-20 · Updated 24246-06-24 · 3 min · 636 words · -

JDK 5

JDK 5(Java SE 5)于 2004 年 9 月正式发布,是 JDK 1.4 之后的一次重大更新。第一个对外以「Java 5」而非「Java 1.5」命名的版本;平台品牌 J2SE → Java SE 的过渡亦在此前后。详见 Java 版本历史。 Tiger 语言特性(含注解)自 2002 年起在 JCP 并行规划(JSR 175 等于 JDK 1.4 发布后不久立项);2003 年 12 月有 Early Access 构建,2004 年 2 月公开 Beta——均早于上述正式版。 发布历程 「2004 年 9 月」指 GA(正式版);Tiger 在 JCP 与 Sun 产品线上的里程碑更早: 阶段 大约时间 说明 JDK 1.4 GA 2002-02 1.4 落地后,Tiger 语言特性(含 JSR 175 注解)即在 JCP 并行推进 JSR 175 立项 2002-03~04 JCP 评审通过,专家组成立 JSR 175 公开评审 2003-11 注解规范草案公开 Tiger Early Access 2003-12 预发布 JDK(含注解等语言特性),面向早期测试 Tiger 公开 Beta 2004-02 可在 java.sun.com/j2se/1.5 下载试用 JDK 5 Final 2004-09-30 对外称 Java 5 / J2SE 5.0;java.version 仍为 1.5.0_xxx 同一 Tiger 版本还打包了泛型(JSR 14)、枚举与增强 for(JSR 201)、JUC(JSR 166)等;整体由 JSR 176(J2SE 5.0 Release Contents)归集交付。 ...

Created 28286-03-28 · Updated 24246-06-24 · 3 min · 560 words · -

JDK 17

概述 JDK 17 是 Java 的长期支持版本(LTS),于 2021 年 9 月发布。上一个 LTS 是 JDK 11(2018 年 9 月);中间 JDK 12~16 为半年一发的短期特性版本,每版引入少量 JEP,最终在 JDK 17 汇总为新的 LTS 基线。 从 JDK 11 直接跳到 JDK 17 时,需要关注的不只是 JDK 17 当版的 14 个 JEP,还包括 12~16 中已转正的语言特性(switch 表达式、文本块、record、模式匹配等)以及 JVM、工具链方面的累积变化。版本节奏与 LTS 策略见 Java 版本历史。 版本路线(JDK 11 → JDK 17) 版本 发布日期 类型 JEP 数 JDK 11 2018-09 LTS 17 JDK 12 2019-03 短期 8 JDK 13 2019-09 短期 5 JDK 14 2020-03 短期 16 JDK 15 2020-09 短期 14 JDK 16 2021-03 短期 17 JDK 17 2021-09 LTS 14 JDK 12(2019-03) JEP 特性 说明 189 Shenandoah GC(实验) 低延迟 GC,首次以实验特性引入 230 微基准测试套件 JMH 纳入 JDK,便于性能基准编写 325 switch 表达式(预览) switch 可作表达式返回值,支持 yield 334 JVM 常量 API java.lang.constant 包,描述 nominal 常量 340 统一 AArch64 端口 合并 32/64 位 ARM 端口实现 341 默认 CDS 归档 安装时生成默认 class 数据共享归档,缩短启动时间 344 G1 可中止混合回收 混合 GC 周期过长时可中止,降低停顿风险 346 G1 及时归还空闲内存 空闲堆内存更快归还给操作系统 JDK 13(2019-09) JEP 特性 说明 350 动态 CDS 归档 应用退出时生成定制 CDS 归档,进一步加速启动 351 ZGC 归还未用内存 ZGC 将未使用堆页归还给 OS 353 重写旧版 Socket API Socket/ServerSocket 底层实现现代化 354 switch 表达式(第二次预览) 语法与行为微调 355 文本块(预览) 多行字符串字面量,三引号 """ 语法 JDK 14(2020-03) 语言特性 JEP 特性 说明 305 instanceof 模式匹配(预览) 在 instanceof 中直接绑定变量 361 switch 表达式(正式) 预览两轮后转正,可替代传统 switch 语句 359 record(预览) 不可变数据载体,紧凑语法 368 文本块(第二次预览) 转义规则与缩进处理改进 switch 表达式示例: ...

Created 25256-04-25 · Updated 20206-06-20 · 6 min · 1076 words · -

JDK 21 升级到 JDK 25 的变更汇总

JDK 21(2023-09,LTS)到 JDK 25(2025-09,LTS)之间跨越了 JDK 22、23、24 三个非 LTS 版本。JDK 25 是 JDK 21 之后的下一个 LTS,Oracle 计划每两年发布一个 LTS(21 → 25 → 29)。 本文汇总这四个版本的重要变更,重点关注 breaking change 和需要主动迁移的部分。JDK 21 之前的变更见 JDK 17 升级到 JDK 21 的变更汇总;JDK 25 之后的变更见 JDK 26 相对 JDK 25 的变化。 JDK 22(2024 年 3 月) 正式特性 JEP 454: Foreign Function & Memory API(正式版) Project Panama 的核心 API 定稿,替代 JNI 处理本地代码互操作: // 调用 C 库函数 Linker linker = Linker.nativeLinker(); SymbolLookup stdlib = linker.defaultLookup(); MethodHandle strlen = linker.downcallHandle( stdlib.find("strlen").orElseThrow(), FunctionDescriptor.of(ValueLayout.JAVA_LONG, ValueLayout.ADDRESS) ); try (Arena arena = Arena.ofConfined()) { MemorySegment str = arena.allocateFrom("hello"); long len = (long) strlen.invoke(str); } JEP 456: Unnamed Variables & Patterns(正式版) ...

Created 19196-06-19 · Updated 19196-06-19 · 5 min · 937 words · -

JDK 17 升级到 JDK 21 的变更汇总

JDK 17 到 JDK 21 跨越了 JDK 18、19、20 三个非 LTS 版本。本文汇总这四个版本引入的重要变更,重点关注 breaking change 和需要主动迁移的部分。 JDK 18(2022 年 3 月) Breaking Change UTF-8 成为默认字符集(JEP 400) 这是 17 → 21 迁移中最常见的隐性 breaking change。JDK 18 起,Charset.defaultCharset() 固定返回 UTF-8,不再跟随操作系统区域设置。 受影响的场景: new String(bytes) — 未指定编码,依赖平台默认值 new FileReader(file) — 未指定编码 System.out.println() 输出非 ASCII 字符 读写文件时未显式指定编码 对 Linux 生产环境的实际影响 大多数现代 Linux 发行版默认 locale 是 en_US.UTF-8 或 zh_CN.UTF-8,JDK 17 在这类环境下默认字符集本来就是 UTF-8,因此 JDK 18 的这一变更对标准 Linux 服务器基本无感。 真正有风险的场景: Windows 开发/测试环境 — Windows 默认编码是 GBK/CP936,本地测试通过但部署到 Linux 后行为不同 精简容器镜像 — 某些极简 Docker 镜像不设置 locale,LANG 为空,JDK 17 此时默认字符集可能是 US-ASCII,升级到 JDK 18 后反而统一成了 UTF-8 遗留系统 — 有意依赖 GBK 平台编码处理中文数据(如读老数据库导出文件)的项目会出问题 修复方式:所有涉及字节/字符转换的地方显式指定 StandardCharsets.UTF_8。 ...

Created 13136-05-13 · Updated 13136-05-13 · 3 min · 625 words · -