1. ホーム
  2. java

[解決済み] Javaで文字列を比較するには?

2022-03-14 09:03:58

質問

私は、これまで == 演算子を使用して、すべての文字列を比較することができます。 しかし、私はバグに遭遇し、そのうちの1つを .equals() ということで、そのバグを修正しました。

== が悪いのか?どんな時に使うべきで、どんな時に使ってはいけないのでしょうか?何が違うのでしょうか?

どのように解決するのですか?

== は参照の等質性(同じオブジェクトであるかどうか)をテストします。

.equals() は、値の等質性をテストします(論理的に "等しいかどうか")。

Objects.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

あなたはほとんど <強い いつも を使いたい。 Objects.equals() . で レア という場面で 知る 相手にしているのは インターン 文字列を使用する場合、あなたは できる 使用 == .

から JLS 3.10.5. 文字列リテラル :

さらに、文字列リテラルは常に 同じ クラスのインスタンス String . これは、文字列リテラル、より一般的には、定数式の値である文字列 ( §15.28 ) - は、一意なインスタンスを共有するために、メソッドを使用して、"interned" されます。 String.intern .

同様の例は、以下のものにもあります。 JLS 3.10.5-1 .

その他考慮すべき方法

文字列.equalsIgnoreCase() 大文字と小文字を無視した値の等号を指定します。しかし、このメソッドはロケールに関連するさまざまなケースで予期せぬ結果をもたらす可能性があることに注意してください。 この質問 .

文字列.contentEquals() の内容を比較します。 String と、任意の CharSequence (Java 1.5以降で利用可能)。等価比較の前にStringBufferなどをStringに変換する手間が省けますが、Nullチェックはあなたに任されます。