Java初心者でもマスターできる!動的配列の使い方10選

Java初心者が学ぶ動的配列の使い方とサンプルコードJava
この記事は約24分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Javaのプログラミングを学ぶ際に、データ構造の一つである動的配列は非常に重要なトピックとなります。

今回の記事では、Java初心者でもマスターできる動的配列の使い方10選をご紹介します。

動的配列の基本から応用、そしてカスタマイズ方法まで、豊富な知識をステップバイステップで身につけられる内容となっています。

あなたがJavaの動的配列を理解し、効果的に利用できるようになることを目指しています。

●Javaと動的配列の基本

まずは、Javaと動的配列の基本について解説します。Javaは広く利用されているプログラミング言語の一つで、その特性を理解することが、動的配列を効果的に利用するための第一歩となります。

○Javaの概要

Javaは、1995年にサン・マイクロシステムズ(現オラクル社)によって開発されたプログラミング言語です。

特徴としてはオブジェクト指向プログラミングを採用しており、プラットフォーム非依存な動作が可能です。

これによって、様々なデバイスやオペレーティングシステムで動作するプログラムを、同一のコードで開発できます。

初心者にとっても学びやすい言語構造が採用されており、多くの企業やプロジェクトで利用されています。

○動的配列とは

動的配列とは、配列のサイズを動的に変更できるデータ構造の一つです。

通常の配列では、宣言時にサイズを決める必要がありますが、動的配列は要素の追加や削除が行えるため、柔軟なデータの管理が可能です。

JavaではArrayListやLinkedListといったクラスが動的配列の役割を担っており、それぞれ異なる特性や用途があります。

○動的配列の利点

動的配列の最大の利点はその柔軟性にあります。

要素の追加や削除が容易であり、データの管理が直感的に行えます。

また、Javaの動的配列クラスは多くの便利なメソッドを提供しているため、データの検索やソートなど、さまざまな操作が効率的に行えます。

さらに、動的配列はメモリ効率が良いという特徴もあります。

配列のサイズを動的に変更できるため、無駄なメモリ領域を割り当てることなく、必要なサイズの配列を使用できます。

●Javaにおける動的配列の使い方

Javaを学ぶ中で、動的配列は非常に重要な役割を果たしています。

特に、データ構造やアルゴリズムを学ぶ際には、動的配列の理解が必要不可欠となります。

ここでは、Javaでの動的配列の使い方を詳しく解説します。

○動的配列の宣言方法

Javaでの動的配列は、主にArrayListやLinkedListなどのクラスを使用して宣言します。

これらのクラスは、java.utilパッケージに含まれているため、使用する前に該当するパッケージをインポートする必要があります。

□ArrayListの基本

ArrayListは、内部で配列を使用してデータを管理する動的配列のクラスです。

要素の追加や削除が可能で、使用する際には次のようなコードが一般的です。

import java.util.ArrayList;

public class SampleArrayList {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();  // 文字列型のArrayListを宣言
    }
}

このコードでは、java.utilパッケージからArrayListクラスをインポートしています。

そして、文字列を要素として格納できるArrayListのインスタンスを生成しています。

□LinkedListの基本

LinkedListは、要素間のリンク(ノード)を使用してデータを管理する動的配列のクラスです。

ArrayListとは異なり、要素の追加や削除がリンクの付け替えで行われるため、中間の要素の追加や削除が高速に行えるという特徴があります。

LinkedListの基本的な使用方法を紹介します。

import java.util.LinkedList;

public class SampleLinkedList {
    public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<>();  // 文字列型のLinkedListを宣言
    }
}

このコードでは、java.utilパッケージからLinkedListクラスをインポートし、文字列型のLinkedListのインスタンスを生成しています。

○サンプルコード1:ArrayListの初期化と要素の追加

ArrayListを使用する際、まずはインスタンスを生成した後、要素を追加する方法を見てみましょう。

import java.util.ArrayList;

public class SampleArrayListAdd {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("Java");  // 要素の追加
        list.add("Python");
        list.add("C++");
    }
}

このコードを実行すると、listというArrayListに”Java”、”Python”、”C++”という3つの文字列が順に追加されます。

○サンプルコード2:ArrayListから要素の削除

次に、ArrayListから要素を削除する方法を解説します。

import java.util.ArrayList;

public class SampleArrayListRemove {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("Java");
        list.add("Python");
        list.add("C++");

        list.remove(1);  // インデックス1の要素を削除
    }
}

このコードを実行すると、”Python”という文字列がArrayListから削除されます。

その結果、listの中には”Java”と”C++”のみが残ります。

○サンプルコード3:LinkedListでの要素の追加と取得

次に、LinkedListを使った要素の追加と取得の方法を紹介します。

