Java ArrayListの使い方は?操作方法をわかりやすく解説
JavaのArrayListは、多くのプログラマーに愛用される便利なデータ構造です。配列の使いやすさと、動的なサイズ変更の柔軟性を兼ね備えており、さまざまな場面で活躍します。
本記事では、ArrayListの基本的な概念から、具体的な使用方法、配列やLinkedListとの違い、高度な活用テクニックまで、幅広く解説します。
ぜひ、本記事を参考に、ArrayListの力を隅々まで活用してください。
Java ArrayListとは?
JavaのArrayListは、配列と同様に複数の要素を格納できるデータ構造です。
ArrayListはjava.utilパッケージに含まれており、Listインターフェースを実装しています。
ArrayListは、動的にサイズを調整できる構造なので、要素の追加や削除に応じて、自動的にリストのサイズが変更されます。
また、ジェネリクスを使用すると、特定の型の要素のみを格納するよう指定できるため、型安全性が高く、コンパイル時に型チェックがおこなわれます。
さらに、配列と同様にインデックスを使って要素にアクセスできるため、要素の取得が容易です。
以下は、ArrayListの基本的な使用例です。
import java.util.ArrayList;
ArrayList<String> 果物リスト = new ArrayList<>();
果物リスト.add(“りんご”);
果物リスト.add(“バナナ”);
果物リスト.add(“オレンジ”);
System.out.println(果物リスト.get(1)); // “バナナ”を出力
配列との違いについて
ArrayListと配列には、いくつかの重要な違いがあります。主な違いを表にしました。
ArrayList |
配列 |
|
サイズの可変性 |
動的にサイズを変更できます |
作成時にサイズが固定され、あとから変更できません |
型安全性 |
コンパイル時に型チェックをおこないます(ジェネリクスを使用した場合) |
実行時に型チェックをおこないます |
パフォーマンス |
要素の追加・削除が頻繁な場合に適しています |
メモリ使用量が少なく、アクセス速度が速いです |
機能性 |
要素の追加、削除、検索などの多様な操作が可能です |
基本的な操作のみ可能です |
以下は、配列とArrayListの使用例です。
// 配列の例
int[] 数値配列 = new int[3];
数値配列[0] = 1;
数値配列[1] = 2;
数値配列[2] = 3;
// ArrayListの例
ArrayList<Integer> 数字リスト = new ArrayList<>();
数字リスト.add(1);
数字リスト.add(2);
数字リスト.add(3);
ArrayListは配列よりも柔軟性が高く、多くの場面で使いやすいデータ構造です。
Listとの違い
ArrayListはListインターフェースを実装していますが、他のList実装との間にはいくつかの違いがあります。
例としてLinkedListとの主な違いは以下のとおりです。
ArrayList |
LinkedList |
|
内部構造 |
配列をベースにしています |
双方向リンクリストを使用しています |
パフォーマンス特性 |
ランダムアクセスが速いですが、要素の挿入・削除は遅いです |
要素の挿入・削除が速いですが、ランダムアクセスは遅いです |
メモリ使用 |
連続したメモリ領域を使用します |
各要素が別々のメモリ領域を使用します |
使用場面 |
要素の取得が多い場合に適しています |
要素の追加・削除が頻繁な場合に適しています |
ArrayListとLinkedListは同じListインターフェースを実装していますが、内部構造や性能特性が異なります。用途に応じて適切なList実装を選択してください。
Java ArrayListの使い方
JavaのArrayListは、多くの便利なメソッドを提供しており、さまざまな操作をおこなうことができます。以下に、ArrayListの基本的な使い方を説明します。
1. ArrayListの宣言と初期化
ArrayList<String> リスト = new ArrayList<>();
リストに追加できる要素の型(上記の例ではString)を指定して作成します。
2. 要素の追加
リスト.add(“要素1”);
リスト.add(“要素2”);
3. 要素の取得
String 要素 = リスト.get(0); // インデックス0の要素を取得
4. 要素の削除
リスト.remove(1); // インデックス1の要素を削除
5. リストのサイズ取得
int サイズ = リスト.size();
6. リストの反復処理
for (String 要素 : リスト) {
System.out.println(要素);
}
7. 要素の存在確認
boolean 存在する = リスト.contains(“要素1”);
8. リストの全アイテムを除去
リスト.clear();
上記の操作を組み合わせることで、ArrayListはさまざまな処理を実現します。
例えば、以下のようなコードで買い物リストを管理できます。
ArrayList<String> 買い物リスト = new ArrayList<>();
買い物リスト.add(“牛乳”);
買い物リスト.add(“パン”);
買い物リスト.add(“卵”);
System.out.println(“買い物リスト: “ + 買い物リスト);
買い物リスト.remove(“パン”);
System.out.println(“パンを削除後: “ + 買い物リスト);
System.out.println(“卵は含まれていますか? “ + 買い物リスト.contains(“卵”));
ご紹介したように、ArrayListは要素の追加、削除、検索などの操作が簡単におこなえる便利なデータ構造です。
Java ArrayListのメソッド一覧
Java ArrayListには多くのメソッドがあります。
まずは、次の表を参考に、主要なメソッドの概要をつかんでください。
Java ArrayListでよく使うメソッド
ArrayListメソッドの使い方と概要は以下のとおりです。
分類 |
メソッド |
概要 |
使い方の例 |
追加 |
add() |
末尾または指定位置に要素を追加 |
果物リスト.add(“りんご”); |
追加 |
addAll() |
指定のコレクションの全要素を追加 |
果物リスト.addAll(他の果物リスト); |
取得 |
get() |
指定位置の要素を取得 |
String 最初の果物 = 果物リスト.get(0); |
変更 |
set() |
指定位置の要素を置き換え |
果物リスト.set(0, “バナナ”); |
削除 |
remove() |
指定位置または指定要素を削除 |
果物リスト.remove(1); |
削除 |
clear() |
すべての要素を削除 |
果物リスト.clear(); |
検索 |
contains() |
指定要素が含まれているか確認 |
boolean りんごあり = 果物リスト.contains(“りんご”); |
コピー |
subList() |
一部を抽出して新しいリストを作成 |
List<String> 部分リスト = 果物リスト.subList(1, 3); |
コピー |
clone() |
浅いコピーを作成 |
ArrayList<String> コピーリスト = (ArrayList<String>) 果物リスト.clone(); |
その他 |
size() |
要素数を取得 |
int リストの長さ = 果物リスト.size(); |
その他 |
indexOf() |
指定要素の最初の出現位置を取得 |
int りんごの位置 = 果物リスト.indexOf(“りんご”); |
その他 |
sort() |
要素を並べ替え |
果物リスト.sort(null); |
実際のプログラミングでは、上記のメソッドを組み合わせてリスト内の要素のさまざまな処理をおこないます。
Java ArrayListのメソッドと使い方の例
ArrayListは、要素の追加、削除、取得などの操作を柔軟におこなえます。
本項では、ArrayListの主要なメソッドと使用例を操作内容別に説明します。
要素を上書きする
ArrayListの要素を上書きするには、set()メソッドを使用します。set()メソッドは指定したインデックスの要素を新しい値で置き換えます。
ArrayList<String> 果物リスト = new ArrayList<>();
果物リスト.add(“りんご”);
果物リスト.add(“バナナ”);
果物リスト.set(1, “みかん”);
System.out.println(果物リスト); // 出力: [りんご, みかん]
上記のコード例では、インデックス1の「バナナ」を「みかん」に上書きしています。
要素を追加する
ArrayListに要素を追加するには、add()メソッドを使用します。add()メソッドはリストの末尾に要素を追加します。また、addAll()メソッドを使用すると、別のコレクションの全要素を一度に追加できます。
ArrayList<Integer> 数字リスト = new ArrayList<>();
数字リスト.add(1);
数字リスト.add(2);
数字リスト.add(1, 3); // インデックス1に3を挿入
System.out.println(数字リスト); // 出力: [1, 3, 2]
ArrayList<Integer> 追加リスト = new ArrayList<>(Arrays.asList(4, 5));
数字リスト.addAll(追加リスト);
System.out.println(数字リスト); // 出力: [1, 3, 2, 4, 5]
上記のコード例では、add()メソッドを使って要素を追加し、addAll()メソッドで別のリストの要素を一括追加しています。
要素を削除する
ArrayListから要素を削除するには、remove()メソッドを使用します。remove()メソッドは指定したインデックスまたは要素を削除します。
また、removeAll()メソッドで複数の要素を一度に削除したり、clear()メソッドでリスト全体をクリアしたりできます。
ArrayList<String> 色リスト = new ArrayList<>(Arrays.asList(“赤”, “青”, “緑”, “黄”));
色リスト.remove(1); // インデックス1の要素を削除
System.out.println(色リスト); // 出力: [赤, 緑, 黄]
色リスト.remove(“緑”); // 要素”緑”を削除
System.out.println(色リスト); // 出力: [赤, 黄]
色リスト.clear(); // リストをクリア
System.out.println(色リスト); // 出力: []
上記のコード例では、remove()メソッドを使ってインデックスまたは要素を指定して削除し、clear()メソッドでリスト全体をクリアしています。
要素を抽出する
ArrayListから特定の範囲の要素を抽出するには、subList()メソッドを使用します。
また、Java 8以降では、ストリームAPIを使用してより柔軟に要素を抽出できます。
ArrayList<String> 動物リスト = new ArrayList<>(Arrays.asList(“dog”, “cat”, “bird”, “fish”, “rabbit”));
List<String> 抽出リスト = 動物リスト.subList(1, 4);
System.out.println(抽出リスト); // 出力: [cat, bird, fish]
// ストリームAPIを使用した抽出
List<String> 三文字動物 = 動物リスト.stream()
.filter(動物 -> 動物.length() == 3) // 3文字の動物を抽出する
.collect(Collectors.toList());
System.out.println(三文字動物); // 出力: [dog, cat]
上記コード例の前半では、subList()メソッドを使って特定の範囲の要素を抽出し、後半ではストリームAPIを使って条件に合う要素だけを抽出しています。
要素を検索する
ArrayListから特定の要素を検索するには、主にindexOf()、lastIndexOf()、contains()メソッドを使用します。
ArrayList<String> 動物リスト = new ArrayList<>(Arrays.asList(“dog”, “cat”, “bird”, “cat”, “rabbit”));
// indexOf()を使用して最初に出現する位置を検索
int 最初のcat位置 = 動物リスト.indexOf(“cat”);
System.out.println(“最初のcatの位置: “ + 最初のcat位置); // 出力: 最初のcatの位置: 1
// lastIndexOf()を使用して最後に出現する位置を検索
int 最後のcat位置 = 動物リスト.lastIndexOf(“cat”);
System.out.println(“最後のcatの位置: “ + 最後のcat位置); // 出力: 最後のcatの位置: 3
// contains()を使用して要素の存在を確認
boolean fishあり = 動物リスト.contains(“fish”);
System.out.println(“fishは含まれますか?: “ + fishあり); // 出力: fishは含まれますか?: false
// ストリームAPIを使用した複雑な検索
boolean 四文字動物あり = 動物リスト.stream().anyMatch(動物 -> 動物.length() == 4);
System.out.println(“4文字の動物はありますか?: “ + 四文字動物あり); // 出力: 4文字の動物はありますか?: true
indexOf()とlastIndexOf()は要素の位置インデックスを返し、contains()は要素の有無を確認します。
まとめ
JavaのArrayListは動的サイズ変更可能なリスト構造で、要素の追加・削除・取得が簡単です。
配列よりも柔軟性が高く、ジェネリクスで型安全性も確保できます。さまざまなメソッドを活用して効率的なデータ操作が可能です。
ArrayListを使って、より効率的なプログラミングを始めましょう。