StringクラスとStringBuilderクラスの文字列比較まとめ

まとめきれてないかもしれんがメモ。

String str1 = "Hello";
String str2 = new String("Hello");
StringBuilder sb1 = new StringBuilder("Hello");
StringBuilder sb2 = new StringBuilder("Hello");

// Stringクラス及びStringBuilderクラスでは
// オブジェクトが保持する文字列を返すという内容でtoStringメソッドが既に実装されている
System.out.println(str1);// Hello
System.out.println(str2);// Hello
System.out.println(sb1);// Hello

System.out.println(str1 == str2);// false…参照値が違う

System.out.println(str1.equals(str2));// true
// Stringクラスではequalsメソッドが既にオーバーライドされており
// 文字列シーケンスが同じならtrueが返る
// よって比較するオブジェクトが両方ともString型の場合のみ、
// 参照値が違っても文字列シーケンスが同じならtrueが返る

//System.out.println(str1 == sb1);// 非互換オペランドでコンパイルエラー

System.out.println(str1 == sb1.toString());// false…参照値が違う

System.out.println(str1.equals(sb1));// false
// ↑引数がStringBuilder型なので文字列シーケンスが同じでもfalseが返る

System.out.println(str1.equals(sb1.toString()));// true
// StringBuilderクラスのオブジェクトが保持している文字列を
// toStringメソッドで一旦Stringオブジェクトとして取り出して比較しているのでtrueが返る

System.out.println(sb1 == sb2);// false…参照値が違う

System.out.println(sb1.equals(sb2));// false
// StringBuilderクラスではequalsメソッドがオーバーライドされておらず
// オブジェクト参照値を比較するため、falseが返る
		
System.out.println(sb1.toString().equals(sb2.toString()));// true
// 前述の通り、StringBuilderクラスのオブジェクトでも一旦toStringメソッドで
// 文字列として比較すればtrueが返る

インスタンスが保持する文字列を比較したいならequalsメソッドを使ってればよくて、StringBuilderクラスならtoStringメソッドで一旦文字列にしないと期待した結果を得られないよという話。
ただ、試験ではひっかけ問題が多い。本来equals()で処理するコードを"=="で書いてて「さあ結果はどうなりますか」っていう嫌がらせを頻繁にしてくるので、取り敢えずまとめてみた。