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 分发
钻石操作符
泛型实例化时,若右侧类型参数可从左侧声明推断,可省略重复的类型参数,写 <>:
// JDK 6
Map<String, List<String>> map = new HashMap<String, List<String>>();
// JDK 7
Map<String, List<String>> map = new HashMap<>();
try-with-resources
实现了 AutoCloseable(Closeable 的子接口)的资源,可在 try 语句中声明,块结束时自动调用 close(),且支持 suppressed exception:
try (BufferedReader br = Files.newBufferedReader(path, StandardCharsets.UTF_8)) {
return br.readLine();
}
JDBC 4.1 中 Connection、Statement、ResultSet 也实现了 AutoCloseable,可同样使用。
多异常捕获
一个 catch 块可同时捕获多种异常类型,异常参数隐式为 final:
try {
// ...
} catch (IOException | SQLException ex) {
logger.log(Level.SEVERE, ex.getMessage(), ex);
}
switch 支持 String
switch 的 case 标签可以是 String(内部基于 hashCode 与 equals 实现,注意 null 会抛 NullPointerException):
String key = "A";
switch (key) {
case "A":
System.out.println("A");
break;
case "B":
System.out.println("B");
break;
default:
System.out.println("other");
}
二进制字面量与数字下划线
JDK 7 起整数字面量可用 0b / 0B 表示二进制;可在数字之间插入 _ 提高可读性(编译时忽略,不能出现在数字开头/结尾或小数点旁):
int mask = 0b0010_0101;
long ccNumber = 1234_5678_9012_3456L;
float pi = 3.14_15F;
long hex = 0xFF_EC_DE_5E;
int add = 12_3 + 3_2_1;
完整示例:
public class NumericLiteralsDemo {
public static void main(String[] args) {
long ccNumber = 1234_5678_9012_3456L;
long ssn = 999_99_9999L;
float pi = 3.14_15F;
byte byteInBinary = 0b0010_0101;
long longInBinary = 0b11010010_01101001_10010100_10010010;
System.out.println("ccNumber=" + ccNumber);
System.out.println("byteInBinary=" + byteInBinary);
}
}
NIO.2(java.nio.file)
JDK 7 引入全新的文件 API,替代部分 java.io.File 的用法:
| 类 / 接口 | 作用 |
|---|---|
Path / Paths |
路径表示与解析 |
Files |
读写、复制、移动、删除、属性读写 |
DirectoryStream |
目录遍历 |
FileVisitor |
递归遍历目录树 |
WatchService |
监听目录变更事件 |
Path dir = Paths.get("/tmp/data");
Files.createDirectories(dir);
Path file = dir.resolve("hello.txt");
Files.write(file, "JDK 7 NIO.2".getBytes(StandardCharsets.UTF_8));
List<String> lines = Files.readAllLines(file);
并发增强
ForkJoin 框架
ForkJoinPool 与 ForkJoinTask 面向可分解的计算密集型任务,采用工作窃取(work-stealing)调度,适合分治算法。
Phaser
Phaser 是可重用的同步屏障,支持动态注册/注销参与者,比 CyclicBarrier 更灵活,适合多阶段并行流水线。
其他
LinkedTransferQueue:实现TransferQueue,支持生产者直接 hand-off 给消费者ThreadLocalRandom:高并发场景下比Random更高效
invokedynamic 与 Method Handles
JSR 292 在 JVM 字节码层加入 invokedynamic 指令,并提供 java.lang.invoke 包(MethodHandles、MethodType 等)。JDK 7 本身几乎用不到,但为 Groovy、JRuby 等动态语言以及 JDK 8 Lambda 的实现奠定了基础。
JVM 与 GC 变化
G1 垃圾收集器
G1(Garbage-First)最早在 JDK 6u14 以实验性选项引入;JDK 7u4 起转为正式支持(-XX:+UseG1GC),面向大堆、可预测停顿,但仍需显式开启,不是默认项;JDK 9 起才成为默认 GC。详见 InfoQ:JDK 7 G1。
JDK 7 可用收集器速查
| 收集器 | 启用参数 | 说明 |
|---|---|---|
| Serial | -XX:+UseSerialGC |
单线程,小数据量/单核场景 |
| Parallel(默认) | -XX:+UseParallelGC |
Parallel Scavenge + Parallel Old,吞吐量优先 |
| CMS | -XX:+UseConcMarkSweepGC |
ParNew + CMS,低停顿;此时还没有被标记废弃(标记废弃是 JDK 9 的 JEP 291) |
| G1 | -XX:+UseG1GC |
JDK 6u14 实验性引入,JDK 7u4 起转为正式支持;仍需显式开启,不是默认项 |
ZGC、Shenandoah、Epsilon 都是 JDK 11/12 才出现的;针对过时 GC 组合的 JEP 173(标记废弃)、JEP 214(移除)也是 JDK 8/9 之后的事,JDK 7 里还不涉及。完整时间线见 Java GC。
字符串常量池位置
JDK 7 将字符串常量池从 PermGen 移到 Java Heap。这意味着:
-XX:StringTableSize可调(默认约 60013)- 大量
intern()不再直接挤占 PermGen,但仍会占用堆内存
PermGen 在 JDK 8 中被 Metaspace 取代(见 JDK 8)。
工具
- jcmd:统一诊断入口,可列出 Java 进程、触发 GC、查看 VM 标志等(JDK 7u40 起完善,见
jcmd) - VisualVM:监控 CPU、内存、线程,分析堆 dump
与 JDK 8 的衔接
JDK 7 解决了泛型样板代码、资源泄漏、文件 API 老旧等痛点;JDK 8 在此基础上引入 Lambda、Stream、java.time 等更大规模的语法与类库变革。对比阅读:JDK 8。
参考
- Java 7 新特性(IBM developerWorks)
- Java 7 的 6 个新特性
- Underscores in Numeric Literals
- JDK 7 Garbage First Collector(InfoQ)
- OpenJDK JDK 7 Project
维护记录
| 时间 | 修改内容 | 原因 |
|---|---|---|
| 2026-06-20 | 文件重命名为 java-7-numeric-literals.md;更新 title、url、categories、tags;整理正文与参考链接 |
文件名含中文不符合规范;内容与标题对齐 |
| 2026-06-20 | 重命名为 jdk-7-features.md;扩展为 JDK 7 全特性概览;添加 aliases |
用户需要系统了解 JDK 7 引入的特性 |
| 2026-06-20 | title 改为「JDK 7 特性」;修正 JDK 8 站内链接 | 全系列统一命名,去掉「新特性」 |
| 2026-06-20 | 重命名为 jdk-7.md;title 改为「JDK 7」;url 改为 jdk-7 |
全系列统一简洁命名 |
| 2026-07-14 | 修正 G1 描述(实验性引入是 6u14,7u4 起才是正式支持,原文误写为 7u4 实验性提供);新增「JDK 7 可用收集器速查」表格 | 原描述与事实不符;用户要求补充可用 GC 列表 |