Javaの基本データ型と文字列の操作の要点
内容の確認日: 2026-10-04
この分野は範囲が広く、変数・var・文字列・テキスト・ブロック・配列・ArrayList と、Java で値を扱う道具がひととおり問われます。特に String のメソッドの戻り値と、var やテキスト・ブロックのような Java SE 10 以降の新しい書き方は、細かいルールまで出題されます。
出題項目は「変数の宣言および初期化と変数のスコープ」「ローカル変数型推論 (var)」「文字列の作成と操作 (テキスト・ブロックを含む)」「配列 (一次元配列、二次元配列) の宣言、インスタンス化、初期化および使用」「ArrayList の使用」の 5 つです。
変数の初期化と型の変換
int から byte のように範囲の狭い型へ代入するには、通常はキャストが必要です。ただし、コンパイル時に値が決まる定数 (final を付けてリテラルで初期化した変数など) で、値が代入先の範囲に収まる場合は、キャストなしで代入できます。final がない変数は、値が収まっていてもコンパイルエラーです。
public class Main { public static void main(String[] args) { final int small = 100; byte b1 = small; int big = 100; byte b2 = big; System.out.println(b1 + b2); }}javac Main.java
コンパイルエラー (6 行目): big は final でないため、値が 100 でも int から byte へキャストなしで代入できない
数値リテラルの _ は、数字と数字の間にだけ書けます。0x1F_FF のように 16 進数の桁の間にも書けますが、先頭・末尾・小数点や L の隣には書けません。
ローカル変数のスコープ (有効範囲) は、宣言したブロックの終わりまでです。スコープが重なる範囲で同じ名前のローカル変数を宣言するとコンパイルエラーですが、並んだ別々のブロックや、終わった for 文の後であれば、同じ名前を使い直せます。
ローカル変数型推論 (var)
Java SE 10 からは、ローカル変数を var で宣言すると、右辺の値から型が決まります。決まった型は後から変わらないので、var count = 10; (int) に 2.5 を代入するとコンパイルエラーです。
public class Main { public static void main(String[] args) { var count = 10; count = 2.5; System.out.println(count); }}javac Main.java
コンパイルエラー (4 行目): count の型は 10 から int に決まっているので、double の値は代入できない
var には次の制限があります。
・使えるのはローカル変数だけ (for 文・拡張 for 文の変数、try-with-resources のリソースも可)。フィールド・メソッドの引数・戻り値の型には使えない
・必ず初期化と同時に宣言する (var x; は不可)
・null だけでは型が決まらないので var x = null; は不可
・配列の初期化子だけの var a = {1, 2}; は不可 (var a = new int[]{1, 2}; は可)
・var a = 1, b = 2; のように 1 行で複数の変数は宣言できない
var は予約語ではなく「予約された型名」です。そのため var var = 1; のように変数名としては使えますが、クラス名には使えません。
import java.util.ArrayList;public class Main { public static void main(String[] args) { var a = 10; var b = a / 4 + 0.5; var list = new ArrayList<String>(); list.add("x"); System.out.println(b); System.out.println(list); }}java Main 2.5 [x]
a / 4 は int 同士の割り算なので 2 になり、それに 0.5 を足した b は double 型の 2.5 です。
String の操作と不変性
String は不変 (イミュータブル) で、一度作った文字列の中身は変わりません。trim・toUpperCase・replace・concat などのメソッドは、元の文字列を変えずに新しい文字列を返します。戻り値を受け取らないと、何も変わっていないように見えます。
public class Main { public static void main(String[] args) { String s = " Java Silver "; s.trim(); System.out.println("[" + s + "]"); String t = s.strip().toUpperCase(); System.out.println(t); System.out.println(t.substring(5, 8)); System.out.println(t.indexOf('V')); System.out.println(" ".isEmpty() + " " + " ".isBlank()); }}java Main [ Java Silver ] JAVA SILVER SIL 2 false true
substring(開始, 終了) は、開始の位置から終了の 1 つ手前までを返します。位置は 0 から数えます。indexOf は最初に見つかった位置を返し、見つからなければ -1 です。isEmpty は長さが 0 のときだけ true、isBlank (Java SE 11 から) は空白だけの文字列でも true になります。strip も Java SE 11 からのメソッドで、trim と同じく前後の空白を取り除きます。
同じ内容の文字列リテラルは、文字列プールの同じオブジェクトが共有されます。"Ja" + "va" のようにリテラル同士の連結はコンパイル時に計算されるので、これもプールのオブジェクトになります。一方、new String(...) や、変数を含む連結は実行時に新しいオブジェクトを作ります。intern() は、プールにある同じ内容のオブジェクトを返します。
public class Main { public static void main(String[] args) { String a = "Java"; String b = "Ja" + "va"; String c = new String("Java"); String part = "Ja"; String d = part + "va"; System.out.println(a == b); System.out.println(a == c); System.out.println(a == d); System.out.println(a == d.intern()); }}java Main true false false true
中身を何度も変更するときは、変更可能な StringBuilder を使います。append・insert・reverse などは自分自身を返すので、続けて呼び出せます。
public class Main { public static void main(String[] args) { StringBuilder sb = new StringBuilder("abc"); sb.append("de").insert(0, "X").reverse(); System.out.println(sb); System.out.println(sb.length()); }}java Main edcbaX 6
テキスト・ブロック
Java SE 15 からは、""" で囲んだテキスト・ブロックで、複数行の文字列をそのまま書けます。主なルールは次のとおりです。
・開始の """ の後ろは改行しなければならない (同じ行に文字を書くとコンパイルエラー)
・各行と終了の """ のうち、一番浅いインデントを基準に、共通の字下げが取り除かれる
・終了の """ を独立した行に書くと、最後の行の後ろに改行が付く
・行末に \ を書くと、その改行は文字列に含まれない (次の行とつながる)
・行末の空白は取り除かれる。残したいときは \s と書く
public class Main { public static void main(String[] args) { String text = """ Hello, Java 17 """; System.out.print(text); String oneLine = """ Java \ Silver"""; System.out.println("[" + oneLine + "]"); }}java Main Hello, Java 17 [Java Silver]
1 つ目のテキスト・ブロックは、終了の """ の位置が基準になるので、Hello, は字下げなし、Java 17 は 2 文字の字下げが残ります。また最後に改行が付くので、print でも改行されます。2 つ目は、行末の \ で改行がなくなり、終了の """ を文字の直後に書いているので、末尾の改行もありません。
一次元配列と二次元配列
二次元配列は「配列の配列」です。new int[3][] のように 1 次元目の要素数だけを指定すると、各要素 (2 次元目の配列への参照) は null のままです。2 次元目は後から、行ごとに違う長さで作れます。逆に、new int[][3] のように 1 次元目を省略して 2 次元目だけ指定することはできません。
配列の clone() は、同じ内容の新しい配列を作ります。コピー先を変更しても元の配列は変わりません (ただし要素が参照型の場合、要素のオブジェクト自体は共有されます)。
public class Main { public static void main(String[] args) { int[][] grid = new int[2][]; System.out.println(grid[0]); grid[0] = new int[]{1, 2, 3}; grid[1] = new int[]{4}; for (int[] row : grid) { System.out.println(row.length + ": " + row[row.length - 1]); } int[] copy = grid[0].clone(); copy[0] = 99; System.out.println(grid[0][0] + " " + copy[0]); }}java Main null 3: 3 1: 4 1 99
宣言の [] は型の後ろにも変数名の後ろにも書けるので、int[] a[] は二次元配列の宣言になります。紛らわしい書き方ですが、試験では読めるようにしておきましょう。
ArrayList の使用
ArrayList は、要素数が自動で増減するリストです。List<Integer> nums = new ArrayList<>(); のように、型パラメータで要素の型を指定します。プリミティブ型は指定できないので、int の代わりに Integer を使います (int との変換は自動で行われます)。
主なメソッドは、add(要素) (末尾に追加)・add(位置, 要素) (挿入)・set(位置, 要素) (置き換え)・get(位置)・remove・size()・contains(要素) です。特に注意したいのが remove で、remove(int) は位置を指定して削除、remove(Object) は要素そのものを指定して削除します。List<Integer> で remove(1) と書くと、値 1 ではなく位置 1 の要素が消えます。
import java.util.ArrayList;import java.util.List;public class Main { public static void main(String[] args) { List<Integer> nums = new ArrayList<>(); nums.add(10); nums.add(20); nums.add(30); nums.add(1, 15); nums.remove(2); nums.remove(Integer.valueOf(10)); nums.set(0, 5); System.out.println(nums + " " + nums.size()); }}java Main [5, 30] 2
[10, 20, 30] → add(1, 15) で [10, 15, 20, 30] → remove(2) で位置 2 の 20 を削除 → remove(Integer.valueOf(10)) で値 10 を削除 → set(0, 5) で先頭を置き換え、という流れです。
試験でよくある引っかけ
finalのない変数の縮小代入final intの定数ならキャストなしでbyteに代入できますが、finalのないint変数はコンパイルエラーです。varで宣言できない場所varはローカル変数だけです。フィールド・引数、初期化のない宣言、nullや{1, 2}だけの初期化には使えません。Stringのメソッドの戻り値s.trim();だけではsは変わりません。s = s.trim();のように戻り値を受け取ります。substringの終了位置substring(2, 5)は位置 2・3・4 の 3 文字です。終了の位置の文字は含まれません。テキスト・ブロックの開始
"""の直後に文字を書くとコンパイルエラーです。開始の"""の後ろは改行します。List<Integer>のremove(1)remove(1)は位置 1 の要素を削除します。値 1 を削除するにはremove(Integer.valueOf(1))と書きます。
問題で確認する
この分野の問題を、解説つきで読めます (登録不要)。
出典・参考
- Oracle University 日本「Java SE 17 Programmer I (1Z0-825-JPN) 試験」
- JEP 286: Local-Variable Type Inference
- JEP 378: Text Blocks
- Java SE 17 API ドキュメント「String」
コード例は、試験の対象バージョンで実際にコンパイル・実行して結果を確認しています。