2 を比較する必要がありStrings
ます。私が考えることができる次の方法があります:
equalsIgnoreCase
- これが最速だと聞きましたが、文字列が大文字と小文字を区別するため使用できませんmatches
- おそらく最も遅いものequals
compareTo
したがって、上記のオプションでは、 と が残りequals
ますcompareTo
。この中でどちらが速いですか?
注:文字列の入力数は膨大です [1 秒あたり約 5000]。
と の非常に重要な違いに注意してcompareTo
くださいequals
。
"myString".compareTo(null); //Throws java.lang.NullPointerException
"myString".equals(null); //Returns false
ここで、両方の方法のソース コードを確認して、いくつかの計算を伴う方法equals
よりも好ましい方法であると結論付けることをお勧めします。compareTo
Math
equals
また、それが最初になることに注意してください==
!これは、オブジェクトが同一である場合に大きな利点となる可能性があります。特に、大量の文字列があると述べた場合、Java は文字列をインターンするため、これは予想以上に発生する可能性があります。
あなたは文字列について尋ねましたが、私はこのメモを追加したいと思い
ますBigDecimal
. たとえば、次のドキュメントを参照してください。
equals は、この BigDecimal と指定された Object が等しいかどうかを比較します。 compareTo とは異なり、このメソッドは、2 つの BigDecimal オブジェクトが値とスケールが等しい場合にのみ等しいと見なします (したがって、このメソッドで比較した場合、2.0 は 2.00 と等しくありません)。
equals と compareTo が残っています。
どちらも異なる目的で機能します。
CompareTo
引数文字列がこの文字列と等しい場合は値 0。この文字列が文字列引数より辞書的に小さい場合は 0 より小さい値。この文字列が文字列引数よりも辞書的に大きい場合は、0 より大きい値。
一方
equals
指定されたオブジェクトがこの文字列と同等の文字列を表す場合は true、そうでない場合は false
したがってcompareTo()
、より多くの計算が必要ですequals()
その証拠は、両方のソース コードで確認できます。
equals() ----- これを使用することを好みます。
equalsIgnoreCase
通常、これは文字列の比較に使用します。
マッチ
RegEx ベースであるため遅い。
等しい
私はこれがより遅いとは思わないequalsIgnoreCase
比較する
これは整数または 0 を返します。これは、たとえば並べ替えで使用されます。平等に使わないでください。
主な違いは次の 2 つです。
equals will take any Object as a parameter, but compareTo will only take Strings.
equals only tells you whether they're equal or not, but compareTo gives information on how the Strings compare lexicographically.
そして、これはクラスコードの URL http://www.docjar.com/html/api/java/lang/String.java.htmlです。Java Strings: compareTo() vs. equals() が必要な場合は、この投稿も参照してください 。
自分でコードの時間を計って、どちらが速いかを確認できます。
final long start = System.currentTimeMillis();
for (int i = 0; i < input.length; i++) {
// Do comparison here
}
final long end = System.currentTimeMillis();
System.out.println("Time to execute: " + (end - start));
s1.CompareTo(s2)
0 - 両方が等しい
+ve - s2 よりも辞書的に s1 よりも低い
-ve - s2 より辞書式に s1 より高い
s1.equals(Object o1)
true - s1 と o1 が等しい場合
false - s1 と o1 が等しくない場合
compareTo
スローできますClassCastException
がequals
、s1 と o1 が異なるクラスの場合は false を返す必要があります。
TreeMap
に依存しますが compareTo()
、にHashMap
依存し equals()
ます。したがって、 equals と compareTo が一貫していない場合、動作が異なる可能性がTreeMap
あります。HashMap
したがって、equals() と compareTo() を互いに一貫させることは良いことですが、必須ではありません。
literals
文字列を比較する最良または効率的な方法は、比較を参照することだと思います(ただし、コード全体で使用する必要がありました)。文字列は本質的に不変であり、String クラスはメソッドまたはコンパイラによって内部にFlyWeightパターンを実装しているためです。intern()
ですので参考に比較してみると良いと思います。
コード内のリテラルに自信がない場合は、最適化を行うことができます。
s1.hashCode() == s2.hashCode() && s1.equals(s2)
これは、文字列が不変であるためです。
equalsIgnoreCase - これが最速だと聞いた
絶対にありません。小文字を大文字に、またはその逆に変換する必要があります。評判の良いところでそれを「聞いた」ことはできません。
一致 - おそらく最も遅いもの
同意した。
等しい
これらの違いを期待する理由はありません。