カテゴリ: Java 更新日: 2026/01/19

Javaの配列とListの違いとは?使い分けをわかりやすく解説

Javaの配列とListの違いとは?使い分けをわかりやすく解説
Javaの配列とListの違いとは?使い分けをわかりやすく解説

先生と生徒の会話形式で理解しよう

生徒

「Javaで複数のデータをまとめて管理したいんですけど、配列とListっていうのがあるって聞きました。どう違うんですか?」

先生

「配列とListは、どちらも複数のデータを扱うための仕組みですが、それぞれに特徴があります。配列は固定サイズで高速ですが、Listは柔軟にサイズを変更できるという違いがありますよ。」

生徒

「なるほど。具体的にはどんな場面でどちらを使えばいいんでしょうか?」

先生

「それでは、配列とListの基本から、それぞれの特徴、使い分けの方法まで詳しく見ていきましょう!」

1. Javaの配列とは?基本的な特徴を理解しよう

1. Javaの配列とは?基本的な特徴を理解しよう
1. Javaの配列とは?基本的な特徴を理解しよう

Javaの配列は、同じ型のデータを連続して格納するためのデータ構造です。配列を作成するときには、最初にサイズを決める必要があり、一度作成したらそのサイズを変更することはできません。

配列は、メモリ上に連続して配置されるため、インデックスを使った高速なアクセスが可能です。例えば、整数型の配列を作成して値を格納する場合、次のように記述します。


public class ArrayExample {
    public static void main(String[] args) {
        // 配列の宣言と初期化
        int[] numbers = new int[5];
        
        // 値の代入
        numbers[0] = 10;
        numbers[1] = 20;
        numbers[2] = 30;
        numbers[3] = 40;
        numbers[4] = 50;
        
        // 配列の要素を表示
        System.out.println("配列の最初の要素: " + numbers[0]);
        System.out.println("配列の長さ: " + numbers.length);
    }
}

このプログラムを実行すると、次のような結果が表示されます。


配列の最初の要素: 10
配列の長さ: 5

配列は、宣言時にサイズを指定する必要があり、後から要素を追加したり削除したりすることができません。この制限が配列の最大の特徴であり、同時に制約でもあります。

2. JavaのListとは?ArrayListの基本を学ぼう

2. JavaのListとは?ArrayListの基本を学ぼう
2. JavaのListとは?ArrayListの基本を学ぼう

Listは、Javaのコレクションフレームワークの一部であり、インターフェースとして定義されています。Listの代表的な実装クラスがArrayListです。ArrayListは、配列とは異なり、動的にサイズを変更できるという大きな特徴があります。

ArrayListを使うと、要素の追加や削除が自由に行えます。内部的には配列を使っていますが、容量が不足すると自動的にサイズを拡張してくれます。ArrayListを使う際は、java.util.ArrayListをインポートする必要があります。


import java.util.ArrayList;

public class ListExample {
    public static void main(String[] args) {
        // ArrayListの作成
        ArrayList<String> fruits = new ArrayList<>();
        
        // 要素の追加
        fruits.add("りんご");
        fruits.add("バナナ");
        fruits.add("オレンジ");
        
        // 要素の表示
        System.out.println("フルーツリスト: " + fruits);
        System.out.println("最初の要素: " + fruits.get(0));
        System.out.println("リストのサイズ: " + fruits.size());
        
        // 要素の追加(動的にサイズが変更される)
        fruits.add("ぶどう");
        System.out.println("追加後のリスト: " + fruits);
    }
}

このコードを実行すると、次のような結果が得られます。


フルーツリスト: [りんご, バナナ, オレンジ]
最初の要素: りんご
リストのサイズ: 3
追加後のリスト: [りんご, バナナ, オレンジ, ぶどう]

ArrayListでは、ジェネリクスという機能を使って、格納するデータの型を指定します。上記の例では、String型のデータを格納するArrayListを作成しています。

3. 配列とListの主な違いを比較してみよう

3. 配列とListの主な違いを比較してみよう
3. 配列とListの主な違いを比較してみよう

配列とListには、いくつかの重要な違いがあります。まず、サイズの固定性について、配列は作成時にサイズを決めなければならず、後から変更できません。一方、Listは動的にサイズが変更でき、要素の追加や削除が自由に行えます。

次に、プリミティブ型の扱いについてです。配列はプリミティブ型(int、double、booleanなど)を直接格納できますが、Listはオブジェクト型のみを扱います。そのため、Listでプリミティブ型を扱う場合は、ラッパークラス(Integer、Double、Booleanなど)を使用する必要があります。

また、パフォーマンスの面では、配列の方がメモリ効率が良く、アクセス速度も若干高速です。しかし、Listは便利なメソッドが豊富に用意されており、開発の効率性では優れています。

メソッドの豊富さについても違いがあります。配列には基本的な操作しかありませんが、Listにはadd、remove、contains、sortなど、便利なメソッドが多数用意されています。これにより、コードの可読性が向上し、開発時間も短縮できます。

4. 配列の初期化方法と多次元配列の使い方

