プリミティブ型とラッパークラス
Javaでは、基本データ型(プリミティブ型)をオブジェクトとして扱う必要がある場合、対応するラッパークラスを利用します。これにより、コレクションフレームワークでの格納や、型変換ユーティリティの活用が可能になります。
- オートボクシング: プリミティブ型からラッパークラスへの自動変換。
- オートアンボクシング: ラッパークラスからプリミティブ型への自動変換。
Double basePrice = 1500.75; // オートボクシング
double discountedPrice = basePrice * 0.8; // オートアンボクシングと演算
System.out.println("割引後価格: " + discountedPrice);
Stringクラスのイミュータブル特性
Stringオブジェクトはイミュータブル(不変)であり、インスタンス生成後にその内部状態を変更することはできません。文字列に対する変更操作は、常に新しいStringオブジェクトをメモリ上に生成します。単純な結合には+演算子を使用しますが、コンパイラが裏側で最適化を行うものの、ループ内などでの多用はメモリ効率を悪化させるため注意が必要です。
String scheme = "https";
String host = "api.example.com";
String endpoint = "/v2/data";
// +演算子による文字列結合
String fullUrl = scheme + "://" + host + endpoint;
ミュータブルな文字列操作:StringBuilderとStringBuffer
文字列の頻繁な変更が必要な場合は、ミュータブルなクラスであるStringBuilderまたはStringBufferを使用します。
- StringBuilder: スレッドセーフではありませんが、オーバーヘッドがないため高速に動作します。単一スレッド環境での標準的な選択肢です。
- StringBuffer: メソッドが同期化されておりスレッドセーフですが、パフォーマンスは劣ります。マルチスレッド環境で共有される場合にのみ使用します。
StringBuilder queryBuilder = new StringBuilder("SELECT * FROM users");
queryBuilder.append(" WHERE status = 'ACTIVE'")
.insert(0, "/* cached */ ")
.append(" ORDER BY created_at DESC");
System.out.println(queryBuilder.toString());
java.timeパッケージによるモダンな日時処理
Java 8以降、従来のjava.util.DateやCalendarの設計上の欠陥を解消するため、java.timeパッケージが導入されました。このAPIはイミュータブルかつスレッドセーフに設計されています。
LocalDate: 時区を持たない日付(年、月、日)。LocalTime: 時区を持たない時間(時、分、秒、ナノ秒)。LocalDateTime: 時区を持たない日付と時間の組み合わせ。ZonedDateTime: 時区情報を含む完全な日時表現。Period: 日付ベースの期間(年、月、日)。Duration: 時間ベースの期間(秒、ナノ秒)。DateTimeFormatter: スレッドセーフな日時のフォーマットおよびパース処理。
LocalDate projectStart = LocalDate.of(2023, 4, 1);
LocalTime dailyStandup = LocalTime.of(10, 0);
LocalDateTime meetingStart = LocalDateTime.of(projectStart, dailyStandup);
// 特定のタイムゾーンを適用
ZonedDateTime tokyoMeeting = meetingStart.atZone(ZoneId.of("Asia/Tokyo"));
// 期間の計算
LocalDate projectEnd = LocalDate.of(2024, 3, 31);
Period projectDuration = Period.between(projectStart, projectEnd);
System.out.println("プロジェクト期間: " + projectDuration.getYears() + "年 " + projectDuration.getMonths() + "ヶ月");
その他の主要な標準クラス
- Math: 絶対値、三角関数、対数、平方根などの基本的な数学演算を提供するユーティリティクラス。
- Random / ThreadLocalRandom: 疑似乱数を生成するためのクラス。並列処理では
ThreadLocalRandomが推奨されます。 - Scanner: 正規表現を用いてプリミティブ型や文字列を解析するテキストスキャナ。主にコンソール入力の取得に利用されます。
- ArrayList: 動的にサイズが変更可能な配列ベースのリスト実装。ランダムアクセスが高速です。
- HashMap: ハッシュテーブルに基づく
Mapインターフェースの実装。キーと値のペアを効率的に管理します。 - Files / Path (NIO.2): 従来の
Fileクラスに代わり、より強力で柔軟なファイルシステム操作を提供します。 - System: 標準入出力ストリーム、環境変数の取得、現在のミリ秒単位の時間取得など、システムレベルのリソースへのアクセスを提供します。
- Thread / Runnable: 並行処理を実現するための基本的なスレッド制御機構。近年は
java.util.concurrentパッケージのエグゼキュータフレームワークと組み合わせて使用されることが一般的です。