java.utilパッケージ徹底解説:Java開発の頼れる味方!

docs

前回はJavaの基本的な型や制御フローについて学んだよね。今回は、Java開発においてとっても便利で、ほとんどのプロジェクトでお世話になる「java.utilパッケージ」について深掘りしていくよ。このパッケージ、まさにJava開発者の強い味方なんだ!

java.utilパッケージって何?

「java.util」は、その名の通り「ユーティリティ(便利機能)」を提供するJavaの標準パッケージなんだ。プログラミングをしてると、よく使うけど自分でイチから実装するのは面倒くさい、そんな機能がたくさんあるよね? 例えば、リストの管理、日付や時刻の操作、ランダムな数値の生成なんかがそうだ。

そんな「かゆいところに手が届く」機能が、このjava.utilパッケージにぎっしり詰まっているんだ。これらを使いこなせると、コードがもっと短く、もっと分かりやすくなるし、何より開発効率がグンと上がるんだよ。

コレクションフレームワークの心臓部!

java.utilパッケージの目玉と言えば、やっぱり「コレクションフレームワーク」だね! これを使えば、データの集まり(コレクション)を効率的に扱えるようになるんだ。代表的なものを見ていこう!

List:順番が大事なデータの並び

Listは、データの順番が重要なときに使うんだ。例えば、スーパーの買い物リストみたいに、追加した順番に並んでてほしいときに便利だよ。同じ値が複数あっても大丈夫。

よく使うクラス

  • ArrayList: 最もよく使うListの実装だよ。配列をベースにしてるから、データの追加や取得が速いのが特徴だ。

import java.util.ArrayList; import java.util.List;

