Kodrill

Javaの基本データ型と文字列の操作

Java SE 17 Silver (1Z0-825-JPN) 試験

変数の宣言・初期化とスコープ/var/文字列とテキスト・ブロック/一次元・二次元配列/ArrayList

問題数
20 問
合格ライン
65%
実行して確認済み
17 問
この分野の要点を読む7 章・約 16 分。実行して確かめたコード例と、試験でよくある引っかけをまとめています

ログインなしで試す

無料の 5 問を、1問ごとに正誤と解説を見ながら解けます。解答は保存されません。

5 問を試す

無料登録して学習を記録する

学習履歴・ダッシュボード・ブックマーク・模試モードが使えます。

★ 残り 15 問はプレミアム会員限定です

無料プランでは先頭 5 問まで解けます。プレミアムなら全問題・苦手問題の復習・広告非表示が使えます。
料金プランを見る

問題と解説を見る (無料)

登録しなくても、次の5問は問題文と解説をそのまま読めます。

Javaの基本データ型と文字列の操作の要点

内容の確認日: 2026-10-04

この分野は範囲が広く、変数・var・文字列・テキスト・ブロック・配列・ArrayList と、Java で値を扱う道具がひととおり問われます。特に String のメソッドの戻り値と、var やテキスト・ブロックのような Java SE 10 以降の新しい書き方は、細かいルールまで出題されます。

出題項目は「変数の宣言および初期化と変数のスコープ」「ローカル変数型推論 (var)」「文字列の作成と操作 (テキスト・ブロックを含む)」「配列 (一次元配列、二次元配列) の宣言、インスタンス化、初期化および使用」「ArrayList の使用」の 5 つです。

変数の初期化と型の変換

int から byte のように範囲の狭い型へ代入するには、通常はキャストが必要です。ただし、コンパイル時に値が決まる定数 (final を付けてリテラルで初期化した変数など) で、値が代入先の範囲に収まる場合は、キャストなしで代入できます。final がない変数は、値が収まっていてもコンパイルエラーです。

Main.java
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 を代入するとコンパイルエラーです。

Main.java
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; のように変数名としては使えますが、クラス名には使えません。

Main.java
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 などのメソッドは、元の文字列を変えずに新しい文字列を返します。戻り値を受け取らないと、何も変わっていないように見えます。

Main.java
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() は、プールにある同じ内容のオブジェクトを返します。

Main.java
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 などは自分自身を返すので、続けて呼び出せます。

Main.java
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 と書く

Main.java
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() は、同じ内容の新しい配列を作ります。コピー先を変更しても元の配列は変わりません (ただし要素が参照型の場合、要素のオブジェクト自体は共有されます)。

Main.java
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 の要素が消えます。

Main.java
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)) と書きます。

問題で確認する

この分野の問題を、解説つきで読めます (登録不要)。

出典・参考

コード例は、試験の対象バージョンで実際にコンパイル・実行して結果を確認しています。