import java.util.LinkedList;

public class SampleLinkedListAddAndGet {
    public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<>();
        list.add("Java");
        list.add("Python");

        String firstElement = list.get(0);  // インデックス0の要素を取得
        System.out.println(firstElement);   // 出力:Java
    }
}

このコードでは、まず”Java”と”Python”をLinkedListに追加しています。

その後、インデックス0の要素を取得して出力しています。

そのため、このコードを実行するとコンソールには”Java”と表示されます。

○サンプルコード4:LinkedListから要素の削除

LinkedListから要素を削除する方法も、ArrayListと同様です。

import java.util.LinkedList;

public class SampleLinkedListRemove {
    public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<>();
        list.add("Java");
        list.add("Python");
        list.add("C++");

        list.remove(2);  // インデックス2の要素を削除
    }
}

このコードを実行すると、”C++”という文字列がLinkedListから削除され、listの中には”Java”と”Python”のみが残ることになります。

●動的配列の応用例

Javaでのプログラミング作業を進める上で、動的配列は非常に有用なデータ構造の一つとして知られています。

ここでは、動的配列を用いたデータのソートや検索といった応用例を取り上げ、サンプルコードとともにわかりやすく解説します。

ここで紹介する知識を習得することで、Javaプログラムの更なる向上が図れるでしょう。

○サンプルコード5:動的配列を用いたデータのソート

データのソートはプログラミングの中で頻繁に行われる作業の一つです。

下記のコードは、ArrayListを使用してデータをソートする簡潔な方法を表しています。

import java.util.ArrayList;
import java.util.Collections;

public class DynamicArraySortExample {
    public static void main(String[] args) {
        ArrayList<Integer> numbers = new ArrayList<>();
        numbers.add(5);
        numbers.add(3);
        numbers.add(8);
        numbers.add(1);

        // このコードはCollectionsクラスのsortメソッドを利用してArrayListの要素をソートします。
        Collections.sort(numbers);

        // ソート後のArrayListを表示します
        System.out.println(numbers);
    }
}

このコードでは、まずArrayListを生成し、数値をいくつか追加しています。

その後、Collectionsクラスのsortメソッドを用いて配列の要素をソートします。

コードを実行すると、ArrayListの要素が昇順にソートされた結果、[1, 3, 5, 8]がコンソールに表示されます。

○サンプルコード6:動的配列を用いたデータの検索

データ検索はプログラムの機能として非常に重要です。

下記のサンプルコードは、ArrayList内のデータを検索する方法を表しています。

import java.util.ArrayList;

public class DynamicArraySearchExample {
    public static void main(String[] args) {
        ArrayList<String> words = new ArrayList<>();
        words.add("Java");
        words.add("Python");
        words.add("JavaScript");

        // このコードはArrayListのcontainsメソッドを使って特定の要素がリスト内に存在するかを確認します。
        boolean isPresent = words.contains("Python");

        // 要素の存在確認結果を表示します。
        if (isPresent) {
            System.out.println("The list contains the word 'Python'.");
        } else {
            System.out.println("The list does not contain the word 'Python'.");
        }
    }
}

このコードは初めにArrayListを生成し、いくつかの文字列を追加しています。

その後、containsメソッドを使用して「Python」という文字列がリストに存在するかどうかを調べます。

このコードを実行すると、”The list contains the word ‘Python’.”というメッセージがコンソールに表示されます。

○サンプルコード7:動的配列の入れ子構造

Javaプログラムにおける動的配列の入れ子構造は、配列内に別の配列を持たせることでデータをより柔軟かつ構造的に管理できるテクニックです。

ここでは、この高度な使い方について解説し、具体的なサンプルコードを示します。

まず、Javaにおける動的配列として一般的に利用されるArrayListクラスを使い、その内部にさらにArrayListを格納する方法を見ていきましょう。

下記のサンプルコードは、ArrayListの入れ子構造を利用して、行ごとにデータを格納するプログラムです。

import java.util.ArrayList;

public class NestedArrayList {
    public static void main(String[] args) {
        // 外側のArrayListを生成
        ArrayList<ArrayList<String>> outerList = new ArrayList<>();

        // 第1行目のデータを内側のArrayListとして生成
        ArrayList<String> innerList1 = new ArrayList<>();
        innerList1.add("1-1");
        innerList1.add("1-2");
        innerList1.add("1-3");

        // 第2行目のデータを内側のArrayListとして生成
        ArrayList<String> innerList2 = new ArrayList<>();
        innerList2.add("2-1");
        innerList2.add("2-2");
        innerList2.add("2-3");

        // 内側のArrayListを外側のArrayListに追加
        outerList.add(innerList1);
        outerList.add(innerList2);

        // 入れ子構造の動的配列の内容を表示
        for(ArrayList<String> innerList : outerList) {
            for(String item : innerList) {
                System.out.print(item + " ");
            }
            System.out.println();
        }
    }
}