public class ArrayListExample {
    public static void main(String[] args) {
        // 文字列のリストを作成
        List<String> fruits = new ArrayList<>();

        // データを追加
        fruits.add("りんご"); // 0番目
        fruits.add("バナナ"); // 1番目
        fruits.add("みかん"); // 2番目
        fruits.add("りんご"); // 同じデータもOK

        System.out.println("フルーツリスト: " + fruits); // [りんご, バナナ, みかん, りんご]

        // 特定の要素を取得
        String firstFruit = fruits.get(0);
        System.out.println("最初のフルーツ: " + firstFruit); // りんご

        // リストのサイズを取得
        System.out.println("リストのサイズ: " + fruits.size()); // 4

        // 要素を削除
        fruits.remove("バナナ"); // "バナナ" を削除
        System.out.println("バナナ削除後のリスト: " + fruits); // [りんご, みかん, りんご]

        // 特定のインデックスの要素を削除
        fruits.remove(0); // 0番目の要素(りんご)を削除
        System.out.println("0番目削除後のリスト: " + fruits); // [みかん, りんご]

        // リストが空かどうか確認
        System.out.println("リストは空?: " + fruits.isEmpty()); // false

        // 全ての要素をクリア
        fruits.clear();
        System.out.println("全クリア後のリスト: " + fruits); // []
        System.out.println("リストは空?: " + fruits.isEmpty()); // true
    }
}
```
  • LinkedList: データの追加や削除が頻繁に行われる場合に強いんだ。データの参照はArrayListより遅くなる傾向があるよ。

vscodeで実行した結果

Java

import java.util.LinkedList; 
import java.util.List; 

public class LinkedListExample { 
    public static void main(String[] args) { 
        List<String> tasks = new LinkedList<>();
        tasks.add("報告書作成"); 
        tasks.add("会議準備"); 
        tasks.add("メール返信"); 
        System.out.println("今日のタスク: " + tasks); // [報告書作成, 会議準備, メール返信]

        tasks.add(1, "資料修正"); // 1番目の位置に挿入 
        System.out.println("タスク追加後: " + tasks); // [報告書作成, 資料修正, 会議準備, メール返信] 

        tasks.removeLast(); // 最後の要素を削除 
        System.out.println("最後のタスク削除後: " + tasks); // [報告書作成, 資料修正, 会議準備]
    }
}

vscodeで実行した結果

Set:重複を許さない集合体

Setは、数学の「集合」と同じように、重複するデータを持たないのが特徴だよ。順序は保証されないことが多いから、重複させたくないデータを管理するのにピッタリ!

よく使うクラス

HashSet: 最もよく使うSetの実装。データの追加や検索がとても速いんだ。

Java

import java.util.HashSet; 
import java.util.Set; 

public class HashSetExample { 
    public static void main(String[] args) { // 整数のセットを作成 
        Set<Integer> uniqueNumbers = new HashSet<>(); // データを追加 
        uniqueNumbers.add(10); 
        uniqueNumbers.add(20); 
        uniqueNumbers.add(30); 
        uniqueNumbers.add(20); // 重複するデータは追加されない 
        System.out.println("ユニークな数字: " + uniqueNumbers); // [20, 10, 30] (順序は保証されない)

        // 要素が含まれているか確認 
        System.out.println("10は含まれる?: " + uniqueNumbers.contains(10)); // true 
        System.out.println("50は含まれる?: " + uniqueNumbers.contains(50)); // false 

        // 要素を削除 
        uniqueNumbers.remove(20); 
        System.out.println("20削除後: " + uniqueNumbers); // [10, 30]
  }
}

vscodeで実行した結果

TreeSet: データを自動的にソートしてくれるSet。要素が常に昇順に保たれるよ。

Java

import java.util.Set; 
import java.util.TreeSet; 

public class TreeSetExample { 
    public static void main(String[] args) { 
        Set<String> sortedNames = new TreeSet<>(); 
        sortedNames.add("田中"); 
        sortedNames.add("佐藤"); 
        sortedNames.add("鈴木"); 
        sortedNames.add("佐藤"); // 重複は無視される 
        System.out.println("ソートされた名前: " + sortedNames); // [佐藤, 鈴木, 田中]
    }
}

vscodeで実行した結果

Map:キーと値のペアで管理

Mapは、キーと値のペアでデータを管理するんだ。まるで辞書みたいに、キーワード(キー)から意味(値)を引くイメージだね。キーは重複できないけど、値は重複してもOKだよ。

よく使うクラス

HashMap: 最もよく使うMapの実装。データの追加、取得、削除が速いのが特徴だよ。

Java

import java.util.HashMap; 
import java.util.Map; 

public class HashMapExample { 
    public static void main(String[] args) { 
        // ユーザーIDとユーザー名のマップを作成 
        Map<Integer, String> users = new HashMap<>(); // データを追加 
        users.put(101, "Alice"); 
        users.put(102, "Bob"); 
        users.put(103, "Charlie"); 
        users.put(102, "Bobby"); // キーが同じ場合は値が上書きされる 
        System.out.println("ユーザーマップ: " + users); // {101=Alice, 102=Bobby, 103=Charlie} 

        // キーを使って値を取得 
        String userName = users.get(101); 
        System.out.println("ID 101のユーザー名: " + userName); // Alice 

        // 存在しないキーを検索 
        String unknownUser = users.get(999); 
        System.out.println("ID 999のユーザー名: " + unknownUser); // null 

        // キーが存在するか確認 System.out.println("ID 103は存在するか?: " + users.containsKey(103)); // true 
        // 値が存在するか確認 
        System.out.println("Charlieは存在するか?: " + users.containsValue("Charlie")); // true 

        // キーと値のペアを削除 
        users.remove(103); 
        System.out.println("ID 103削除後: " + users); // {101=Alice, 102=Bobby} 

        // 全てのキーをループ処理 
        System.out.println("全てのキー:"); 
        for (Integer id : users.keySet()) { 
            System.out.println(id); 
        } 
        // 全ての値をループ処理 
        System.out.println("全ての値:"); 
        for (String name : users.values()) { 
            System.out.println(name); 
        }
        // 全てのキーと値のペアをループ処理 
        System.out.println("全てのキーと値:"); 
        for (Map.Entry<Integer, String> entry : users.entrySet()) { 
            System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue()); 
        }
    }
}

vscodeで実行した結果

TreeMap: キーを自動的にソートしてくれるMap。キーの順序が重要な場合に便利だね。

Java

import java.util.Map; 
import java.util.TreeMap; 

public class TreeMapExample { 
    public static void main(String[] args) { 
        Map<String, String> glossary = new TreeMap<>(); 
        glossary.put("Java", "オブジェクト指向プログラミング言語"); 
        glossary.put("JVM", "Java仮想マシン"); 
        glossary.put("JDK", "Java開発キット"); 
        System.out.println("用語集 (ソート済み): " + glossary); // {JDK=Java開発キット, JVM=Java仮想マシン, Java=オブジェクト指向プログラミング言語}
    }
}

その他の便利なクラスたち

java.utilパッケージには、コレクションフレームワーク以外にも便利なクラスがたくさんあるんだ!いくつかピックアップして紹介するね。

DateとCalendar:日付と時刻の操作

日付や時刻を扱うためのクラスだよ。Dateは特定の瞬間を表し、Calendarは日付の計算や操作に便利なんだ。ただし、Java 8以降はjava.timeパッケージ(新しい日付と時刻API)の利用が推奨されているから、そちらもチェックしてみてね!

Java

import java.util.Calendar;
import java.util.Date;

public class DateTimeExample {
    public static void main(String[] args) {
        // 現在の日付と時刻を取得
        Date now = new Date();
        System.out.println("現在の日時 (Date): " + now);

        // Calendarクラスを使って日付を操作
        Calendar cal = Calendar.getInstance();
        System.out.println("現在の日時 (Calendar): " + cal.getTime()); // Dateオブジェクトに変換

        // 特定の日付を設定
        cal.set(2025, Calendar.DECEMBER, 25); // 2025年12月25日
        System.out.println("設定した日時: " + cal.getTime());

        // 日付の加算・減算
        cal.add(Calendar.DAY_OF_MONTH, 7); // 7日後
        System.out.println("7日後: " + cal.getTime());

        cal.add(Calendar.MONTH, -1); // 1ヶ月前
        System.out.println("1ヶ月前: " + cal.getTime());
    }
}

Random:ランダムな数値を生成

ゲームやシミュレーションなんかで、ランダムな数値が必要になることってあるよね? そんなときにRandomクラスが活躍するんだ。

Java

import java.util.Random;

public class RandomExample {
    public static void main(String[] args) {
        Random random = new Random();

        // 0から9までのランダムな整数を生成
        int randomNumber = random.nextInt(10);
        System.out.println("0から9のランダムな数字: " + randomNumber);

        // 1から100までのランダムな整数を生成 (100を含まない場合)
        int randomNumber1to99 = random.nextInt(99) + 1; // nextInt(上限) で 0 から 上限-1 までが生成される
        System.out.println("1から99のランダムな数字: " + randomNumber1to99);

        // 1から100までのランダムな整数を生成 (100を含む場合)
        int randomNumber1to100 = random.nextInt(100) + 1;
        System.out.println("1から100のランダムな数字: " + randomNumber1to100);

        // ランダムな真偽値 (true/false) を生成
        boolean randomBoolean = random.nextBoolean();
        System.out.println("ランダムな真偽値: " + randomBoolean);

        // ランダムな浮動小数点数 (0.0以上1.0未満) を生成
        double randomDouble = random.nextDouble();
        System.out.println("0.0以上1.0未満のランダムな小数: " + randomDouble);
    }
}

Scanner:標準入力からのデータ読み込み

コンソールからユーザーが入力したデータを読み込むときに使うのがScannerクラスだ。簡単な入力を受け取るのに便利だよ。

Java

import java.util.Scanner;

public class ScannerExample {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in); // 標準入力から読み込むScannerを作成

        System.out.print("あなたの名前を入力してください: ");
        String name = scanner.nextLine(); // 一行読み込み

        System.out.print("あなたの年齢を入力してください: ");
        int age = scanner.nextInt(); // 整数を読み込み

        System.out.println("こんにちは、" + name + "さん! あなたは" + age + "歳ですね。");

        scanner.close(); // Scannerを閉じないとリソースリークの原因になる
    }
}

まとめ

java.utilパッケージは、Javaプログラミングの効率を劇的に向上させてくれる、まさに「道具箱」のような存在なんだ。特にコレクションフレームワークは、Java開発では避けて通れないほど重要だよ。

  • List: データの順序が大事で、重複もOKな場合。ArrayListが基本。
  • Set: 重複しないデータが必要な場合。HashSetが基本。
  • Map: キーと値のペアでデータを管理したい場合。HashMapが基本。

最初は覚えることがたくさんあるように感じるかもしれないけど、実際にコードを書いて使ってみることで、その便利さが実感できるはずだ。それぞれのクラスがどんなときに役立つのか、例を参考にしながら色々なパターンで試してみてね!

次回は、Javaでファイルやネットワークを扱うときに使う「java.ioパッケージ」について解説していくよ!

前回の記事:java.langパッケージ:Javaの超基本をおさえよう! | ToolDocs

コメント

タイトルとURLをコピーしました