Java:演算と文字列
1学習の目的
- 演算子を正しく使い、意図した計算ができるようになる。優先順位と剰余を理解する。
- 文字列を自在に操作できるようになる。文字列の比較に == を使ってはいけないという、Java最大の落とし穴を体験する。
2基礎解説
| やりたいこと | 書き方 | 結果の例 |
|---|---|---|
| 余りを求める | 17 % 5 | 2 |
| 1増やす | n++ | n が1増える |
| 文字列の比較 | a.equals(b) | == は使わない |
| 3桁区切り | String.format("%,d", n) | 128,000 |
- ⭐ 文字列の比較は必ず equals を使う。== は「同じ中身か」ではなく「同じ物体か」を調べるため、見た目が同じでも false になることがある——Javaで最も有名な落とし穴。
- % は割り算の余り。17 % 5 は 2。偶数判定(n % 2 == 0)や、一定間隔の処理でよく使う。
- 掛け算・割り算は足し算より先に計算される。2 + 3 * 4 は 14。順序を変えたいならカッコで囲む。
- n++ は「1増やす」の省略形。n += 10 なら10増やす。ループ処理(JV05)で多用する。
- 文字列は変更できない(イミュータブル)。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問)
出力2行。14 / 20
掛け算は足し算より先に計算される。
public class Main {
public static void main(String[] args) {
System.out.println(2 + 3 * 4);
System.out.println((2 + 3) * 4);
}
}掛け算・割り算が先、足し算・引き算が後。算数と同じ規則だが、複雑な式ではカッコを付けて明示するほうが安全。
A. a == b B. a.equals(b) C. a.same(b) D. a === b 選択★☆☆無料
解答 == B
== は「同じ物体か」を調べる。
B
== は参照(メモリ上の位置)を比較するため、中身が同じでも false になることがある。文字列の比較は必ず equals。
出力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 で偶数判定ができるなど、応用範囲が広い。
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 になっていた。
A. "abc" になる B. " abc " のまま C. 空になる D. エラー 選択★☆☆無料
解答 == B
文字列は変更できない(イミュータブル)。
B
trim は新しい文字列を返すだけで、元の s は変わらない。s = s.trim(); のように結果を受け取る必要がある。
出力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文字になる。
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桁区切りになる。金額を表示するときの定番の書式。
A. "Hel" B. "Hell" C. "ello" D. "H" 選択★★☆広告解放
解答 == A
0番目から3番目の「手前」まで。
A
終わりの位置は「含まない」。0・1・2番目の3文字が取り出されて "Hel" になる。
出力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で配列を詳しく扱う)。
出力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問)
出力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 を返す。文字列の比較で == を使ってはいけない理由がこれ。
出力 == 税込: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 のほうが桁を読み取りやすい。
出力 == 商品名:ノート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文字として数えられる。
出力 == 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なら偶数。この判定は、リストの縞模様や交互処理などで頻繁に使う。
出力 == ノート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仕上げ課題
データ(すべて文字列として与えられる)
・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", ...)。326400 と 326,400 では読みやすさがまったく違う。金額を人に見せるときは3桁区切りが原則だ。
次章では条件分岐を学ぶ。今回は三項演算子で二択を書いたが、if文なら3つ以上の分岐や複雑な条件も扱えるようになる。