このコードでは、まず外側のArrayListを生成し、その後内側のArrayListを2つ生成してデータを追加しています。

その後、これらの内側のArrayListを外側のArrayListに追加して、最後にその内容を表示しています。

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

1-1 1-2 1-3 
2-1 2-2 2-3

このように、動的配列の入れ子構造を利用することで、複数行のデータを効果的に管理することができます。

また、この構造はさらに深くすることも可能で、ArrayList内にArrayListをさらに入れ子として格納することもできます。

○サンプルコード8:動的配列を用いたオブジェクトの管理

次に、動的配列を用いたオブジェクトの管理方法について解説します。

Javaにおいては、オブジェクト指向プログラミングの特性を活かし、複数のオブジェクトを動的配列で管理することができます。

下記のサンプルコードは、動的配列ArrayListを用いて、Studentクラスのインスタンスを管理するプログラムです。

import java.util.ArrayList;

class Student {
    String name;
    int age;

    Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{name='" + name + "', age=" + age + "}";
    }
}

public class StudentManager {
    public static void main(String[] args) {
        // Studentインスタンスを格納するArrayListを生成
        ArrayList<Student> studentList = new ArrayList<>();

        // Studentインスタンスを生成しArrayListに追加
        studentList.add(new Student("山田太郎", 20));
        studentList.add(new Student("佐藤花子", 19));

        // ArrayListの内容を表示
        for(Student student : studentList) {
            System.out.println(student);
        }
    }
}

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

Student{name='山田太郎', age=20}
Student{name='佐藤花子', age=19}

このコードではStudentクラスを定義し、そのインスタンスを動的配列ArrayListで管理しています。

それぞれのインスタンスはnameとageという属性を持ち、これらのデータを持つオブジェクトをArrayListで管理しています。

これにより、複数のオブジェクトを効果的に管理することができます。

●動的配列の注意点と対処法

動的配列は非常に便利なデータ構造ですが、使用時にいくつかの注意点があります。

それでは、Javaの動的配列使用時の主要な注意点とそれらに対する対処法について詳細に説明し、サンプルコードを交えながら解説します。

○注意点1:インデックスの範囲外アクセス

最初の注意点は、インデックスの範囲外アクセスです。

動的配列では、要素の位置を指定してアクセスする際に、指定したインデックスが配列のサイズを超えているとエラーが発生します。

これは、「ArrayIndexOutOfBoundsException」例外を引き起こします。

Javaにおけるこの問題を解決するためのサンプルコードを紹介します。

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("要素1");
        list.add("要素2");

        try {
            System.out.println(list.get(2)); // インデックス2は存在しないためエラー
        } catch (IndexOutOfBoundsException e) {
            System.out.println("インデックスの範囲外アクセスが発生しました:" + e.getMessage());
        }
    }
}

このコードでは、ArrayListを初期化し、2つの要素を追加しています。

その後、存在しないインデックス2にアクセスしようとしています。

これによりIndexOutOfBoundsExceptionが発生しますが、try-catch構文を使って適切にエラーハンドリングしています。

このコードを実行すると、コンソールに「インデックスの範囲外アクセスが発生しました:Index 2 out of bounds for length 2」というメッセージが表示されます。

○注意点2:null要素の取り扱い

次に、null要素の取り扱いに注意が必要です。

動的配列はnull要素を許容しますが、これが意図しないバグを引き起こす可能性があります。

下記のサンプルコードでは、null要素の取り扱い方法を説明します。

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add(null);

        if (list.get(0) == null) {
            System.out.println("要素はnullです");
        } else {
            System.out.println(list.get(0));
        }
    }
}

このコードでは、ArrayListにnull要素を追加しています。

その後、取得した要素がnullかどうかを確認し、nullの場合は適切なメッセージを表示します。

このコードを実行すると、「要素はnullです」と表示されます。

○注意点3:並行アクセスの問題

動的配列は複数のスレッドからの並行アクセスが発生すると、データの不整合や他の問題を引き起こす可能性があります。

これを解決する方法は、Collections.synchronizedListメソッドを使用してスレッドセーフなリストを作成することです。

次のサンプルコードでは、並行アクセスの問題を解決する方法を紹介します。

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

public class Main {
    public static void main(String[] args) {
        List<String> list = Collections.synchronizedList(new ArrayList<>());
        list.add("要素1");
        list.add("要素2");

        // 以下のようにsynchronizedブロックを使用してアクセスする
        synchronized (list) {
            for (String str : list) {
                System.out.println(str);
            }
        }
    }
}

