Share
Embed
しっかり学ぶ java.lang.*
中級へのステップアップとして java.lang パッケージにある基礎的なクラスをもとに言語機能や言語仕様について学びます。
java.lang パッケージは importなしで参照できるJava言語のもっとも基本的なクラス群で、Javaのプログラムを書いている人は意識せずとも利用しているはずです。例えば System.out.println() といったように。
これらのクラス群の機能を基礎からしっかり学びましょう。
・基本データ型、ラッパークラス類
・Classやリフレクション関連、ClassLoader
・AutoCloseable, Iterable など言語機能に関わるもの
・System, Runtime, Process
・例外関連
・Thread関連
・アノテーション
nagise
November 16, 2025
Transcript
46 slides
-
1 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL しっかり学ぶ java.lang.*
2025.11.15 JJUG CCC Fall 株式会社クレディセゾン エンタープライズ開発センター なぎせゆうき @nagise -
2 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL 自己紹介 富山県出身 富山市在住
株式会社 クレディセゾン 株式会社 凪瀬アーキテクツ 主なジャンル • Java言語仕様 ◦ https://docs.oracle.com/javase/specs/index.html • 書籍 Effective Java の解説ポッドキャスト Tsundokanai Radio ◦ https://podcasters.spotify.com/pod/show/dokanai/ • Javaのジェネリクス • 日本の旧暦のライブラリ (開発中) • Blog : プログラマーの脳みそ • Burikaigi (富山で1月~2月頭で行われるカンファレンス ) なぎせゆうき X (Twitter) @nagise -
3 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL Burikaigi 2026
with TDD Boot Camp & TinyGo Keeb Tour 2026-01 09 (金) 〜 10 (土) 富山国際会議場 -
4 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL 今日の内容 •
java.lang.* パッケージの特徴 • java.lang.Math • ラッパークラス・Number • 文字列 • java.lang.Object • java.lang.Class • java.lang.ClassLoader • java.lang.System • java.lang.Iterable • java.lang.AutoCloseable • java.lang.Cloneable • java.lang.Enum • java.lang.Thread • java.lang.Exception • サブパッケージ -
5 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL 主な出典 •
Java25 API 仕様 (英語) ◦ https://docs.oracle.com/en/java/javase/25/docs/api/index.html • Java21 API 仕様 日本語版 ◦ https://docs.oracle.com/javase/jp/21/docs/api/index.html • The Java® Language Specification Java SE 25 Edition (略称 JLS) ◦ https://docs.oracle.com/javase/specs/jls/se25/html/index.html • The Java® Virtual Machine Specification Java SE 25 Edition (JVMS) ◦ https://docs.oracle.com/javase/specs/jvms/se25/html/index.html • Open JDK JEPs (JEPの後ろに番号をつけてJEP506 などと表す) ◦ https://openjdk.org/jeps/0 • Effective Java 第3版 -
6 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL 方針 本セッションはjava.lang.*のクラス群から言語仕様に関わりの深いものを中心にピックアッ
プしてクラスと言語仕様を紹介していきます 2025年11月現在ではJava25のAPIドキュメントの日本語版がないので、 特に直近の変更がないものについては Java21の日本語版へのリンクとします Java言語仕様 The Java® Language Specification については、どうせ最近のバージョン のものは英語版しかないので Java25の言語仕様へのリンクとします 機械翻訳したもので良いので言語仕様に触れてもらえると嬉しいです -
7 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL java.lang.* パッケージの特徴
import 文なしで利用でき、常に観測可能(observable) §7.3. Compilation Units ※ java.lang パッケージはimport文の先頭に挿入したかの様に動く §7.4.3. Package Observability and Visibility ※ モジュール機能関係の観測可能という概念 classファイル中ではクラス名は完全名で扱われる import文はコンパイル時にどのパッケージからclassを探すか JVM仕様 §4.2.1. Binary Class and Interface Names import文の該当範囲から探して classには完全名で記録される感じ java.langのサブパッケージのclassを扱う際にはimport文が必要 java.lang.annotation.* とか java.lang.ref.* とか java.lang は Java 1.0 の頃から存在するもっとも基本的なパッケージ -
8 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL java.lang.Math 三角関数など数学計算の類のライブラリ
Math クラスと StrictMath クラスがある 古い時代のJavaは浮動小数点数の演算はCPUの実装依存で誤差があった 2001 年頃から Pentium 4 以降のプロセッサに搭載された SSE2 (Streaming SIMD Extensions 2) 拡張機能で IEEE 754 に対応 現代では非対応CPUはほぼない Java17以降はstrictfpキーワードは廃止 (JEP306) そのため、現代ではstrictfpキーワードもStrictMathを使う動機もない JEP 306: Restore Always-Strict Floating-Point Semantics -
9 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL ラッパークラス プリミティブ型に対する参照型
《Java1.0~Java1.1の古い例》 Vector v = new Vector(); v.add(new Integer(42)); Java 5 まではオートボクシングなし 手作業で変換していた コンストラクタはJava9以降非推奨 現代ではnewせずにvalueOfを使う Boolean Byte Short Integer Long Float Double Character boolean byte short int long float double char -
10 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL オートボクシング ラッパー型への自動変換
§5.1.7. Boxing Conversion §5.1.8. Unboxing Conversion ボクシングではラッパー型の valueOf() が用いられる。インスタンスが キャッシュされるケースがある点に注意 アンボクシングでは intValue() などの対応したメソッドが用いられる null値の場合、アンボクシングでNullPointerExceptionが生じる -
11 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL java.lang.Number IntegerやDoubleなどの型のほか、
• java.util.concurrent.atomic.AtomicIntegerなどAtomic系クラス • java.util.concurrent.atomic.LongAdder • java.util.concurrent.atomic.LongAccumulator • java.util.concurrent.atomic.DoubleAdder • java.util.concurrent.atomic.DoubleAccumulator • java.math.BigInteger • java.math.BigDecimal 各プリミティブ型で値を取得できる -
12 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL ラッパー型特記事項 MAX_VALUE
などの定数が定義されている TYPE で対応するプリミティブ型を表すClassオブジェクトが定義 整数型には divideUnsigned()など符号なし演算用メソッド類がある 浮動小数点数ではNaNやPOSITIVE_INFINITYといった定数も isNaN() や isInfinite() で判定する == では NaN を比較できないので注意 §15.21.1. Numerical Equality Operators == and != -
13 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL 文字列 •
java.lang.CharSequence (共通のinterface) • java.lang.String (文字列リテラルなど不変な文字列) • java.lang.StringBuffer (可変な文字列。古いクラス) • java.lang.StringBuilder (可変な文字列。Java5〜) お馴染みStringクラス。言語仕様上は様々な特殊な挙動がある §3.10.5. String Literals JEP 378: Text Blocks -
14 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL java.lang.String お馴染みStringクラス。言語仕様上は様々な
特殊な挙動がある。 ダブルクォーテーションで括られた文字列リ テラルはStringオブジェクトとして扱われる が、同じ内容の文字列リテラルは同じ参照と なる。これはintern化と呼ばれるものでJava 言語仕様に定められている §3.10.5. String Literals -
15 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL String と
Unicode Stringの内部表現はUTF-16相当のchar配列だった Javaの発表された1995年当時はまだUnicodeが16bitだった Javaはタイムリーにchar型、文字列型にUnicodeを採用 しかし、1996年にUnicodeのコードポイントは21bitに拡張 この21bitのUnicodeへの対応は 2004年のJava5を待つことになる JSR 204: Unicode Supplementary Character Support またUTF-16ではASCII範囲の文字など2byteを要し無駄が多い Java9 でリリースされたJEP 254: Compact StringsではASCII範囲だけの 文字列への最適化がされた JEP 254: Compact Strings -
16 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL 文字列結合演算子 +
文字列の結合演算子 + に際しては対象オブジェクトが Java言語仕様 §5.1.11. String Conversion による変換をした上で結合される。 プリミティブ型についてはラッパー型のvalueOf() で変換されると思って良い 参照型オブジェクトの場合はtoString()メソッドで変換される 文字列同士の結合はStringBuilderで結合するバイトコードになるが、文字 列リテラル同士の結合はコンパイル時に結合済みの文字列リテラルにされ る §5.1.11. String Conversion -
17 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL Text Blocks
JEP 378: Text Blocks で定められて Java 15 でリリース """ で囲うことで複数行にわたる文字列リ テラルを定義できる 先頭の空白はトリムされる §3.10.6. Text Blocks JEP 378: Text Blocks -
18 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL java.lang.Object 参照、配列型は全て
Object のサブクラス class宣言で extends を記述 しなくともextends Object 扱 い java.lang.Objectに定義され ているメソッドは全ての参照 型が持つメソッド §4.3.2. The Class Object -
19 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL Object #
equals() , hachCode() 参照型は equals() で同値比較をする Javaの場合、==は同一参照である場合 true 実装に際してはルールがあり、これを破るとコレクションフレームワークでの動作 がおかしくなったりする • 反射的 : x.equals(x) は true • 対称的 : x.equals(y) == true ならば y.equals(x) == true • 推移的 : x.equals(y) == true, y.equals(z) == true ならば x.equals(z) • 整合的 : 複数回の呼び出しで一貫した結果を返す • hashCodeの契約 : 同値なら同一のハッシュコードを返す Java API 仕様 Object#equals() に記載があるがEffective Java により詳しく説明がある Effective Java 3版 項目10 : equals をオーバーライドするときは一般契約に従う 同 項目11 : equals をオーバーライドする時は、常に hashCodeをオーバーライドする -
20 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL Object #
finalize() ※非推奨 オブジェクトがガベージ・コレクションに回収される直前に呼び出されるメソッ ド Javaのマーク&スイープ方式のGCでは参照がゼロになってGC回収可能 になるタイミングをリアルタイムに決定できない finalize()の呼び出し保証されない → ファイナライズが無効または削除されているJava仮想マシンもある finalize()の呼び出しは無期限に遅延する可能性がある Java9 から非推奨となった §12.6. Finalization of Class Instances -
21 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL java.lang.@Deprecated @Deprecated
アノテーションをつけた要素は使用してはならない。 コンパイル時に警告される。 対象はモジュール、クラス、インターフェース、フィールド、メソッド、コンストラク タ forRemoval=true のものは将来削除が予定されている §9.6.4.6. @Deprecated -
22 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL java.lang.Class クラスを表すクラス。Javaのリフレクション機能の中核となる
Javaのリフレクション機能は主にjava.lang.refrect.*パッケージにまとめられ ており、詳細はそちらのクラス群を用いる クラス名.class で該当のClassオブジェクトを参照することができる。これは フィールドというわけではなく、クラスリテラルという機能による §15.8.2. Class Literals -
23 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL リフレクションのサンプル public
class HelloWorld { public static void main(String[] args) throws Exception { Class<?> clazz = Class.forName("example.HelloWorld"); Method method = clazz.getMethod("hello", String.class); method.invoke(null, "Hello, World!"); } static void hello(String message) { System.out.println(message); } } リフレクションの簡単なサンプル クラス名、メソッド名から間接的にメソッド呼び出しをする -
24 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL Javaのリフレクション機能 例えばO/R
マッパーのようなライブラリで任意のオブジェクトにデータを詰め るような場合に、ライブラリにとって未知のオブジェクトをリフレクションで扱う ようなケース 設定ファイルなどでクラス名を記述すると動くプラグイン機能など ジェネリックなクラス・メソッドはどのような型変数が定義されているかといっ た情報もリフレクションで取得できる。classファイルにはコンパイルに必要 な情報は格納されており、Javaのジェネリクスは何でもかんでも消えるわけ ではない(イレイジャの誤解) -
25 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL java.lang.ClassLoader クラスを読み込むための機能。詳細はJavaVM仕様に詳しく記載されている
ローカル起動の場合、通常のJavaVM実行時のclasspathからクラスを読み 込んでくれる機能だと思って良い かつて存在した Java Applet といった機能ではインターネットごしにclass ファイルを読み込んで起動するような動きをしていた ※現代でも java.net.URLClassLoader クラスは存在している うまく実装するとホットリロード機能を作るなどできる JVMS §5.3. Creation and Loading -
26 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL java.lang.ClassLoader 同名のclassでも、ClassLoaderが異
なると別class扱いとなる 複数ClassLoader環境ではHoge型 とHoge型でClassCastExceptionが 発生したりすることがある Tomcatではwarファイルごとに ClassLoaderが分かれており、ある アプリでstaticフィールドを使っても他 のアプリに波及しない ClassLoader A ClassLoader B Hoge.class ver 1 Hoge.class ver 2 同名別クラス -
27 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL java.lang.ClassLoader ClassLoaderは親子関係を持つの
で、共通で用いたいclassは親 ClassLoaderに移譲して読み込む設 計にする必要がある ClassLoader A ClassLoader B ClassLoader Parent Hoge.class loadClass() loadClass() -
28 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL java.lang.ClassLoader 通常起動した際の
ClassLoader は classpath からclassやリソースを読み 込むので、この範囲にリソースが用意できるのであれば、ClassLoaderを用 いてgetResourceAsStream()で読み込むと比較的安定 ファイルを直接読み込もうとするとOSが異なる環境で動かなかったり、起動 したファイルパスによって動かなかったりということが起きやすい -
29 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL java.lang.System System.out.println()でお馴染み
この out はSystemクラスのPrintStream型のstaticフィールド 実は setOut(PrintStream) で出力先を変更することもできる Javaのシステムそのものに関わる機能が用意されている • getenv() - 環境変数の取得 • getProperties() - システムプロパティの取得 • load() - ネイティブライブラリのロード セキュリティマネージャを取得する getSecurityManager() はJava24以降 は常にnullが返されるようになりました JEP 486: Permanently Disable the Security Manager -
30 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL java.lang.Runtime, java.lang.Process
Runtime は現在実行中のJavaVMのランタイムをあらわす Systemクラスと同様のメソッドも多数。簡易に扱えるようにSystemにも冗長 に用意されているという感じ freeMemory() でVMの空きメモリを取得したり exec() で外部プロセスを立ち上げることができる この場合のプロセスをあらわすクラスが Process -
31 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL java.lang.Iterable Iterable
インターフェースを実装したクラスは for-each 構文でループさせる ことができるようになる MyCollection myCollection = new MyCollection(data); // for-each構文を使用してコレクションの要素を反復処理 for (String item : myCollection) { System.out.println(item); } §14.14.2. The enhanced for statement -
32 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL java.lang.Iterable Iterable
と Iterator が別である点に注意 古い時代に両方implementsして iterator() で this を返す実装をみたことが あるが、そのような実装は複数回 for-each させると破綻する 内部クラスをnewして返す実装方式が無難 public class MyCollection implements Iterable<String> { @Override public Iterator<String> iterator() { return new MyIterator(); } // 内部クラスでIteratorを実装 class MyIterator implements Iterator<String> { -
33 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL java.lang.AutoCloseable AutoCloseable
インターフェースを実装したクラスは try-with-resources 構 文で扱うことができる try ( ZipFile zf = new ZipFile(zipFileName); BufferedWriter writer = Files.newBufferedWriter(outputFilePath, charset) ) { // ZipFileを読み込んでWriterに書き込む処理 } §14.20.3. try-with-resources -
34 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL java.lang.Cloneable Cloneable
を implements したクラスは clone() メソッドでオブジェクトを複 製することができる。が、Java 1.0 の頃からある機能であるためか作りが気 持ち悪い。スペルミスしていることでも有名 Cloneable はメソッドを持たないマーカーインターフェース clone() メソッドは java.lang.Object に protected で宣言されている これをオーバーライドしてpublicとし、return super.clone(); とする Cloneable を implements してないクラスのclone()を呼ぶと CloneNotSupportedException がthrowされる -
35 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL java.lang.Enum Enum
は Java の列挙型 enum のスーパークラス 型変数をもち Enum<E extends Enum<E>> でEは具象型自信の型 列挙型のクラスは暗黙に以下のstaticメソッドが定義される public static E[] values() public static E valueOf(String name) §8.9. Enum Classes §8.9.3. Enum Members ジェネリクスについては Java ジェネリクス入門 2024 参照 -
36 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL java.lang.Thread Thread
は Java のスレッドを表現したクラス 古典的にはThreadクラスをnewしてstart()していた 現代的には生のThreadを扱わずにjava.util.concurrentパッケージの Executorsを用いる方が無難 Webシステムなどではフレームワークがうまくやってくれているので、マルチ スレッドを意識することが少なくなっている デスクトップJava分野も最近は少なめで、GUI制御やネットワーク制御のた めのスレッド制御を手書きする機会も少なくなった Chapter 17. Threads and Locks -
37 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL java.lang.Thread JavaVM
は全ての非デーモンスレッドが終了すると終了する Thread #setDaemon(boolean) でThreadをデーモンスレッドにできる §12.8. Program Exit Java21以降は JEP 444: Virtual Threads がリリースされ、OSのスレッド機 能に縛られず実行効率が向上 ただしsynchronizedがあるとうまく機能しないため、ReentrantLockなどで 置き換えることが推奨 -
38 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL synchronized 必要がなければ使わない
もし使うなら synchronized句でロックオブジェクトを意識したい synchronized(lockObject) { … } §14.19. The synchronized Statement ロックオブジェクトが同一参照の場合、ブロック { … } の中に入れるのはひ とつのThreadだけ。別のロックオブジェクトは関与しない synchronized キーワードはメソッドに指定できるが、インスタンスメソッドの 場合は暗黙に this がロックオブジェクトとなる。 staticメソッドの場合は暗黙にそのクラスのclassオブジェクトがロックオブ ジェクトとなる Chapter 17. Threads and Locks -
39 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL volatile Javaではマルチスレッドに際して、共有メモリのコピーと書き出しを行う
synchronized, volatile はメモリの同期を行うが、そうではない場合、他のス レッドによって書き換えられた値がまだ同期されておらず反映が見えないよ うなことが起こる フィールド変数にメモリの同期をさせたいだけなら volatile キーワードが使 える でも、それよりjava.util.concurrent.atomicパッケージのAtmicXXXを使う方 が良い Chapter 17. Threads and Locks -
40 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL InterruptedException Thread.sleep()とかでthrowされるので認知度は高いが、どう処理して良い
のかわからないという声も多い Threadは待機状態を終わらせたい場合、外から割り込みをかける Thread.interrupt() このとき、Thread側が待機状態だとInterruptedExceptionが発生 そうではない場合、割り込みフラグが立つだけ Thread内のループ処理などで isInterrupted() でフラグをみて、割り込まれ ていたら自発的に終了処理をさせる §17.2.1. Wait プログラマーの脳みそ Threadの割り込みを活用する -
41 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL ThreadLocal Thread内で使えるグローバル変数のような機能
フレームワークの関係とかで呼び出し階層的にはどこだか分からないが同 じThreadでの出来事なんだよなーというときに邪悪な共有メモリとして使わ れがち Java25 以降であれば ScopedValue を使う JEP 506: Scoped Values -
42 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL java.lang.Exception Javaの例外処理の中心
Exception : 対処すべき例外。検査例外 RuntimeException : 同。非検査例外 Error : 回復不能な非検査例外 NoClassDefFoundErrorとか NoSuchMethodErrorとか OutOfMemoryErrorとか UnsupportedClassVersionErrorとか Chapter 11. Exceptions Throwable Exception Error Runtime Exception -
43 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL 検査例外と非検査例外 Javaの検査例外は比較的珍しい機能性
catch を強制させる例外機構は他の例だと Swift ぐらい? 検査例外は漏れなくthrows で投げ上げるかcatchして処理する必要がある 例外の種類を型システムの継承階層で表現した言語仕様が使いにくいとい う批判も 近年は非検査例外派も力を増している気がする §11.2. Compile-Time Checking of Exceptions -
44 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL サブパッケージ java.langのサブパッケージを
扱う際はimportが必要 APIリファレンスを眺めてみて ください -
45 © 2024 CREDIT SAISON CO., LTD. CONFIDENTIAL java.lang.ref 到達可能性
• 強到達可能 : 強い参照のあるオブジェクト • ソフト到達可能 : 強い参照がなく、ソフトな参照がある • 弱到達可能 : 強い参照もソフトな参照もなく、弱い参照がある • ファントム到達可能 : 強到達可能でも、ソフト到達可能でも、弱到達可能でも なく、ファイナライズされており、ファントム参照がそれを指しているオブジェク ト §12.6. Finalization of Class Instances 言語仕様の範囲ではないので APIドキュメントを見ろ、と言語仕様に書いてある This specification does not discuss weak references in any way. Readers are referred to the API documentation for details. 凪瀬 Blog Javaのメモリ管理