Java / LESSON 03 / JV03

Java:演算と文字列

1学習の目的

2基礎解説

やりたいこと書き方結果の例
余りを求める17 % 52
1増やすn++n が1増える
文字列の比較a.equals(b)== は使わない
3桁区切りString.format("%,d", n)128,000
✅ 覚えるべき重要ポイント
  1. ⭐ 文字列の比較は必ず equals を使う== は「同じ中身か」ではなく「同じ物体か」を調べるため、見た目が同じでも false になることがある——Javaで最も有名な落とし穴
  2. % は割り算の余り17 % 5 は 2。偶数判定(n % 2 == 0)や、一定間隔の処理でよく使う。
  3. 掛け算・割り算は足し算より先に計算される2 + 3 * 4 は 14。順序を変えたいならカッコで囲む。
  4. n++ は「1増やす」の省略形n += 10 なら10増やす。ループ処理(JV05)で多用する。
  5. 文字列は変更できない(イミュータブル)s.trim() は元のsを変えず、新しい文字列を返す。結果を受け取らないと何も起きない。

現場使用例:入力値の前後の空白除去、金額の3桁区切り表示、CSVの分割、文字列の一致判定。

// ⭐ 文字列の比較(最重要)
String a = "abc";
String c = new String("abc");

System.out.println(a == c);        // false(別物と判定)
System.out.println(a.equals(c));   // true(中身は同じ)

// 演算子
System.out.println(2 + 3 * 4);     // 14(掛け算が先)
System.out.println((2 + 3) * 4);   // 20
System.out.println(17 % 5);        // 2(余り)

int n = 5;
n++;              // 6
n += 10;          // 16

// 文字列メソッド(元の文字列は変わらない)
String s = "  Hello Java  ";
s.trim();                    // 結果を使わないと意味がない
String t = s.trim();         // ← こう書く

t.length();                  // 10
t.toUpperCase();             // "HELLO JAVA"
t.replace("Java", "World");  // "Hello World"
t.substring(0, 5);           // "Hello"(0番目から5番目の手前まで)
t.contains("Java");          // true
t.indexOf("Java");           // 6(見つからなければ -1)

// 書式付き出力
System.out.printf("%,d円%n", 128000);        // 128,000円
String.format("%.2f", 3.14159);              // "3.14"

// 分割と結合
String[] parts = "A,B,C".split(",");         // ["A","B","C"]
String.join("-", parts);                     // "A-B-C"

3基本ドリル(10問)

JV03-D01 演算子の優先順位を確認せよ。2 + 3 * 4(2 + 3) * 4 の結果を2行で出力すること。 コーディング★☆☆無料
期待される結果

出力2行。14 / 20

ヒント

掛け算は足し算より先に計算される。

模範解答
public class Main {
    public static void main(String[] args) {
        System.out.println(2 + 3 * 4);
        System.out.println((2 + 3) * 4);
    }
}
解説

掛け算・割り算が先、足し算・引き算が後。算数と同じ規則だが、複雑な式ではカッコを付けて明示するほうが安全。

JV03-D02 文字列の中身が同じか比較するとき、正しいのはどれか。
A. a == b B. a.equals(b) C. a.same(b) D. a === b
選択★☆☆無料
期待される結果

解答 == B

ヒント

== は「同じ物体か」を調べる。

模範解答
B
解説

== は参照(メモリ上の位置)を比較するため、中身が同じでも false になることがある。文字列の比較は必ず equals

JV03-D03 17 ÷ 5商と余りをそれぞれ出力せよ(2行)。 コーディング★☆☆無料
期待される結果

出力2行。3 / 2

ヒント

商は / 、余りは % で求める。

模範解答
public class Main {
    public static void main(String[] args) {
        System.out.println(17 / 5);
        System.out.println(17 % 5);
    }
}
解説

% は余りを求める演算子n % 2 == 0 で偶数判定ができるなど、応用範囲が広い。

JV03-D04 文字列の中身を比較するコードを完成させよ。 穴埋め★☆☆無料
コード
public class Main {
    public static void main(String[] args) {
        String a = "abc";
        String b = new String("abc");

        System.out.println(a.____(b));
    }
}
期待される結果

出力 == true

ヒント

「等しい」を意味する6文字のメソッド。

模範解答
equals
解説

equals なら中身を比較する。もし == を使っていたら false になっていた。

JV03-D05 String s = " abc "; s.trim(); のあと、s はどうなるか。
A. "abc" になる B. " abc " のまま C. 空になる D. エラー
選択★☆☆無料
期待される結果

