問題
次のコードをコンパイル、実行するとどうなりますか。
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
→false
s.equals(t)
→true
a == b
→false
a.equals(b)
→false
したがって、出力は次のようになります
s != t, s.equals(t), a != b, !a.equals(b),
対象資格:Java SE17 認定資格