Java チートシート — クイックリファレンス
Java 17+ の構文、OOP、コレクション、頻出標準ライブラリをまとめたクイックリファレンスで、日常の約 80% をカバーします。
Java Java 17 (LTS)
JDK (OpenJDK / Oracle) · OOP・ジェネリクス・関数型 · 静的・強い型付け・名前的型付け
おすすめの学習パス
まず「Hello World とビルド環境」(javac/java または Maven)を通す → 変数、型、制御フローに慣れる → コレクションと Stream API でデータを処理 → オブジェクト指向(継承/インターフェース/ジェネリクス)に踏み込む → 例外処理とラムダをマスター → 最後に必要に応じてファイル、ネットワーク、時間、ビルド/デバッグを查べます。FAQ セクションは後から落とし穴回避に読み返すのがおすすめです。
1.Hello World とビルド環境
Java プログラムをゼロから作成し、コンパイルし、実行する:main メソッド、javac/java、パッケージ、ビルドツール。
最小プログラム
すべての Java プログラムは main メソッドから始まります:public static void main(String[] args)。System.out.println で 1 行出力します。
コンパイルと実行
javac は .java を .class バイトコードにコンパイルし、java が JVM を起動して実行します。javap で逆アセンブルしてバイトコードを確認できます。
コマンドライン引数
main(String[] args) はコマンドライン引数を受け取り、args[0] が最初のユーザー引数です。args.length で個数を判定します。
終了コード
System.exit(code) は JVM を終了させ、終了コードを返します:0 が成功、0 以外が失敗。main 以外のスレッドが動作中でも強制終了できます。
パッケージ宣言
package は所属パッケージを宣言し、ディレクトリ構造と対応し、完全修飾名で利用されます。省略すると無名パッケージになります。
import 文
import は他パッケージのクラスや static メンバーを取り込み、完全修飾名を不要にします。java.lang は既定でインポートされます。
クラスとファイル名
public クラス名はファイル名と一致する必要があります。1 つの .java ファイルに複数の非 public クラスを含めることはできますが、public クラスは 1 つだけです。
Maven / Gradle
大規模プロジェクトではビルドツールを使います:Maven(pom.xml)と Gradle(build.gradle)が依存関係、コンパイル、テスト、パッケージを管理します。
2.変数と定数
変数の宣言、型推論、final 定数、スコープ、型変換。
変数宣言
宣言 = 型 + 名前 + 任意の初期化。Java のローカル変数は使う前に初期化が必要で、フィールドには既定値があります。
var 型推論
var(Java 10+)はコンパイラが型を推論します。ローカル変数にのみ使えます。型が曖昧なときは明示的な宣言が読みやすくなります。
final 定数
final ローカル変数は 1 回だけ代入できます。final フィールドは宣言時かコンストラクタで初期化が必要で、static final は定数です。
スコープ
ブロックスコープ:波括弧内の変数はそのブロック内でのみ見えます。入れ子のブロックでは外側と同じ名前の変数を覆い隠せますが、おすすめしません。
命名規則
クラス名は UpperCamelCase、変数/メソッドは lowerCamelCase、定数は UPPER_SNAKE_CASE、パッケージ名は全て小文字です。
型変換
暗黙変換は狭い型から広い型へ(int→long→double)。明示的なキャストは精度を失う(切り捨て)可能性があります。
null と NPE
null は参照型の空の値です。null に対してメソッド呼び出しやフィールドアクセスを行うと NullPointerException(NPE)が投げられます。Objects ユーティリティで安全に扱えます。
リテラル
整数リテラルは _ で区切れて(可読性)、0x で 16 進、0b で 2 進表記できます。long には L、float には f を付けます。
3.データ型
プリミティブ型とラッパークラス、文字列、配列、列挙型、ジェネリクス、record。
プリミティブ型
Java には 8 種類の基本型がある。byte / short / int / long(整数)、float / double(浮動小数点数)、char、boolean。値はそのまま格納される。
ラッパークラス
Integer/Double/Boolean などのラッパークラスはプリミティブをオブジェクトに格納します。必要に応じてオートボクシング/アンボクシングが暗黙的に行われます。
文字列
String は不変の文字シーケンスで、equals は内容比較、== は参照比較です。変更のたびに新しいオブジェクトが生成されます。
配列
配列は固定長で、インデックスでアクセスし、length プロパティを持ちます。int[] で宣言、new int[n] で生成、{} で初期化します。
列挙型
enum は定数の集合を定義し、フィールドやメソッドを持てる。switch で列挙値を直接扱える。コンパイル時に型安全が保証される。
ジェネリクス
ジェネリクスは型をパラメータ化します:List<T>、Map<K,V>。コンパイル時に型チェックし、実行時は消去されます(type erasure)。
record 型
record(Java 14 でプレビュー、16 で正式)は不変のデータキャリアを 1 行で宣言します:コンストラクタ、equals、hashCode、toString が自動生成されます。
オートボクシングの落とし穴
ボクシング/アンボクシングは == や演算で落とし穴を隠します:-128〜127 の Integer はキャッシュされ、その範囲外では == が false になり得ます。
Object ルートクラス
すべてのクラスは暗黙的に Object を継承します:toString、equals、hashCode、clone、finalize。equals をオーバーライドしたら必ず hashCode もオーバーライドします。
4.参照とメモリ
参照のセマンティクス、null、オブジェクトのコピー、ヒープ/スタック、GC、文字列プール。
参照のセマンティクス
Java にはポインタはなく、オブジェクト変数は参照を保持します(ポインタに似ています)。代入は同じオブジェクトを共有し、変異はすべての別名から見えます。
null 参照
null は参照がどのオブジェクトも指していないことを意味します。null 比較には == / != を使い、メソッドへの null 引き渡しは NPE を起こし得ます。防御的に null チェックしましょう。
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 は条件で分岐します。条件は boolean 式でなければなりません。else-if の連鎖で複数分岐できます。
switch 式
switch(Java 14+)は -> で値を返したり case をまとめたりできます。従来の switch 文もアロー構文を使えます。
for ループ
古典的 for:初期化、条件、増分。インデックスや逆順が必要ならこちら。コレクションの走査は拡張 for を優先します。
拡張 for
for-each は配列と Iterable コレクションをインデックスなしで走査します。コレクションの構造を破壊的に変更してはいけません(例外が投げられます)。
while / do-while
while は条件判定してから実行、do-while は少なくとも 1 回は実行します。回数が不定な場面(ストリーム読み、ポーリング)には while を使います。
break と continue
continue は現在の周回をスキップし、break はループを抜け、ラベル付き break/continue は入れ子のループを制御します。
三項演算子
cond ? a : b は if/else を 1 行で書きます。両側の型は互換性が必要。入れ子の三項演算子は可読性が悪いので避けましょう。
return と早期 return
return はメソッドを終了し値を返します(void は return; のみ)。早期 return はメソッドを読みやすくします(ガード節)。
6.メソッドとラムダ
メソッドシグネチャ、パラメータ、オーバーロード、再帰、ラムダ、関数型プログラミング。
メソッド定義
メソッド = アクセス修飾子 + 戻り型 + 名前 + 仮引数リスト + 本体。void は戻り値なしを意味します。
引数渡し
Java は常に値渡しです:プリミティブは値のコピー、参照型は参照のコピー(メンバー変更は呼び出し元に影響、参照の再代入は影響しない)。
可変長引数
...(可変長引数)は任意個数の同型引数を受け取り、本質的には配列です。引数リストの最後に 1 つだけ置けます。
メソッドオーバーロード
同じ名前で仮引数リスト(個数/型)が異なるメソッドはオーバーロードです。実引数の型に応じて最も一致する版が選ばれます。戻り型は判別に含まれません。
再帰
メソッドが自身を呼び出すのが再帰です。基底条件がないと呼び出しスタックがオーバーフローします。
ラムダ式
ラムダは (引数) -> 式 で関数型インターフェースのインスタンスです。型推論の省略や単一引数の括弧省略もできます。
メソッド参照
:: メソッド参照はラムダの短縮形です:ClassName::staticMethod、obj::instanceMethod、ClassName::new。
関数型インターフェース
抽象メソッドを 1 つだけ持つインターフェースはラムダのターゲットになれます。主なもの:Runnable、Function、Consumer、Predicate、Supplier。
Stream API
Stream はコレクションをチェーンで処理します:filter、map、collect。Stream は遅延評価で、ソースを変更しません。
7.文字列
文字列リテラル、連結、StringBuilder、よく使うメソッド、フォーマット。
文字列リテラル
ダブルクォート文字列、\n エスケープ、テキストブロック(Java 15+)は 3 つのダブルクォートで複数行を保持します。
連結
+ で文字列を連結し、他型と連結すると自動的に文字列へ変換されます。数回の連結なら十分、ループ内では 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 は FIFO(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 でチェーンし、終端操作で実行がトリガされます。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 メソッドはインスタンスメンバーにアクセスできません。static ブロックで初期化します。
内部クラスと匿名クラス
内部クラス、匿名クラス、ラムダはコールバックを簡潔にします。static 内部クラスは外部インスタンスを保持しないため、メモリリークを避けられます。
11.例外処理
try/catch/finally、例外階層、検査例外/非検査例外、try-with-resources、カスタム例外。
try / catch / finally
try は失敗し得るコードを、catch は処理し、finally は成功失敗に関わらず実行されます(クリーンアップ用)。例外は上方向に伝播します。
複数 catch
複数の catch は型でマッチし、具体的な例外を先に汎用例外を後に置きます。マルチキャッチ | で関係のない型をまとめられます。
throw と再 throw
throw new は例外を投げます。catch 内の throw;(Java 7+)は元をそのまま再 throw し、スタックを保ちます。メソッドの throws で検査例外の可能性を宣言します。
カスタム例外
カスタム例外は Exception(検査)または RuntimeException(非検査)を継承します。慣例としてクラス名は Exception で終えます。
検査例外と非検査例外
検査例外(IOException など)は catch または宣言が必須、非検査例外(RuntimeException 系)はコンパイル時に強制されません。
try-with-resources
try (リソース) { } は AutoCloseable.close() を自動的に呼び、例外時も閉じます。手動の finally 閉じを置き換えます。
例外のコスト
例外捕捉はコストが高い(スタックウォーキング)ので制御フローに使わないこと。予測可能なエラーは戻り値、null チェック、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 でオブジェクトをシリアライズ(クラスは Serializable 実装が必要)。現代では JSON の方が一般的です。
一時ファイル
Files.createTempFile はシステムの一時ディレクトリにファイルを作ります。使い終わったら Files.deleteIfExists で削除し、残さないようにします。
13.よくある落とし穴(FAQ)
Java 開発者が最も踏む落とし穴:== と equals、ボクシングキャッシュ、並行処理、例外、コレクションの破壊的変更。
== vs equals
文字列/オブジェクトの内容比較には必ず equals を使い、== は参照比較です。リテラルプールで == が偶然 true になることはありますが、依存してはいけません。
Integer キャッシュ
オートボクシングの -128〜127 はキャッシュされ、== が true になり得ますが、範囲外は false。オブジェクト比較は常に equals を使いましょう。
null チェックと NPE
null に対するメソッド呼び出しは必ず NPE。null 許容値には Optional または事前 null チェックを使い、try-catch NPE を散らさない。
例外を飲み込む
catch 後に何もしないと例外を静かに飲み込み、デバッグが困難になります。最低でもログを出すか、適切な例外に包んで再 throw します。
equals と hashCode
equals をオーバーライドしたら必ず hashCode もオーバーライドします。さもないと HashSet/HashMap の挙動が壊れます(論理的に等しいオブジェクトが別キーになる)。
反復中の削除
拡張 for の中で List.remove を呼ぶと ConcurrentModificationException が投げられます。Iterator.remove か、集めてから削除します。
日付の可変性
旧 Date/Calendar は可変でエラーになりやすいです。java.time(LocalDate、LocalDateTime)に統一すれば不変で安全。
スレッドセーフ
HashMap/ArrayList はスレッドセーフでないため、複数スレッドでの書き込みは壊れます。ConcurrentHashMap か同期ラッパーを使います。
Stream の null
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 より柔軟:タイムアウト、割り込み、公平。finally で必ず unlock します。
15.ネットワークと HTTP
HttpClient、URL リクエスト、JSON シリアライズ、WebSocket。
HttpClient 基本
java.net.http.HttpClient(Java 11+)で HTTP リクエストを送ります。send は同期、sendAsync は非同期。ビルダーで設定。
POST と JSON
JSON ボディ付き POST。Jackson か Gson で JSON を(デ)シリアライズ。
非同期リクエスト
sendAsync は CompletableFuture を返し、呼び出しスレッドをブロックしません。複数リクエストを thenApply で並行処理。
URL と URLConnection
旧 API の URL/HttpURLConnection は単純なリクエスト向け。たいていは HttpClient の方が簡潔。クエリパラメータは URL エンコードが必要。
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 時点(エポック秒/ナノ秒)で、タイムゾーンを横断する保存に適します。システム時刻は System.currentTimeMillis。
Duration と Period
Duration は時間ベースの量(秒/ナノ秒)、Period は日付ベースの量(年/月/日)。
フォーマットとパース
DateTimeFormatter でフォーマットとパース。ISO などの組み込みや 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 からオプションを解析: simple なケースは手動ループ、複雑なら picocli/JCommander ライブラリ。
シャットダウンフック
Runtime.addShutdownHook で JVM 終了時のクリーンアップを登録。System.exit も発火。フックで重い処理は避けましょう。
作業ディレクトリ
user.dir システムプロパティはプロセスの現在の作業ディレクトリ。ProcessBuilder.directory で子プロセスの開始ディレクトリを指定。
システムプラットフォーム情報
システムプロパティはプラットフォーム情報を提供します:os.name(OS)、os.arch(アーキ)、file.separator(パス区切り)、line.separator(改行)。
18.正規表現
Pattern/Matcher、マッチ、キャプチャグループ、置換、よく使うパターン。
Pattern と Matcher
Pattern.compile で正規表現をコンパイル(キャッシュして再利用)、matcher でテキストにマッチ。find、matches、lookingAt の 3 種があります。
キャプチャグループ
丸括弧は部分文字列をキャプチャし、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、電話番号のよく使う正規表現。本番品質の検証(実メール形式など)は専用ライブラリを使いましょう。
量指定子とアンカー
* 0 回以上、+ 1 回以上、? 0 または 1 回、{n,m} 指定回数。^ 行頭、$ 行末、\b 単語境界。
先読みと後読み
先読み (?=...) は後続を検査、否定先読み (?!...) は後続を除外、後読み (?<=...) は先行を検査。いずれも文字を消費しません。
19.ビルドとデバッグ
Maven/Gradle、javac/jar、JUnit、JVM デバッグ。
Maven ライフサイクル
mvn compile/test/package/install は Maven のライフサイクルフェーズ。target ディレクトリに class と jar を出力。
pom.xml
pom.xml はプロジェクトを定義します:groupId/artifactId/version の座標、dependencies、properties。
Gradle
Gradle は Groovy/Kotlin DSL ベース。タスクがビルド手順を定義し、依存はセントラルリポジトリから解決。
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 の依存はスコープで分類:compile/test/runtime。exclusions で推移的依存を除外、バージョン競合は dependencyManagement で統一。
このチートシートについて
このページは Java 17(LTS)の自己完結型クイックリファレンスで、言語コア、JDK の頻出ライブラリ、ビルドエコシステムを実プロジェクトの日常の約 80% をカバーします。内容はモダンなイディオムを重視:var によるローカル変数型推論、switch 式、テキストブロック、record、sealed クラス、Stream API。Java は 1995 年に Sun Microsystems がリリースし、「write once, run anywhere」の JVM エコシステムで知られ、エンタープライズバックエンド、Android 開発、ビッグデータで最も広く使われている言語の一つです。 19 のセクションはそれぞれ 1 つのテーマに焦点を当てます:基本構文、変数、型と参照、制御フロー、関数、文字列、コレクションフレームワーク(List/Set/Map)、メモリ管理(GC)、オブジェクト指向、例外処理、IO、よくある落とし穴、並行処理、ネットワーク、時間、プロセス、正規表現、ビルドツール(Maven/Gradle)。各サブセクションは「概念紹介 + そのままコピーできるコードスニペット」のペアで構成されています。 すべてのコードとテキストはブラウザ内でローカルにレンダリングされ、デバイスからデータは一切出ません。権威あるリファレンスは Oracle 公式 Java ドキュメントを参照してください。
バージョン 2.1.0