4. 配列の初期化方法と多次元配列の使い方
4. 配列の初期化方法と多次元配列の使い方

配列には、いくつかの初期化方法があります。一つは、サイズだけを指定して後から値を代入する方法、もう一つは、宣言と同時に値を初期化する方法です。また、Javaでは多次元配列も扱うことができ、二次元配列や三次元配列を作成することが可能です。

多次元配列は、表やマトリックスのようなデータ構造を表現するのに適しています。例えば、二次元配列を使って学生の成績表を作成することができます。


public class MultiArrayExample {
    public static void main(String[] args) {
        // 配列の宣言と同時に初期化
        String[] colors = {"赤", "青", "黄色", "緑"};
        
        // 二次元配列の作成(3人の学生の3科目の成績)
        int[][] scores = {
            {85, 90, 78},  // 1人目の成績
            {92, 88, 95},  // 2人目の成績
            {76, 84, 89}   // 3人目の成績
        };
        
        // 二次元配列の要素にアクセス
        System.out.println("1人目の数学の成績: " + scores[0][0]);
        System.out.println("2人目の英語の成績: " + scores[1][1]);
        
        // 配列の全要素を表示
        System.out.println("色の配列:");
        for (int i = 0; i < colors.length; i++) {
            System.out.println(colors[i]);
        }
    }
}

実行結果は次のようになります。


1人目の数学の成績: 85
2人目の英語の成績: 88
色の配列:
赤
青
黄色
緑

多次元配列を使うことで、複雑なデータ構造を表現できますが、サイズが固定されているという配列の制約は変わりません。動的にサイズを変更したい場合は、ArrayListのリストを使う方法もあります。

5. Listの便利なメソッドを活用しよう

5. Listの便利なメソッドを活用しよう
5. Listの便利なメソッドを活用しよう

ArrayListには、データ操作を簡単にする多くのメソッドが用意されています。要素の追加にはaddメソッド、削除にはremoveメソッド、特定の要素が含まれているかを確認するにはcontainsメソッドを使います。

また、リストをソートしたり、すべての要素をクリアしたり、特定の位置に要素を挿入したりすることも簡単にできます。これらのメソッドを使いこなすことで、効率的なプログラミングが可能になります。

さらに、Java8以降では、ラムダ式やストリームAPIと組み合わせることで、より洗練されたコードを書くことができます。例えば、forEachメソッドを使えば、リストの全要素に対して処理を実行できます。

6. プリミティブ型とラッパークラスの違い

6. プリミティブ型とラッパークラスの違い
6. プリミティブ型とラッパークラスの違い

配列はプリミティブ型を直接扱えますが、ArrayListではラッパークラスを使用する必要があります。プリミティブ型には、int、double、boolean、charなどがあり、これらは基本的なデータ型です。

一方、ラッパークラスは、プリミティブ型をオブジェクトとして扱うためのクラスです。Integer、Double、Boolean、Characterなどがあります。Javaでは、オートボクシングという機能により、プリミティブ型とラッパークラス間の変換が自動的に行われます。

例えば、ArrayListにint型の値を追加しようとすると、自動的にIntegerオブジェクトに変換されます。この仕組みにより、プログラマは型変換を意識せずにコードを書くことができます。ただし、大量のデータを扱う場合は、オートボクシングによるオーバーヘッドに注意が必要です。

7. 配列とListの使い分けの基準

7. 配列とListの使い分けの基準
7. 配列とListの使い分けの基準

配列とListのどちらを使うべきかは、用途によって異なります。配列を使うべき場面は、データの個数が最初から決まっていて変更する必要がない場合、メモリ効率やパフォーマンスを最優先したい場合、プリミティブ型のデータを大量に扱う場合などです。

一方、Listを使うべき場面は、データの個数が変動する可能性がある場合、要素の追加や削除を頻繁に行う場合、便利なメソッドを活用してコードを簡潔にしたい場合などです。

実際の開発現場では、柔軟性を重視してArrayListを使うことが多いですが、パフォーマンスが重要な処理や、データサイズが固定されている場合は配列を選択することもあります。状況に応じて適切なデータ構造を選ぶことが、効率的なプログラミングにつながります。

8. 配列とListの相互変換方法

8. 配列とListの相互変換方法
8. 配列とListの相互変換方法

配列とListは、必要に応じて相互に変換することができます。配列からListへの変換には、Arrays.asListメソッドを使用します。逆に、Listから配列への変換には、toArrayメソッドを使います。

ただし、Arrays.asListで作成されたListは固定サイズであり、要素の追加や削除ができない点に注意が必要です。完全に可変なArrayListに変換したい場合は、新しいArrayListのコンストラクタに渡す必要があります。

また、toArrayメソッドを使う際は、引数に配列のサイズを指定することで、適切なサイズの配列を取得できます。これらの変換方法を理解しておくと、既存のコードとの連携がスムーズになります。

9. for文と拡張for文による配列とListの操作

9. for文と拡張for文による配列とListの操作
9. for文と拡張for文による配列とListの操作