解答 == B

ヒント

文字列は変更できない(イミュータブル)。

模範解答
B
解説

trim は新しい文字列を返すだけで、元の s は変わらないs = s.trim(); のように結果を受け取る必要がある。

JV03-D06 文字列 " Hello Java "前後の空白を除いて、文字数と大文字版を出力せよ(2行)。 コーディング★★☆広告解放
期待される結果

出力2行。10 / HELLO JAVA

ヒント

trim() の結果を変数に入れてから length() と toUpperCase() を使う。

模範解答
public class Main {
    public static void main(String[] args) {
        String s = "  Hello Java  ";
        String t = s.trim();

        System.out.println(t.length());
        System.out.println(t.toUpperCase());
    }
}
解説

trim の結果を変数に入れるのが要点。入れ忘れると元の文字列のまま処理してしまい、空白を含んだ12文字になる。

JV03-D07 数値を3桁区切りで表示するコードを完成させよ。 穴埋め★★☆広告解放
コード
public class Main {
    public static void main(String[] args) {
        int price = 128000;

        System.out.println(String.format("%____d", price));
    }
}
期待される結果

出力 == 128,000

ヒント

3桁ごとの区切りを表す1文字の記号。

模範解答
,
解説

%,d で3桁区切りになる。金額を表示するときの定番の書式。

JV03-D08 "Hello".substring(0, 3) の結果はどれか。
A. "Hel" B. "Hell" C. "ello" D. "H"
選択★★☆広告解放
期待される結果

解答 == A

ヒント

0番目から3番目の「手前」まで。

模範解答
A
解説

終わりの位置は「含まない」。0・1・2番目の3文字が取り出されて "Hel" になる。

JV03-D09 文字列 "A,B,C"カンマで分割し、要素数と2番目の要素を出力せよ(2行)。 コーディング★★☆広告解放
期待される結果

出力2行。3 / B

ヒント

split(",") で配列に分割できる。2番目は添字1。

模範解答
public class Main {
    public static void main(String[] args) {
        String csv = "A,B,C";
        String[] parts = csv.split(",");

        System.out.println(parts.length);
        System.out.println(parts[1]);
    }
}
解説

添字は0から始まるので、2番目は parts[1]。CSVの読み込みなどで頻繁に使う(JV06で配列を詳しく扱う)。

JV03-D10 変数 n(初期値5)に対し、1増やす操作と10増やす操作を順に行い、それぞれの結果を出力せよ(2行)。 コーディング★★☆広告解放
期待される結果

出力2行。6 / 16

ヒント

n++ と n += 10 を使う。

模範解答
public class Main {
    public static void main(String[] args) {
        int n = 5;

        n++;
        System.out.println(n);

        n += 10;
        System.out.println(n);
    }
}
解説

n++n = n + 1 の省略形。ループのカウンタで多用するので、この書き方に慣れておく。

4実践シナリオ(5問)

JV03-S01 【== と equals の違い】new String("abc") を使い、==equals の結果が異なることを確認せよ(2行出力)。 コーディング★★☆広告解放
期待される結果

出力2行。false / true

ヒント

new String() で作ると、中身が同じでも別の物体になる。

模範解答
public class Main {
    public static void main(String[] args) {
        String a = "abc";
        String b = new String("abc");

        System.out.println(a == b);
        System.out.println(a.equals(b));
    }
}
解説

これがJava最大の落とし穴。見た目は同じ "abc" なのに == は false を返す。文字列の比較で == を使ってはいけない理由がこれ。

JV03-S02 【金額の整形】128000円を3桁区切りで「税込:140,800円」の形式で出力せよ(税率10%、四捨五入)。 コーディング★★☆広告解放
期待される結果

出力 == 税込:140,800円

ヒント

Math.round で四捨五入し、String.format("%,d", 値) で3桁区切りにする。

模範解答
public class Main {
    public static void main(String[] args) {
        int price = 128000;
        long taxed = Math.round(price * 1.1);

        System.out.println("税込:" + String.format("%,d", taxed) + "円");
    }
}
解説

金額表示には3桁区切りが必須140800 より 140,800 のほうが桁を読み取りやすい。

JV03-S03 【文字列の加工】" ノートPC " の前後の空白を除き、「商品名:ノートPC(4文字)」と出力せよ。 コーディング★★☆広告解放
期待される結果

出力 == 商品名:ノートPC(5文字)

ヒント

trim() してから length() を使う。文字数を実際に数えて確認すること。

