Java API の基本概念
Java API は、開発者が標準で利用可能なクラスライブラリの仕様書です。これにより、文字列操作や配列処理、日付管理などの共通機能を実装せずに利用できます。例えば、文字列の長さ取得や特定インデックスの字符抽出などは、標準クラスを通じて行われます。
Object クラスの役割
java.lang.Object クラスは、Java におけるすべてのクラスの基底クラスです。配列を含む全てのオブジェクトは、このクラスを継承しており、ここで定義されたメソッドを利用可能です。Object 型の変数には任意のクラスのインスタンスを代入できるため、多態性の実現に不可欠です。
オブジェクトを出力する際、システムは暗黙的に toString() メソッドを呼び出します。オーバーライドされていない場合、Object クラスの実装が実行され、ハッシュコードを含む十六進数の文字列が返されます。オブジェクトの状態を分かりやすく表示するには、toString() をオーバーライドする必要があります。
equals メソッドによる比較
equals(Object obj) メソッドは、オブジェクトの論理的な同等性を判定します。デフォルト実装では参照アドレス(==)を比較しますが、多くのクラスでは内容の比較を行うように書き換えられます。
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (!(obj instanceof User)) return false;
User other = (User) obj;
return this.age == other.age && this.name.equals(other.name);
}
このように実装することで、異なるインスタンスでも内部データが一致すれば true を返すようになります。
Arrays ユーティリティクラス
java.util.Arrays クラスは、配列操作に関する静的メソッドを提供します。
- equals: 二つの配列の内容が完全に一致するか比較します。
- copyOf: 既存の配列を指定した長さでコピーし、新しい配列を生成します。
- fill: 配列の全要素に指定した値を代入します。
- toString: 配列の内容を文字列形式で出力します。
- binarySearch: 二分探索アルゴリズムを用いて値を検索します。
- sort: 配列要素を昇順に並べ替えます。
カスタムオブジェクトの配列を排序するには、そのクラスが Comparable インターフェースを実装し、compareTo メソッドを定義する必要があります。
package com.example.core;
import java.util.Arrays;
public class ApiOverview {
public static void main(String[] args) {
User[] users = new User[3];
users[0] = new User(20, "Tanaka");
users[1] = new User(25, "Suzuki");
users[2] = new User(18, "Sato");
int[] nums1 = {1, 2, 3};
int[] nums2 = {1, 2, 3};
System.out.println(Arrays.equals(nums1, nums2)); // true
int[] extended = Arrays.copyOf(nums1, 5);
System.out.println(Arrays.toString(extended));
Arrays.fill(nums2, 5);
Arrays.sort(users); // User クラスが Comparable を実装している前提
System.out.println(Arrays.toString(users));
}
}
基本データ型のラッパークラス
Java の基本型(int, char など)はオブジェクトではありませんが、対応するラッパークラス(Integer, Character など)を用いることでオブジェクトとして扱えます。これにより、変換メソッドや定数を利用可能になります。
Integer クラスの活用
数値の進数変換や比較を行う静的メソッドが用意されています。
System.out.println(Integer.toBinaryString(10)); // 2 進数
System.out.println(Integer.toHexString(255)); // 16 進数
System.out.println(Integer.compare(5, 10)); // 比較結果
基本型とラッパークラスの間では、自動_boxing_と_unboxing_が発生します。Integer.valueOf() による自動ボックス化では、-128 から 127 の範囲にある値はキャッシュされたインスタンスが返されるため、同一性の比較には equals メソッドを使用することが推奨されます。
String クラスの特性
java.lang.String は不変(immutable)なクラスです。一度生成されたインスタンスの内容を変更することはできません。連結操作などを行うと、内部で新しいオブジェクトが生成されます。
- リテラル生成: 文字列プールを参照し、同一値があれば既存オブジェクトを返します。
- new 演算子: ヒープ領域に常に新しいオブジェクトを生成します。
主要なメソッドには、getBytes() によるバイト配列変換、toCharArray() による字符配列変換、equalsIgnoreCase() による大文字小文字を無視した比較、contains() による部分文字列検索などがあります。
部分文字列の取得には substring(start, end) を使用し、置換には replace() や replaceAll()(正規表現対応)を利用します。trim() メソッドは前後の空白を削除します。
Character クラスの補助機能
字符型の判定や変換に利用します。
char c = 'a';
System.out.println(Character.isLowerCase(c)); // true
System.out.println(Character.toUpperCase(c)); // 'A'
可変文字列クラス
頻繁な文字列操作を行う場合、StringBuffer または StringBuilder を使用します。
- StringBuffer: メソッドが同期されており、マルチスレッド環境で安全です。
- StringBuilder: 同期処理がないため単一スレッド环境下で高速に動作します。
どちらも append(), insert(), delete(), reverse() などのメソッドを持ち、内部配列を変更することでオブジェクトの再生成を防ぎます。
正規表現によるパターンマッチ
文字列が特定の規則に合致するかを判定するには、matches メソッドと正規表現を使用します。
- [0-9]*: 数字が 0 回以上
- [0-9]+: 数字が 1 回以上
- \d: 数字 1 文字
- {3,6}: 直前の要素が 3 回以上 6 回以下
String input = "12345";
System.out.println(input.matches("\\d{3,6}")); // true
数学・乱数生成ユーティリティ
Math クラスは、絶対値(abs)、平方根(sqrt)、べき乗(pow)、最大値(max)などの計算機能を提供します。random() メソッドは 0.0 以上 1.0 未満の double 値を返します。
より複雑な乱数生成には java.util.Random クラスを使用します。nextInt(), nextBoolean() などのメソッドで様々な型の乱数を取得できます。
日付と時刻の処理
java.util.Date クラスは、特定の時刻をミリ秒単位で表します。getTime() メソッドでエポック時間からの経過毫秒を取得可能です。
java.util.Calendar クラスは、抽象クラスであり getInstance() メソッドを通じてインスタンスを取得します。年、月、日、曜日などのフィールドを操作できます。月は 0 から始まる点に注意が必要です。
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH); // 0-11
SimpleDateFormat クラスを用いることで、日付オブジェクトと文字列の相互変換が行えます。パターン文字列(yyyy-MM-dd など)を指定してフォーマットを定義します。
SimpleDateFormat fmt = new SimpleDateFormat("yyyy/MM/dd");
String dateStr = fmt.format(new Date());
Date parsedDate = fmt.parse("2023/01/01");