配列やListの要素を処理する際には、for文や拡張for文(for-each文)を使用します。通常のfor文では、インデックスを使って各要素にアクセスしますが、拡張for文では、より簡潔に記述できます。

拡張for文は、配列やListの全要素を順番に処理したい場合に便利です。インデックスを管理する必要がないため、コードがシンプルになり、バグも減らせます。ただし、インデックスが必要な処理や、要素を変更したい場合は、通常のfor文を使う必要があります。


import java.util.ArrayList;

public class LoopExample {
    public static void main(String[] args) {
        // 配列の例
        int[] numbers = {10, 20, 30, 40, 50};
        
        // ArrayListの例
        ArrayList<String> cities = new ArrayList<>();
        cities.add("東京");
        cities.add("大阪");
        cities.add("名古屋");
        cities.add("福岡");
        
        // 配列を通常のfor文で処理
        System.out.println("配列の要素(通常のfor文):");
        for (int i = 0; i < numbers.length; i++) {
            System.out.println("インデックス " + i + ": " + numbers[i]);
        }
        
        // 配列を拡張for文で処理
        System.out.println("\n配列の要素(拡張for文):");
        for (int num : numbers) {
            System.out.println(num);
        }
        
        // ArrayListを拡張for文で処理
        System.out.println("\nArrayListの要素:");
        for (String city : cities) {
            System.out.println(city);
        }
    }
}

このプログラムの実行結果は次のようになります。


配列の要素(通常のfor文):
インデックス 0: 10
インデックス 1: 20
インデックス 2: 30
インデックス 3: 40
インデックス 4: 50

配列の要素(拡張for文):
10
20
30
40
50

ArrayListの要素:
東京
大阪
名古屋
福岡

拡張for文を使うことで、コードがより読みやすくなり、メンテナンスもしやすくなります。配列とArrayListのどちらでも同じように使えるため、覚えておくと便利です。

10. 実践的な使用例とパフォーマンスの考慮点

10. 実践的な使用例とパフォーマンスの考慮点
10. 実践的な使用例とパフォーマンスの考慮点

実際のアプリケーション開発では、配列とListを適切に使い分けることが重要です。例えば、ゲーム開発では、キャラクターの座標や画像データなど、固定サイズのデータには配列を使い、プレイヤーのインベントリやスコアランキングなど、動的に変化するデータにはArrayListを使うことが多いです。

Webアプリケーションでは、データベースから取得したレコードをArrayListに格納して処理することが一般的です。データの件数が不明な場合や、フィルタリングや並び替えを行う場合は、Listの方が扱いやすいためです。

パフォーマンスの観点では、配列は固定サイズであるため、メモリ使用量が予測しやすく、アクセス速度も高速です。一方、ArrayListは内部的に配列を使っていますが、容量が不足すると自動的にサイズを拡張するため、その際にコピー処理が発生します。

大量のデータを扱う場合や、リアルタイム処理が必要な場合は、配列の方がパフォーマンス面で有利です。しかし、開発効率やコードの保守性を考えると、多くの場合はArrayListを使う方が適切です。最終的には、アプリケーションの要件に応じて、最適なデータ構造を選択することが大切です。

また、Java8以降では、ストリームAPIを使うことで、ListやSetなどのコレクションを効率的に処理できます。filter、map、reduceなどのメソッドを使えば、関数型プログラミングのスタイルで、簡潔かつ読みやすいコードを書くことができます。

カテゴリの一覧へ
新着記事
New1
Quarkus
Quarkusのフォーム認証を基礎から解説!初心者向けセキュリティ入門ガイド
New2
Micronaut
MicronautプロジェクトをGradleで管理する基礎!build.gradleの役割を解説
New3
Micronaut
LinuxでMicronautをセットアップする方法!パッケージ管理とGradle連携
New4
Java
Javaのswitch文を徹底解説!case・defaultの書き方と実例まとめ
人気記事
No.1
Java&Spring記事人気No1
Quarkus
Quarkusプロジェクト構成の基本を完全解説!初心者でも迷わない「どこに何を書くか」ガイド
No.2
Java&Spring記事人気No2
Quarkus
QuarkusとMicronautとHelidonを徹底比較!軽量Javaフレームワークの違いを初心者向けに解説
No.3
Java&Spring記事人気No3
Quarkus
Quarkusのセキュリティ基礎を初心者でもわかるように解説!
No.4
Java&Spring記事人気No4
Micronaut
MicronautとSpring Bootの違いとは?アーキテクチャ比較で速さの秘密を理解する
No.5
Java&Spring記事人気No5
Quarkus
Quarkusでマイクロサービス開発が加速する理由を徹底解説!Java初心者でも分かるクラウドネイティブ
No.6
Java&Spring記事人気No6
Quarkus
Quarkusの開発環境構築で躓きやすいポイントを完全解説!初心者でも安心して始めるためのチェックガイド
No.7
Java&Spring記事人気No7
Java
Javaのboolean型の使い方を完全ガイド!真偽値と条件分岐の基本
No.8
Java&Spring記事人気No8
Micronaut
MicronautのAOPが高速な理由とは?コンパイル時AOPの仕組みを初心者向けに徹底解説