Java 速查 — 简明参考
Java 17+ 语法、OOP、集合与最常用标准库速查手册,覆盖约 80% 日常场景。
Java Java 17 (LTS)
JDK (OpenJDK / Oracle) · OOP · 泛型 · 函数式 · 静态 · 强类型 · 名义类型
学习路径
先跑通「Hello World 与构建环境」(javac/java 或 Maven)→ 熟悉变量、类型与流程控制 → 用集合与 Stream API 处理数据 → 深入面向对象(继承/接口/泛型)→ 掌握异常处理与 lambda → 最后按需查文件、网络、时间与构建调试。FAQ 节适合回头避坑。
1.Hello World 与构建环境
从零编写、编译并运行一个 Java 程序:main 方法、javac/java、包与构建工具。
最小程序
每个 Java 程序都从 main 方法开始:public static void main(String[] args)。System.out.println 输出一行。
编译与运行
javac 把 .java 编译成 .class 字节码,java 启动 JVM 运行。javap 反编译查看字节码。
命令行参数
main(String[] args) 接收命令行参数,args[0] 起为用户参数。args.length 判断数量。
退出码
System.exit(code) 终止 JVM 并返回退出码,0 成功、非 0 失败。非 main 线程仍在运行时可强制退出。
包声明
package 声明所在包,对应目录结构,用全限定名区分类型。缺省为匿名包。
import 导入
import 导入其他包的类或静态成员,省去全限定名。java.lang 默认导入无需声明。
类与文件名
public 类名必须与文件名一致。一个 .java 文件可含多个非 public 类,但只能有一个 public 类。
Maven / Gradle
大型项目用构建工具:Maven(pom.xml)与 Gradle(build.gradle)管理依赖、编译、测试与打包。
2.变量与常量
变量声明、类型推断、final 常量、作用域与类型转换。
变量声明
声明 = 类型 + 名称 + 可选初始化。Java 局部变量必须先初始化才能用,字段有默认值。
var 类型推断
var(Java 10+)由编译器推断类型,仅限局部变量。类型不明确时显式声明更清晰。
final 常量
final 局部变量只能赋值一次;final 字段必须在声明或构造函数初始化;static final 是常量。
作用域
块作用域:大括号内的变量只在块内可见。嵌套块可遮蔽外层同名变量(不建议)。
命名规范
类名 UpperCamelCase、变量/方法 lowerCamelCase、常量 UPPER_SNAKE_CASE、包名全小写。
类型转换
隐式转换:小范围→大范围(int→long→double)。显式强转可能丢失精度(截断)。
null 与 NPE
null 是引用类型的空值。对 null 调方法/取字段抛 NullPointerException(NPE)。Objects 工具可安全处理。
字面量
整数字面量可用 _ 分隔(可读性)、0x 十六进制、0b 二进制。long 加 L、float 加 f。
3.数据类型
基本类型与包装类、字符串、数组、枚举、泛型与 record。
基本类型
Java 8 种基本类型:byte/short/int/long(整数)、float/double(浮点)、char、boolean。值直接存储。
包装类
Integer/Double/Boolean 等包装类把基本类型装进对象。自动装箱拆箱(boxing/unboxing)在必要时发生。
字符串
String 是不可变字符序列,equals 比内容、== 比引用。每次修改字符串生成新对象。
数组
数组定长、下标访问、length 属性。int[] 声明、new int[n] 创建、{} 初始化。
枚举
enum 定义常量集合,可带字段与方法。switch 可直接用枚举值。编译期类型安全。
泛型
泛型把类型参数化:List<T>、Map<K,V>。编译期类型检查,运行时擦除(type erasure)。
record 类型
record(Java 14+/16 正式)一行声明不可变数据传输类:自动生成构造函数、equals/hashCode/toString。
自动装箱陷阱
装箱拆箱在 == / 运算中暗藏坑:-128~127 的 Integer 有缓存池,之外 == 比较可能 false。
Object 根类
所有类隐式继承 Object:toString、equals、hashCode、clone、finalize。重写 equals 必须重写 hashCode。
4.引用与内存
引用语义、null、对象拷贝、堆栈、GC 与字符串池。
引用语义
Java 没有指针,对象变量保存的是引用(类似指针)。赋值共享同一对象,修改彼此可见。
null 引用
null 表示引用不指向任何对象。比较 null 用 == / !=,传参可能产生 NPE。防御性判空。
Object 方法
toString 描述对象、equals 内容比较、hashCode 哈希。默认实现是引用比较,内容语义需重写。
堆与栈
对象分配在堆(GC 管理)、局部变量与引用在栈。new 的对象引用存储在栈、对象体在堆。
GC 垃圾回收
JVM 自动回收无引用对象,无需手动 free。System.gc() 只是建议,不保证立即执行。
拷贝语义
数组/对象赋值是引用共享。需要独立副本用 clone、Arrays.copyOf 或手动复制。深拷贝需逐层复制。
字符串常量池
字面量字符串缓存在常量池:相同字面量共享。new String() 创建新对象不进池。intern() 手动入池。
finalize 与 Cleaner
finalize 在 GC 前调用但时机不保证(已废弃)。释放外部资源用 AutoCloseable + try-with-resources。
5.流程控制
if/else、switch、for/while 循环、break/continue 与三元。
if / else
if/else 按条件分支。条件必须是布尔表达式。可用 else-if 链多分支。
switch 表达式
switch(Java 14+)可用 -> 表达式返回值和 case 合并。传统 switch 语句也可用箭头语法。
for 循环
经典 for:初始化、条件、步进。需要下标或逆序时用。遍历集合优先增强 for。
增强 for
for-each 遍历数组和 Iterable 集合,无需下标。不可修改集合结构(会抛异常)。
while / do-while
while 先判断后执行;do-while 至少执行一次。循环次数未知的场景(读流、轮询)用 while。
break 与 continue
continue 跳本轮、break 退出循环、带标签 break/continue 控制嵌套循环。
三元运算符
cond ? a : b 一行表达 if/else。两侧类型需兼容。嵌套三元可读性差,避免。
return 与提前返回
return 结束方法并返回值(void 直接 return;)。提前返回让方法更易读(guard clause)。
6.方法与 Lambda
方法签名、参数、重载、递归、Lambda 与函数式编程。
方法定义
方法 = 访问修饰符 + 返回类型 + 名称 + 参数表 + 主体。void 表示无返回值。
参数传递
Java 一律按值传递:基本类型传副本,引用类型传引用的副本(改成员影响原对象,改引用不影响)。
可变参数
... 可变参数接收任意数量同类型参数,本质是数组。必须放参数表最后,只能有一个。
方法重载
同名方法不同参数列表(数量/类型)为重载。按实参类型选最匹配版本。返回类型不参与区分。
递归
方法调用自身为递归。必须要有基线条件(base case)否则栈溢出。
Lambda 表达式
Lambda = 参数 -> 表达式,是函数式接口的实例。可省略类型推断与单参数括号。
方法引用
:: 方法引用是 Lambda 的简写:ClassName::staticMethod、obj::instanceMethod、ClassName::new。
函数式接口
只有一个抽象方法的接口可用 Lambda。常见:Runnable、Function、Consumer、Predicate、Supplier。
Stream API
Stream 链式处理集合:filter 过滤、map 转换、collect 收集。惰性、不修改原集合。
7.字符串
字符串字面量、拼接、StringBuilder、常用方法与格式化。
字符串字面量
双引号字符串、\n 转义、文本块(Java 15+)用三个双引号保留多行格式。
拼接
+ 拼接字符串,字符串与其他类型拼接自动转字符串。少量拼接足够,循环内用 StringBuilder。
常用方法
常用方法:length 取长度、substring 截取、indexOf 查找、replace 替换、split 分割、trim 去除空白与大小写转换。
StringBuilder
大量拼接用 StringBuilder(非线程安全)或 StringBuffer(线程安全):append 后 toString。
格式化
String.format 格式化:%d 整数、%s 字符串、%.2f 小数、%n 换行。可带宽度与标志。
正则匹配
String.matches 整体匹配、replaceAll 按正则替换、split 按正则分割。含正则模式时注意转义。
字符处理
charAt 取字符、Character.isDigit/isLetter/isWhitespace 判断类别。字符串不可变,字符可遍历。
字符串转换
Integer.parseInt 字符串转数字,valueOf/toString 数字转字符串。解析失败抛 NumberFormatException。
8.集合与 Stream
List/Set/Map/Queue 常用实现、遍历、Stream 与排序。
List 列表
List 有序集合,ArrayList 数组实现(查快)、LinkedList 链表实现(插删快)。List.of 不可变列表。
Set 集合
Set 去重集合:HashSet 无序 O(1)、LinkedHashSet 保插入序、TreeSet 排序。add 重复返回 false。
Map 映射
Map 键值映射:HashMap O(1)、LinkedHashMap 保插入序、TreeMap 按键排序。getOrDefault 安全取值。
Queue / Deque
Queue 先进先出(offer/poll/peek),Deque 双端队列(addFirst/addLast)。ArrayDeque 比 LinkedList 快。
遍历与迭代
增强 for / Iterator / forEach 遍历集合。遍历时删除需用 Iterator.remove 或收集后删。
排序
List.sort 或 Collections.sort 排序,Comparator 定制顺序,comparing 链式组合比较器。
Stream 链式操作
filter/map/sorted/distinct/limit 链式,terminal 操作触发执行。collect 收集回集合。
分组与聚合
Collectors.groupingBy 按键分组、partitioningBy 布尔分区、summarizingInt 统计。
不可变集合
List.of/Set.of/Map.of 创建不可变集合。Collections.unmodifiableList 包装只读视图。
9.内存与性能
GC、弱引用、内存泄漏、字符串拼接性能与缓冲区。
字符串拼接性能
循环内 + 拼接会反复创建 String(不可变)。用 StringBuilder 一次组装,性能显著提升。
弱引用与软引用
WeakReference 不阻止 GC(缓存用),SoftReference 内存不足才回收,PhantomReference 回收后清理。
内存泄漏
常见泄漏:静态集合持有对象、未关闭资源、监听器未注销、ThreadLocal 不清理。避免长生命周期持有短对象。
ThreadLocal
ThreadLocal 每线程独立变量副本。Web 容器线程池复用线程,用完不 remove 会跨请求泄漏。
ByteBuffer
ByteBuffer 直接内存(allocateDirect)减少 GC 压力,适合 NIO 与大数据传输。需手动管理。
OutOfMemoryError
OOM 表示内存耗尽。Heap Space 堆满、Metaspace 类过多、Direct buffer 过多。调整 JVM 参数或找泄漏。
数组拷贝
System.arraycopy 高效拷贝数组区间。Arrays.copyOf 复制并可能扩容。循环手动拷贝慢。
对象池复用
频繁创建大对象会加大 GC 压力。用对象池缓存可复用实例,但需注意线程安全与归还路径。
10.面向对象
类、封装、继承、多态、抽象类、接口与访问修饰符。
类与对象
class 定义数据类型:字段存状态、方法定义行为、构造函数初始化、new 创建实例。
封装
字段私有(private)、方法公开(public)控制访问。getter/setter 加校验逻辑,保护不变式。
继承
extends 继承基类。Java 单继承。super 调用父类构造/方法,子类是父类的一种(is-a)。
多态
父类/接口引用指向子类实例,调用虚方法按实际类型分派。@Override 标注重写。
抽象类
abstract 类不能实例化,可含 abstract 方法(子类必须实现)。用于模板基类共享状态。
接口
interface 定义契约:方法默认 public abstract。Java 8+ 有 default/static 方法。可多实现。
访问修饰符
public 全公开、protected 包内+子类、缺省 包内、private 本类。类成员默认包内可见。
static 成员
static 字段/方法属于类而非实例。static 方法不能访问实例成员。静态代码块初始化。
内部类与匿名类
内部类、匿名类、lambda 简化回调。静态内部类不持有外部实例,避免内存泄漏。
11.异常处理
try/catch/finally、异常层级、checked/unchecked、try-with-resources 与自定义异常。
try / catch / finally
try 放可能出错的代码,catch 捕获处理,finally 无论成败都执行(清理资源)。异常向上传播。
多 catch
多个 catch 按类型匹配,具体异常在前、泛异常在后。multi-catch 用 | 合并无关类型。
抛出与重抛
throw new 抛异常。catch 里 throw;(Java 7+)原样重抛保留堆栈。方法声明 throws 标记可能抛出的检查异常。
自定义异常
自定义异常继承 Exception(检查)或 RuntimeException(非检查)。惯例类名以 Exception 结尾。
检查与非检查异常
检查异常(IOException 等)必须处理或声明;非检查异常(RuntimeException 子类)编译期不强制。
try-with-resources
try (资源) { } 自动调用 AutoCloseable 的 close(),异常时也会关。替代手动 finally 关闭。
异常的代价
异常捕获开销高(填堆栈),不做流程控制。可预判错误用返回值/判空/optional。
日志与异常
异常要记录(含堆栈),别 System.out 打印后继续。日志框架(SLF4J+Logback)分级输出。
12.文件与 IO
Files/Path 现代 IO、Scanner、Reader/Writer 与流式读取。
Files 读写
java.nio.file.Files 现代 API:readString/writeString、readAllLines、copy/move/delete。
Scanner 输入
Scanner 读控制台或文件:nextLine 读行、nextInt/nextDouble 读类型。hasNext 判断还有输入。
Reader / Writer
字符流读写文本:BufferedReader 逐行、BufferedWriter 写、try-with-resources 自动关闭。
字节流
InputStream/OutputStream 读写字节:FileInputStream、BufferedInputStream 缓冲。数据搬运用 transferTo。
控制台 IO
System.out 输出、System.in 输入、System.err 错误输出。printf 格式化输出。
Path 路径
Path 表示路径,resolve 拼接、getFileName、toAbsolutePath、exists、Files.walk 递归遍历。
序列化
ObjectOutputStream/ObjectInputStream 序列化对象(需 implements Serializable)。JSON 更常用。
临时文件
Files.createTempFile 在系统临时目录创建文件,用完须 Files.deleteIfExists 清理,避免残留堆积。
13.常见陷阱(FAQ)
Java 开发者最常踩的坑:== vs equals、装箱缓存、并发、异常与集合修改。
== vs equals
字符串/对象比较内容必须用 equals,== 比较引用。字面量缓存池让 == 偶然成立,勿依赖。
Integer 缓存池
自动装箱的 -128~127 有缓存,== 比较可能为 true;范围外为 false。对象比较一律 equals。
判空与 NPE
对 null 调方法必 NPE。可空值用 Optional 或提前判空,别到处 try-catch NPE。
异常吞掉
catch 后不处理就是吞异常,排查困难。至少打日志或原样重抛(包装到合适异常)。
equals 与 hashCode
重写 equals 必须重写 hashCode,否则放 HashSet/HashMap 行为错误(同一逻辑对象算不同 key)。
遍历时删除
增强 for 里 List.remove 抛 ConcurrentModificationException。用 Iterator.remove 或收集后删。
日期可变性
旧 Date/Calendar 可变易出错。统一用 java.time(LocalDate/LocalDateTime)不可变安全。
线程安全
HashMap/ArrayList 非线程安全,多线程写入出问题。用 ConcurrentHashMap 或同步包装。
Stream 空值
Stream 里元素为 null 时 filter/map 可能 NPE。先用 filter(Objects::nonNull) 过滤。
循环拼接
循环内 += 拼接产生大量中间 String,性能差。用 StringBuilder。
14.并发与线程
Thread、synchronized、线程池 ExecutorService 与 CompletableFuture。
Thread 线程
Thread 或 Runnable 创建线程,start 启动、join 等待、sleep 暂停。大多场景线程池更合适。
synchronized
synchronized 加锁保证互斥。锁实例方法锁 this、静态方法锁 Class、代码块可锁任意对象。
volatile
volatile 保证可见性(线程间立即可见),但不保证原子性。状态标志用 volatile,计数用 AtomicInteger。
线程池
ExecutorService 管理线程复用。newFixedThreadPool/newCachedThreadPool,用完 shutdown。
Future 与 Callable
Callable 有返回值的任务,Future.get 阻塞取结果。FutureTask 可手动控制。
CompletableFuture
异步编排:thenApply 转换、thenCombine 合并、allOf 等待多个。回调链式不阻塞主线程。
并发集合
ConcurrentHashMap、CopyOnWriteArrayList、BlockingQueue 线程安全。替代手动加锁的普通集合。
Lock 接口
ReentrantLock 比 synchronized 灵活:可超时、可中断、可公平。Lock 必须手动 unlock(finally)。
15.网络与 HTTP
HttpClient、URL 请求、JSON 序列化与 WebSocket。
HttpClient 基础
java.net.http.HttpClient(Java 11+)发 HTTP 请求。send 同步、sendAsync 异步。构建器配置。
POST 与 JSON
POST 请求带 JSON body。Jackson 或 Gson 序列化反序列化 JSON。
异步请求
sendAsync 返回 CompletableFuture,不阻塞调用线程。多请求并发 thenApply 处理。
URL 与 URLConnection
旧 API URL/HttpURLConnection 简单请求。多数场景用 HttpClient 更简洁。查询参数需 URLEncoder 编码。
JSON 解析
Jackson/Gson 主流 JSON 库。@JsonProperty 映射字段名,Java 17 新特性可结合 record。
调用 Web API
组合:构建请求 → 检查状态码 → 反序列化。处理 404/500 等非成功状态。
WebSocket
java.net.http.WebSocket 双向长连接。Listener 回调接收消息,onOpen/onText 处理。
超时与重试
HttpRequest.timeout 设置请求超时;HttpClient.connectTimeout 连接超时。超时抛 HttpTimeoutException。
16.日期与时间
java.time 本地日期时间、Instant、Duration/Period 与格式化。
LocalDate
LocalDate 日期(无时间):now、of、plusDays/minusMonths。不可变线程安全。
LocalTime
LocalTime 时间(无日期):now、of、plusMinutes。与 LocalDate 组合 LocalDateTime。
Instant 时间戳
Instant 是 UTC 时间点(epoch 秒/纳秒),跨时区存储用。系统计时用 System.currentTimeMillis。
Duration 与 Period
Duration 精确到纳秒的时间间隔(秒级)、Period 以年月日为单位的日期间隔。
格式化与解析
DateTimeFormatter 格式化和解析。预置 ISO 格式,自定义 pattern(yyyy-MM-dd HH:mm:ss)。
时区
ZonedDateTime 带时区、ZoneOffset 固定偏移。ZoneId.systemDefault 本机时区。存储用 UTC。
旧 API 转换
java.util.Date/Calendar 与新 API 转换。Date 可变、易错,新代码用 java.time。
时间戳工具
System.currentTimeMillis 毫秒、nanoTime 纳秒差(仅测间隔,不能对时钟)。时间戳与格式化互转。
17.进程与系统
ProcessBuilder 启动进程、系统属性、环境变量与运行时信息。
ProcessBuilder
ProcessBuilder 启动外部程序。参数用列表避免注入。redirectErrorStream 合并输出。
系统属性
System.getProperty 读 JVM 系统属性:user.home、java.version、os.name。setProperty 设置。
环境变量
System.getenv 读环境变量(不可修改),getenv() 全量。区分系统属性与环境变量。
Runtime 信息
Runtime 提供 JVM 信息:availableProcessors、maxMemory、totalMemory。gc 建议回收。
命令行参数解析
main args 解析选项。简单场景手工循环,复杂用 picocli/JCommander 库。
关闭钩子
Runtime.addShutdownHook 注册 JVM 退出时的清理。System.exit 触发。避免在钩子做耗时操作。
工作目录
user.dir 系统属性是进程当前工作目录。ProcessBuilder.directory 可指定子进程的起始目录。
系统平台信息
系统属性提供平台信息:os.name 操作系统、os.arch 架构、file.separator 路径分隔符、line.separator 换行。
18.正则表达式
Pattern/Matcher、匹配、捕获组、替换与常用模式。
Pattern 与 Matcher
Pattern.compile 编译正则(缓存复用),matcher 匹配文本。find/matches/lookingAt 三种匹配。
捕获组
圆括号捕获子串,group(1) 取第 1 组、命名组 (?<name>...) 用 group("name")。find 循环取全部。
查找全部
find 循环或 matcher.results 拿全部匹配。替换全部用 replaceAll(含 $1 组引用)。
替换
replaceAll/replaceFirst 按正则替换,$1/$2 引用组。Matcher.appendReplacement 逐段处理。
Pattern 标志
Pattern.CASE_INSENSITIVE 忽略大小写、MULTILINE 让 ^$ 匹配行、DOTALL 让 . 匹配换行。
常用模式
邮箱、URL、IP、手机号的常用正则。生产级校验(真邮箱格式)用专门库。
量词与锚点
* 零或多次、+ 一次或多次、? 零或一次、{n,m} 指定次数。^ 行首、$ 行尾、\\b 词边界。
前瞻与后顾
前瞻 (?=...) 检查后文、负向前瞻 (?!...) 排除后文、后顾 (?<=...) 检查前文,均不消费字符。
19.构建与调试
Maven/Gradle、javac/jar、JUnit 与 JVM 调试。
Maven 生命周期
mvn compile/test/package/install 生命周期阶段。target 目录输出 class 与 jar。
pom.xml
pom.xml 定义项目:groupId/artifactId/version 坐标、dependencies 依赖、properties 属性。
Gradle
Gradle 基于 Groovy/Kotlin DSL。task 定义构建步骤,依赖由中央仓库解析。
JUnit 测试
JUnit 5:@Test 测试方法、@BeforeEach 初始化、assert* 断言。mvn test 运行。
jar 打包
jar 命令打包 class。可执行 jar 需要 Main-Class 清单。java -jar 运行。
JVM 参数
-Xmx 最大堆、-Xms 初始堆、-XX:+PrintGCDetails GC 日志、-D 系统属性。
日志配置
SLF4J 门面 + Logback 实现。logback.xml 配置级别与输出。生产别用 System.out。
依赖管理
Maven 依赖按 scope 分类:compile/test/runtime。exclusions 排除传递依赖,版本冲突用 dependencyManagement 统一。
关于本速查
本页是 Java 17(LTS)的自包含速查手册,覆盖语言核心、JDK 常用类库与构建生态在真实项目中约 80% 的常见用法。内容偏向现代惯用法:var 局部变量推断、switch 表达式、文本块、记录类(record)、密封类(sealed)、Stream 流式 API。Java 由 Sun Microsystems 于 1995 年发布,以「一次编写、到处运行」的 JVM 生态著称,是企业后端、Android 开发与大数据领域使用最广的语言之一。 19 个章节各自聚焦一个主题:基础语法、变量、类型与引用、控制流、函数、字符串、集合框架(List/Set/Map)、内存管理(GC)、面向对象、异常处理、输入输出、常见误区、并发、网络、时间、进程、正则与构建工具(Maven/Gradle)。每个小节都配有「概念介绍 + 可直接复制的代码片段」。 所有代码与文字均在浏览器本地渲染,无任何数据离开你的设备。权威参考见 Oracle 官方 Java 文档。
版本 2.1.0