こんにちは!バックエンドエンジニアのキョンです。今回は、Javaで最もよく使用されるコレクションの1つである「ArrayList」について、実務での経験を交えながら詳しく解説していきます。
目次
1. ArrayListとは
配列との違い
新人時代、私は「配列があるのになぜArrayListが必要なんだろう?」と疑問に思っていました。実は、これは多くの方が持つ疑問なんです。
ArrayListの最大の特徴は、サイズが動的に変更できるという点です。従来の配列と違って、要素数を事前に決める必要がありません。
ArrayListの特徴
- 動的なサイズ変更が可能
- インデックスによる高速アクセス
- null要素の格納が可能
- ジェネリクスに対応
2. ArrayListの基本操作
初期化方法
// 基本的な初期化
ArrayList<String> list = new ArrayList<>();
// 初期容量を指定した初期化
ArrayList<String> list2 = new ArrayList<>(10);
// 要素を指定した初期化
ArrayList<String> list3 = new ArrayList<>(Arrays.asList("Java", "Python", "Ruby"));
主要なメソッド
実務でよく使用するメソッドを紹介します:
ArrayList<String> languages = new ArrayList<>();
// 要素の追加
languages.add("Java"); // 末尾に追加
languages.add(0, "Python"); // インデックスを指定して追加
// 要素の取得
String lang = languages.get(0); // "Python"が取得できる
// 要素の削除
languages.remove("Java"); // 要素を指定して削除
languages.remove(0); // インデックスを指定して削除
// サイズの取得
int size = languages.size();
// 要素の存在確認
boolean exists = languages.contains("Java");
3. ArrayListのパフォーマンス特性
時間計算量
私が実務で特に注意しているのが、各操作の計算量です:
- 要素の追加(末尾): O(1) ※再配置が必要な場合を除く
- 要素の追加(任意の位置): O(n)
- 要素の取得: O(1)
- 要素の削除: O(n)
- 検索: O(n)
メモリ使用量
実際のプロジェクトでは、メモリ使用量も重要な考慮点です:
// メモリ効率の良い初期化
ArrayList<String> efficientList = new ArrayList<>(expectedSize);
4. 実務でのArrayList活用例
Webアプリケーションでの利用例
実際の開発案件から、具体例を紹介します:
public class UserService {
public ArrayList<User> getActiveUsers() {
ArrayList<User> activeUsers = new ArrayList<>();
// DBから取得したユーザーを動的に追加
while (resultSet.next()) {
User user = new User(
resultSet.getString("name"),
resultSet.getString("email")
);
activeUsers.add(user);
}
return activeUsers;
}
}
データ処理での活用例
public class DataProcessor {
public ArrayList<String> filterInvalidData(ArrayList<String> rawData) {
ArrayList<String> validData = new ArrayList<>();
for (String data : rawData) {
if (isValid(data)) {
validData.add(data);
}
}
return validData;
}
}
5. よくあるミスと対策
1. 不適切な初期容量設定
// 悪い例
ArrayList<String> list = new ArrayList<>(1000000); // メモリの無駄遣い
// 良い例
ArrayList<String> list = new ArrayList<>(expectedSize + (expectedSize / 10));
2.非効率な要素削除
// 悪い例(ループ中の要素削除)
for (int i = 0; i < list.size(); i++) {
if (someCondition) {
list.remove(i); // インデックスがずれる
}
}
// 良い例
list.removeIf(element -> someCondition);
まとめ
ArrayListは、その使いやすさと柔軟性から、Javaプログラミングには欠かせないコレクションとなっています。
特に以下の場面でArrayListの使用をお勧めします:
- 要素数が動的に変化するデータの管理
- インデックスベースの高速アクセスが必要な場合
- 要素の追加・削除が主に末尾で行われる場合
次回は「JavaのLinkedListとArrayListの使い分け」について解説する予定です。お楽しみに!
参考情報
- Java SE Documentation
- Effective Java 第3版
- Java Collections Framework
コメント