これまで、プログラム内ですべての文字列を比較するために演算子を使用していました==
。しかし、バグに遭遇したため、.equals()
代わりに 1 つを に変更したところ、バグが修正されました。
悪いですか==
? いつ使用すべきで、いつ使用すべきでないのですか? 違いは何ですか?
ベストアンサー1
==
参照の等価性(同じオブジェクトであるかどうか)をテストします。
.equals()
値の等価性(同じデータが含まれているかどうか)をテストします。
オブジェクト.equals()null
を呼び出す前にチェックする.equals()
ので、チェックする必要はありません(JDK7以降で利用可能、グアバ)。
したがって、2 つの文字列が同じ値を持つかどうかをテストする場合は、 を使用する必要があるでしょうObjects.equals()
。
// These two have the same value
new String("test").equals("test") // --> true
// ... but they are not the same object
new String("test") == "test" // --> false
// ... neither are these
new String("test") == new String("test") // --> false
// ... but these are because literals are interned by
// the compiler and thus refer to the same object
"test" == "test" // --> true
// ... string literals are concatenated by the compiler
// and the results are interned.
"test" == "te" + "st" // --> true
// ... but you should really just call Objects.equals()
Objects.equals("test", new String("test")) // --> true
Objects.equals(null, "test") // --> false
Objects.equals(null, null) // --> true
Java言語仕様よりJLS 15.21.3. 参照等価演算子==
と!=
:
==
は型の参照を比較するために使用できますがString
、このような等価性テストは、2つのオペランドが同じString
オブジェクトを参照しているかどうかを判断します。結果は、false
オペランドString
が同じ文字列(§3.10.5、§3.10.6)。2 つの文字列との内容はs
、t
メソッド呼び出しによって等しいかどうかテストできますs.equals(t)
。
ほとんどの場合、を使用しますObjects.equals()
。まれに、抑留された文字列の場合は、を使用できます==
。
さらに、文字列リテラルは常にクラスの同じ
String
インスタンスを参照します。これは、文字列リテラル、またはより一般的には定数式の値である文字列(§15.28) - メソッドを使用して、一意のインスタンスを共有するように「インターン化」されますString.intern
。
同様の例は、JLS3.10.5-1 翻訳。
検討すべき他の方法
文字列.equalsIgnoreCase()大文字と小文字を区別しない値の等価性。ただし、この方法はロケール関連のさまざまなケースで予期しない結果をもたらす可能性があるので注意してください。この質問。
文字列.contentEquals()の内容をString
any の内容と比較しますCharSequence
(Java 1.5 以降で使用可能)。等価比較を行う前に StringBuffer などを String に変換する必要がなくなりますが、null チェックはユーザーが行うことになります。