模範解答
public class Main {
    public static void main(String[] args) {
        String raw = "  ノートPC  ";
        String name = raw.trim();

        System.out.println("商品名:" + name + "(" + name.length() + "文字)");
    }
}
解説

「ノートPC」は5文字(ノ・ー・ト・P・C)。日本語も英数字も1文字として数えられる。

JV03-S04 【偶数・奇数の判定】% を使って、17が偶数か奇数かを判定して出力せよ(「17は奇数です」の形式)。 コーディング★★★広告解放
期待される結果

出力 == 17は奇数です

ヒント

n % 2 == 0 なら偶数。三項演算子で切り替える。

模範解答
public class Main {
    public static void main(String[] args) {
        int n = 17;
        String type = (n % 2 == 0) ? "偶数" : "奇数";

        System.out.println(n + "は" + type + "です");
    }
}
解説

2で割った余りが0なら偶数。この判定は、リストの縞模様や交互処理などで頻繁に使う。

JV03-S05 【CSVの整形】"ノートPC,128000,5" を分割し、「ノートPC:128,000円(在庫5個)」と出力せよ(金額は3桁区切り)。 コーディング★★★広告解放
期待される結果

出力 == ノートPC:128,000円(在庫5個)

ヒント

split で分割し、価格は Integer.parseInt で数値にしてから String.format で整形する。

模範解答
public class Main {
    public static void main(String[] args) {
        String csv = "ノートPC,128000,5";
        String[] parts = csv.split(",");

        String name = parts[0];
        int price = Integer.parseInt(parts[1]);
        String stock = parts[2];

        System.out.println(name + ":" + String.format("%,d", price)
                + "円(在庫" + stock + "個)");
    }
}
解説

split の結果はすべて文字列。計算や整形に使うなら、必ず数値に変換する必要がある。

5仕上げ課題

JV03-FINAL 【会員判定つき注文計算】文字列操作と演算を組み合わせて、注文を処理せよ。

データ(すべて文字列として与えられる)
String data = " ノートPC , 128000 , 3 ";(前後と区切りに空白あり)
String memberType = "gold";

処理
data をカンマで分割し、各要素の空白を除く
② 価格と数量を数値に変換
③ 小計 = 価格 × 数量
memberType"gold" なら15%引き(equals で比較すること)、それ以外は0
⑤ 割引額は四捨五入
⑥ 合計 = 小計 - 割引額
⑦ 金額はすべて3桁区切りで表示

期待される出力(4行)
商品:ノートPC × 3
小計:384,000円
会員割引(gold):-57,600円
合計:326,400円
総合★★★広告解放
期待される結果

出力4行が完全一致

ヒント

split した各要素に trim() をかける。文字列の比較は equals を使う(== は使わない)。384000 × 0.15 = 57600。金額は String.format("%,d", 値) で整形する。

模範解答
public class Main {
    public static void main(String[] args) {
        String data = "  ノートPC , 128000 , 3  ";
        String memberType = "gold";

        String[] parts = data.split(",");

        String name = parts[0].trim();
        int price = Integer.parseInt(parts[1].trim());
        int qty = Integer.parseInt(parts[2].trim());

        int subtotal = price * qty;

        long discount = memberType.equals("gold")
                ? Math.round(subtotal * 0.15)
                : 0;

        long total = subtotal - discount;

        System.out.println("商品:" + name + " × " + qty);
        System.out.println("小計:" + String.format("%,d", subtotal) + "円");
        System.out.println("会員割引(" + memberType + "):-"
                + String.format("%,d", discount) + "円");
        System.out.println("合計:" + String.format("%,d", total) + "円");
    }
}
解説

この課題には、実務でそのまま出てくる処理が3つ詰まっている。

第一に trim() だ。split(",") で分割しただけでは " 128000 " のように空白が残る。そのまま Integer.parseInt に渡すと例外で落ちる——CSVやフォームのデータを扱うとき、必ず遭遇する問題だ。

第二に memberType.equals("gold")。ここで == を使ったらどうなるか。この例では偶然動いてしまう可能性がある——Javaは同じ文字列リテラルを共有する仕組みを持つためだ。しかしファイルやデータベースから読み込んだ文字列では確実に false になる。「テストでは動いたのに本番で動かない」という最悪の形で表面化する。だから最初から equals を使う

第三に String.format("%,d", ...)326400326,400 では読みやすさがまったく違う。金額を人に見せるときは3桁区切りが原則だ。

次章では条件分岐を学ぶ。今回は三項演算子で二択を書いたが、if文なら3つ以上の分岐や複雑な条件も扱えるようになる。