Day 4: 配列と文字列
今日学ぶこと
- 配列の宣言と操作
- 多次元配列
- String の詳細
- StringBuilder
- 配列のユーティリティ(Arrays クラス)
配列
配列は同じ型のデータを複数格納するデータ構造です。
// 宣言と初期化
int[] numbers = new int[5]; // サイズ5の配列(0で初期化)
int[] scores = {90, 85, 78, 92, 88}; // 初期値を指定
// アクセス
scores[0] // 90(最初の要素)
scores[4] // 88(最後の要素)
scores.length // 5(要素数)
flowchart LR
subgraph Array["scores 配列"]
I0["[0]<br>90"]
I1["[1]<br>85"]
I2["[2]<br>78"]
I3["[3]<br>92"]
I4["[4]<br>88"]
end
style I0 fill:#3b82f6,color:#fff
style I1 fill:#3b82f6,color:#fff
style I2 fill:#3b82f6,color:#fff
style I3 fill:#22c55e,color:#fff
style I4 fill:#3b82f6,color:#fff
配列の操作
int[] numbers = {5, 3, 8, 1, 9};
// 全要素の出力
for (int num : numbers) {
System.out.print(num + " ");
}
// 5 3 8 1 9
// 要素の変更
numbers[0] = 10;
// 要素数
System.out.println(numbers.length); // 5
注意: 配列のサイズは作成後に変更できません。サイズを変えたい場合は新しい配列を作成するか、
ArrayListを使います(Day 9で学びます)。
デフォルト値
int[] ints = new int[3]; // [0, 0, 0]
double[] doubles = new double[3]; // [0.0, 0.0, 0.0]
boolean[] bools = new boolean[3]; // [false, false, false]
String[] strs = new String[3]; // [null, null, null]
| 型 | デフォルト値 |
|---|---|
int, long |
0 |
double, float |
0.0 |
boolean |
false |
| 参照型 | null |
多次元配列
// 2次元配列
int[][] matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// アクセス
matrix[0][0] // 1
matrix[1][2] // 6
matrix[2][1] // 8
// 全要素の出力
for (int[] row : matrix) {
for (int val : row) {
System.out.printf("%3d", val);
}
System.out.println();
}
ジャグ配列(不揃いな配列)
int[][] jagged = new int[3][];
jagged[0] = new int[]{1, 2};
jagged[1] = new int[]{3, 4, 5};
jagged[2] = new int[]{6};
Arrays クラス
java.util.Arrays には配列操作のユーティリティメソッドがあります。
import java.util.Arrays;
int[] numbers = {5, 3, 8, 1, 9, 2};
// ソート
Arrays.sort(numbers);
System.out.println(Arrays.toString(numbers));
// [1, 2, 3, 5, 8, 9]
// 検索(ソート済み配列で使用)
int index = Arrays.binarySearch(numbers, 5);
System.out.println(index); // 3
// コピー
int[] copy = Arrays.copyOf(numbers, numbers.length);
int[] partial = Arrays.copyOfRange(numbers, 1, 4);
// 埋める
int[] filled = new int[5];
Arrays.fill(filled, 7);
// [7, 7, 7, 7, 7]
// 比較
Arrays.equals(numbers, copy); // true
| メソッド | 説明 |
|---|---|
Arrays.sort() |
ソート |
Arrays.binarySearch() |
二分探索 |
Arrays.toString() |
文字列表現 |
Arrays.copyOf() |
コピー |
Arrays.fill() |
全要素を同じ値に |
Arrays.equals() |
比較 |
String の詳細
文字列の比較
String s1 = "Hello";
String s2 = "Hello";
String s3 = new String("Hello");
// == は参照の比較
s1 == s2 // true(文字列リテラルは共有される)
s1 == s3 // false(new で別オブジェクト)
// equals() は値の比較
s1.equals(s2) // true
s1.equals(s3) // true
// 大文字小文字を無視して比較
"Hello".equalsIgnoreCase("hello") // true
重要: 文字列の比較には必ず**
equals()**を使いましょう。==は参照の比較なので、期待した結果にならないことがあります。
主要メソッド
String s = "Hello, Java World!";
// 検索
s.indexOf("Java") // 7
s.lastIndexOf("l") // 15
s.contains("Java") // true
// 変換
s.toUpperCase() // "HELLO, JAVA WORLD!"
s.toLowerCase() // "hello, java world!"
s.trim() // 前後の空白除去
s.strip() // 前後の空白除去(Unicode対応、Java 11+)
// 抽出
s.substring(7, 11) // "Java"
s.charAt(0) // 'H'
// 置換
s.replace("Java", "CSS") // "Hello, CSS World!"
// 分割
String csv = "apple,banana,cherry";
String[] parts = csv.split(",");
// ["apple", "banana", "cherry"]
// 結合
String joined = String.join(" - ", parts);
// "apple - banana - cherry"
テキストブロック(Java 15+)
String json = """
{
"name": "太郎",
"age": 25,
"city": "東京"
}
""";
推奨: 複数行の文字列にはテキストブロック(
""")を使いましょう。
StringBuilder
Stringは不変なので、大量の文字列連結は非効率です。StringBuilderを使いましょう。
// ❌ 非効率(毎回新しいStringオブジェクトが生成される)
String result = "";
for (int i = 0; i < 1000; i++) {
result += i + ", ";
}
// ✅ 効率的
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
sb.append(i).append(", ");
}
String result = sb.toString();
主要メソッド
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World"); // "Hello World"
sb.insert(5, ","); // "Hello, World"
sb.delete(5, 6); // "Hello World"
sb.replace(6, 11, "Java"); // "Hello Java"
sb.reverse(); // "avaJ olleH"
sb.toString(); // Stringに変換
flowchart LR
subgraph Compare["String vs StringBuilder"]
Str["String<br>不変<br>連結のたびに新オブジェクト"]
SB["StringBuilder<br>可変<br>同じオブジェクトを変更"]
end
style Str fill:#ef4444,color:#fff
style SB fill:#22c55e,color:#fff
| クラス | 可変性 | スレッドセーフ | 用途 |
|---|---|---|---|
String |
不変 | はい | 通常使用 |
StringBuilder |
可変 | いいえ | 大量連結 |
StringBuffer |
可変 | はい | マルチスレッド |
実践: 文字列分析プログラム
import java.util.Arrays;
public class StringAnalyzer {
public static void main(String[] args) {
String text = "Java is a powerful programming language. Java is widely used.";
// 基本情報
System.out.println("=== 文字列分析 ===");
System.out.printf("文字数: %d%n", text.length());
System.out.printf("単語数: %d%n", text.split("\\s+").length);
// 文字の出現回数
char target = 'a';
long count = text.chars().filter(c -> c == target).count();
System.out.printf("'%c' の出現回数: %d%n", target, count);
// 単語リスト
String[] words = text.split("[\\s.]+");
Arrays.sort(words, String.CASE_INSENSITIVE_ORDER);
System.out.println("単語(ソート済み): " + Arrays.toString(words));
// 逆順文字列
String reversed = new StringBuilder(text).reverse().toString();
System.out.printf("逆順: %s%n", reversed.substring(0, 20) + "...");
}
}
まとめ
| 概念 | 説明 |
|---|---|
| 配列 | 固定サイズの同型データ集合 |
Arrays |
配列のユーティリティクラス |
String |
不変の文字列クラス |
equals() |
文字列の値比較(==は使わない) |
StringBuilder |
可変の文字列(大量連結に最適) |
| テキストブロック | 複数行文字列(Java 15+) |
重要ポイント
- 配列のインデックスは0から始まる
- 文字列比較は必ず**
equals()**を使う - 大量の文字列連結には**
StringBuilder**を使う - テキストブロックで複数行文字列を簡潔に書ける
練習問題
問題1: 基本
整数配列の最大値、最小値、平均値を求めるプログラムを作成してください。
問題2: 応用
文字列を受け取り、各文字の出現回数をカウントして表示するプログラムを作成してください。
チャレンジ問題
文字列が回文(前から読んでも後ろから読んでも同じ)かどうか判定するプログラムを作成してください。大文字小文字は区別せず、空白は無視するようにしましょう。
参考リンク
次回予告: Day 5では「メソッド」について学びます。コードを整理し、再利用可能にする方法をマスターしましょう。