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