
問題
次のコードをコンパイル、実行するとどうなりますか。
public class Main {
public static void main(String... args) {
String s = "Java";
String t = new String("Java");
Item a = new Item(17);
Item b = new Item(17);
if (s == t) System.out.print("s == t, ");
else System.out.print("s != t, ");
if (s.equals(t)) System.out.print("s.equals(t), ");
else System.out.print("!s.equals(t), ");
if (a == b) System.out.print("a == b, ");
else System.out.print("a != b, ");
if (a.equals(b)) System.out.print("a.equals(b), ");
else System.out.print("!a.equals(b), ");
}
}
class Item {
int id;
Item(int id) {
this.id = id;
}
}
選択肢
A)s == t, s.equals(t), a == b, a.equals(b), が出力される
B)s != t, s.equals(t), a != b, a.equals(b), が出力される
C)s == t, !s.equals(t), a != b, a.equals(b), が出力される
D)s != t, s.equals(t), a != b, !a.equals(b), が出力される
E)s == t, !s.equals(t), a == b, a.equals(b), が出力される
F)s != t, !s.equals(t), a != b, !a.equals(b), が出力される
G)s == t, s.equals(t), a != b, !a.equals(b), が出力される
解答
A)s == t, s.equals(t), a == b, a.equals(b), が出力される
B)s != t, s.equals(t), a != b, a.equals(b), が出力される
C)s == t, !s.equals(t), a != b, a.equals(b), が出力される
D)s != t, s.equals(t), a != b, !a.equals(b), が出力される
E)s == t, !s.equals(t), a == b, a.equals(b), が出力される
F)s != t, !s.equals(t), a != b, !a.equals(b), が出力される
G)s == t, s.equals(t), a != b, !a.equals(b), が出力される
解説
このコードの動作を分析して、出力される結果を考えましょう。
- String s と t の比較:
String s = "Java";では、文字列リテラルを使ってsを定義しています。String t = new String("Java");では、新しいStringオブジェクトを作成しています。s == tはオブジェクトの参照を比較しますが、sとtは異なるオブジェクトを参照しているため、この比較はfalseとなります。s.equals(t)は文字列の内容を比較しますが、sとtは同じ文字列 “Java” であるため、この比較はtrueとなります。
- Item a と b の比較:
Item a = new Item(17);とItem b = new Item(17);では、それぞれ異なるItemオブジェクトを作成しています。a == bは参照の比較ですが、aとbは異なるオブジェクトを参照しているため、この比較はfalseとなります。a.equals(b)はデフォルトではObjectクラスのequalsメソッドを呼び出し、オブジェクトの参照を比較します。したがって、この比較もfalseになります。
まとめ:
s == t→falses.equals(t)→truea == b→falsea.equals(b)→false
したがって、出力は次のようになります
s != t, s.equals(t), a != b, !a.equals(b),
対象資格:Java SE17 認定資格
