JDK 10 新特性详解

发布时间:2026/7/14 18:47:48
JDK 10 新特性详解 JDK 10 新特性详解JDK 10 于2018年3月20日正式发布,是 JDK 采用新的半年发布周期后的第二个版本(非 LTS)。虽然 JDK 10 不是 LTS 版本,但它引入了var局部变量类型推断这一里程碑特性,以及一系列 JVM 层面的重要优化(G1 并行 Full GC、AppCDS、线程本地握手等),为后续 JDK 版本奠定了基础。目录局部变量类型推断(var 关键字)集合增强 — 不可变集合工厂Optional.orElseThrow()ByteArrayOutputStream 新增方法URLEncoder / URLDecoder 增强其他 API 增强G1 并行 Full GC应用类数据共享(AppCDS)线程本地握手(Thread-Local Handshakes)垃圾回收器接口备用内存设备上的堆分配实验性 JIT 编译器(Graal)基于时间的版本发布方案JDK 10 特性总览表1. 局部变量类型推断(var 关键字)1.1 概述var是 JDK 10 最重要的特性(JEP 286),允许在局部变量声明时省略显式类型,由编译器根据初始化表达式自动推断类型。核心规则:规则说明仅限局部变量不能用于字段、参数、返回类型必须有初始化器var x;编译报错不能初始化为nullvar x = null;编译报错(无法推断类型)不是关键字var是保留类型名,不是关键字不影响运行时编译后与显式类型完全相同支持泛型推断自动推断泛型参数支持钻石操作符var list = new ArrayListString();支持增强 for 循环for (var entry : map.entrySet())不支持传统 for 循环初始化for (var i = 0; ...)可以,但var i, j不行适用场景:长类型名的简化(如MapString, ListInteger)泛型推断简化增强 for 循环中减少冗余提高代码可读性(当类型名不重要时)不适用场景:类型信息对可读性很重要时初始化表达式类型不明确时需要声明特定接口类型时1.2 代码案例// ============ 1. 基本用法 ============// 显式类型(JDK 10 之前)Stringname="Hello";intcount=42;doubleprice=19.99;ListStringlist=newArrayList();// var 推断(JDK 10)varname2="Hello";// 推断为 Stringvarcount2=42;// 推断为 intvarprice2=19.99;// 推断为 doublevarlist2=newArrayListString();// 推断为 ArrayListString// 编译后完全等价,var 只是语法糖System.out.println(name2.getClass().getName());// java.lang.String// ============ 2. 泛型简化 ============// JDK 10 之前MapString,ListIntegermap1=newHashMapString,ListInteger();MapString,MapString,Integernested1=newHashMap();// JDK 10 varvarmap2=newHashMapString,ListInteger();varnested2=newHashMapString,MapString,Integer();// 使用map2.put("key",List.of(1,2,3));nested2.put("outer",Map.of("inner",42));// ============ 3. 增强 for 循环 ============varlist=List.of("Alice","Bob","Charlie");// JDK 10 之前for(Stringname:list){System.out.println(name);}// JDK 10 varfor(varname:list){System.out.println(name);}// Map 遍历varmap=Map.of("a",1,"b",2,"c",3);// JDK 10 之前for(Map.EntryString,Integerentry:map.entrySet()){System.out.println(entry.getKey()+"="+entry.getValue());}// JDK 10 varfor(varentry:map.entrySet()){System.out.println(entry.getKey()+"="+entry.getValue());}// ============ 4. Stream 操作结果 ============varnumbers=List.of(1,2,3,4,5);// 推断为 ListIntegervarfiltered=numbers.stream().filter(n-n2).collect(Collectors.toList());// 推断为 OptionalIntegervarmax=numbers.stream().max(Integer::compareTo);// 推断为 OptionalStringvarfirst=numbers.stream().map(Object::toString).findFirst();// ============ 5. try-with-resources 中使用 ============// JDK 10 之前try(BufferedReaderreader=newBufferedReader(newFileReader("file.txt"))){System.out.println(reader.readLine());}// JDK 10 vartry(varreader=newBufferedReader(newFileReader("file.txt"))){System.out.println(reader.readLine());}// 多个资源try(