タイトル: リスト要素数の取得
SEOタイトル: Java リスト要素数の取得(size メソッド / 配列の length / ArrayList / 空判定 / Stream count)
| この記事の要点 |
|
Java で要素数を取得する方法
Java のコレクション (List / Set / Map) と配列では、要素数の取得方法が異なります。コレクションは size() メソッド、配列は length フィールド。混同しがちなので注意。
List.size() — 基本構文
import java.util.ArrayList;
import java.util.List;
List list1 = new ArrayList<>();
list1.add("a");
list1.add("b");
list1.add("c");
System.out.println(list1.size());
// 出力: 3
List.of() で初期化したリスト
// Java 9+
List list = List.of("a", "b", "c");
System.out.println(list.size()); // 3
// List.of は不変リストを返す。add() 等は UnsupportedOperationException
配列の length
配列はメソッドではなくフィールドです。括弧を付けません。
int[] nums = {10, 20, 30, 40, 50};
System.out.println(nums.length); // 5
String[] names = new String[10];
System.out.println(names.length); // 10 (全要素 null だが length は 10)
// 多次元配列の長さ
int[][] grid = new int[3][5];
System.out.println(grid.length); // 3 (行数)
System.out.println(grid[0].length); // 5 (列数)
size() と length の使い分け早見表
| 対象 | 取得方法 | 戻り値 |
|---|---|---|
配列 (int[] など) | arr.length | int |
String | str.length() | int (文字数) |
List / Set | list.size() | int |
Map | map.size() | int (キー数) |
Stream | stream.count() | long |
Collection (インターフェース) | collection.size() | int |
空判定は isEmpty() を使う
size() == 0 よりも isEmpty() が推奨です。可読性が高く、一部の実装ではより高速。
List list = new ArrayList<>();
// 推奨
if (list.isEmpty()) {
System.out.println("空です");
}
// 非推奨 (動くが冗長)
if (list.size() == 0) {
System.out.println("空です");
}
// LinkedList などでは size() が O(1) でない実装もある (現代の JDK は O(1) だが)
null チェック
リスト自体が null だと size() 呼び出しで NullPointerException が発生します。
List list = null;
// NG
// int n = list.size(); // NullPointerException
// 安全な書き方
if (list != null && !list.isEmpty()) {
// 処理
}
// Java 11+
import java.util.Objects;
if (!Objects.requireNonNullElse(list, List.of()).isEmpty()) {
// ...
}
// Collections.emptyList() で null を避ける設計
List safe = list != null ? list : Collections.emptyList();
int n = safe.size();
Stream の count()
Stream API では count() で要素数を取得します。戻り値は long なので注意。条件フィルタとの組み合わせが強力。
import java.util.List;
List nums = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// 全体の数
long total = nums.stream().count();
System.out.println(total); // 10
// 偶数の数
long evens = nums.stream()
.filter(n -> n % 2 == 0)
.count();
System.out.println(evens); // 5
// 文字列の長さでフィルタ
List words = List.of("apple", "banana", "cherry", "fig");
long longWords = words.stream()
.filter(w -> w.length() > 4)
.count();
System.out.println(longWords); // 3 (apple, banana, cherry)
Map の要素数
import java.util.HashMap;
import java.util.Map;
Map map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);
System.out.println(map.size()); // 3 (キー数)
System.out.println(map.keySet().size()); // 3
System.out.println(map.values().size()); // 3 (重複あっても全カウント)
パフォーマンス特性
| 実装 | size() 計算量 |
|---|---|
ArrayList | O(1) |
LinkedList | O(1) (内部カウントを保持) |
HashMap / HashSet | O(1) |
ConcurrentHashMap | O(n) の場合あり (並行更新中) |
Stream.count() | O(n) (要素を走査) |
FAQ
Q: なぜ配列だけ length でメソッドじゃないのか
A: 配列は Java の言語仕様レベルのオブジェクトで、length は特殊なフィールド扱い。互換性のため変更されていない。
Q: String の文字数を size() で取れない
A: String は length() メソッド。Java の歴史的経緯で配列の length と紛らわしいが、こちらはメソッド (括弧あり)。
Q: size() と Stream.count() どちらが速い?
A: コレクションがあるなら必ず size()。Stream は中間操作を遅延評価のため、count() はそれらを走査する必要があり遅い。
関連
- リスト要素の更新 (Python 版)
- ArrayList / LinkedList の違い
- Collections / Stream API
- String.length() vs char[].length