このコードでは、Collections.synchronizedListメソッドを使用してスレッドセーフなリストを作成しています。そして、リストへのアクセスはsynchronizedブロック内で行うことで、並行アクセスの問題を避けています。

このコードを実行すると、コンソールに「要素1」と「要素2」が順に表示されます。

○対処法:例外処理の導入

上記の注意点に対する一般的な対処法として、例外処理の導入があります。例外処理を適切に行うことで、動的配列の使用時に発生する可能性のあるエラーや問題を効果的に管理できます。

具体的には、try-catchブロックを使用してエラーを捕捉し、プログラムが予期せぬ動作を行うのを防ぐことができます。また、カスタム例外を作成して、特定のエラー条件に関連した情報を提供することもできます。

●動的配列のカスタマイズ方法

動的配列を使用する際には、基本的な利用方法だけでなく、自身のニーズに合わせたカスタマイズ方法も知っておくことが非常に有用です。

動的配列をカスタマイズすることで、データ管理がより効率的かつ効果的に行えるようになります。

ここでは、Javaの動的配列のカスタマイズ方法について、具体的なサンプルコードを交えて詳しく解説します。

○サンプルコード9:カスタムクラスの作成と利用

Javaの動的配列においては、ユーザー定義のカスタムクラスを作成し、そのクラスを利用して配列を構築することが可能です。

下記のサンプルコードは、Personクラスを作成し、そのインスタンスをArrayListに格納する例です。

import java.util.ArrayList;

// カスタムクラス「Person」を作成します。このクラスは名前と年齢を属性として持ちます。
public class Person {
    String name;
    int age;

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + '}';
    }

    public static void main(String[] args) {
        // Personクラスのインスタンスを動的配列ArrayListに格納します。
        ArrayList<Person> personList = new ArrayList<>();
        personList.add(new Person("山田太郎", 30));
        personList.add(new Person("佐藤花子", 25));

        // 動的配列の中身を表示します。これにより、各インスタンスのtoStringメソッドが呼び出され、情報が出力されます。
        for (Person person : personList) {
            System.out.println(person);
        }
    }
}

上記のコードでは、カスタムクラスPersonを作成し、そのインスタンスをArrayListに格納しています。

mainメソッド内で動的配列personListを作成し、Personクラスのインスタンスを2つ追加しています。

最後にfor-eachループを用いて配列の中身を表示しています。

実行すると、次のような結果が得られます。

Person{name='山田太郎', age=30}
Person{name='佐藤花子', age=25}

これによって、カスタムクラスのインスタンスを動的配列で管理することが可能となります。

○サンプルコード10:動的配列の拡張機能の導入

Javaの動的配列は、基本的な機能だけでなく、拡張機能も提供します。これにより、より高度なデータ管理が可能となります。

下記のサンプルコードでは、動的配列の拡張機能を利用して、配列の要素をフィルタリングする例を表します。

import java.util.ArrayList;
import java.util.stream.Collectors;

public class ArrayListExtension {
    public static void main(String[] args) {
        ArrayList<Integer> numberList = new ArrayList<>();
        numberList.add(10);
        numberList.add(20);
        numberList.add(30);
        numberList.add(40);

        // ストリームAPIを利用して、配列の要素をフィルタリングします。ここでは、20より大きい要素のみを抽出します。
        ArrayList<Integer> filteredList = numberList.stream()
                .filter(num -> num > 20)
                .collect(Collectors.toCollection(ArrayList::new));

        // フィルタリングされたリストを表示します。
        for (Integer num : filteredList) {
            System.out.println(num);
        }
    }
}

このコードでは、ArrayListのインスタンスnumberListにいくつかの要素を追加した後、ストリームAPIを利用して20より大きい要素のみを抽出して新しいArrayListを作成しています。

そして、フィルタリングされたリストを表示しています。

実行すると、次のような結果が得られます。

30
40

これによって、動的配列の拡張機能を利用して、特定の条件を満たす要素のみを抽出することができます。

このような拡張機能の利用は、プログラムの柔軟性と効率を向上させる助けとなります。

まとめ

Javaプログラムにおいて、動的配列は非常に強力かつ便利なデータ構造です。

今回の記事を通じて、初心者でもJavaの動的配列の扱い方に関する幅広い知識を習得できたことでしょう。

下記の要点を振り返りながら、より深く学びを積む上での足がかりとして利用してください。

今回学んだ知識を生かして、Javaプログラミングのスキルをさらに向上させることを目指してください。

さらに詳細な学習や実践を通じて、初心者から一歩進んだプログラマーへとステップアップできることを期待しています。

今回の記事が、Javaの動的配列の使い方を学ぶ上での一助となれば幸いです。

最後まで読んでいただき、ありがとうございました。