6

2 を比較する必要がありStringsます。私が考えることができる次の方法があります:

  1. equalsIgnoreCase- これが最速だと聞きましたが、文字列が大文字と小文字を区別するため使用できません
  2. matches- おそらく最も遅いもの
  3. equals
  4. compareTo

したがって、上記のオプションでは、 と が残りequalsますcompareTo。この中でどちらが速いですか?

注:文字列の入力数は膨大です [1 秒あたり約 5000]。

4

8 に答える 8

13

と の非常に重要な違いに注意してcompareToくださいequals

"myString".compareTo(null);  //Throws java.lang.NullPointerException
"myString".equals(null);     //Returns false

ここで、両方の方法のソース コードを確認して、いくつかの計算を伴う方法equalsよりも好ましい方法であると結論付けることをお勧めします。compareToMath

equalsまた、それが最初になることに注意してください==!これは、オブジェクトが同一である場合に大きな利点となる可能性があります。特に、大量の文字列があると述べた場合、Java は文字列をインターンするため、これは予想以上に発生する可能性があります。


あなたは文字列について尋ねましたが、私はこのメモを追加したいと思い
ますBigDecimal. たとえば、次のドキュメントを参照してください。

equals は、この BigDecimal と指定された Object が等しいかどうかを比較します。 compareTo とは異なり、このメソッドは、2 つの BigDecimal オブジェクトが値とスケールが等しい場合にのみ等しいと見なします (したがって、このメソッドで比較した場合、2.0 は 2.00 と等しくありません)。

于 2013-10-21T06:41:53.227 に答える
6

equals と compareTo が残っています。

どちらも異なる目的で機能します。

CompareTo

引数文字列がこの文字列と等しい場合は値 0。この文字列が文字列引数より辞書的に小さい場合は 0 より小さい値。この文字列が文字列引数よりも辞書的に大きい場合は、0 より大きい値。

一方

equals

指定されたオブジェクトがこの文字列と同等の文字列を表す場合は true、そうでない場合は false

したがってcompareTo()、より多くの計算が必要ですequals()

その証拠は、両方のソース コードで確認できます。

比較する()

equals() ----- これを使用することを好みます。

于 2013-10-21T06:40:56.033 に答える
2

equalsIgnoreCase

通常、これは文字列の比較に使用します。

マッチ

RegEx ベースであるため遅い。

等しい

私はこれがより遅いとは思わないequalsIgnoreCase

比較する

これは整数または 0 を返します。これは、たとえば並べ替えで使用されます。平等に使わないでください。

于 2013-10-21T06:43:48.340 に答える
1

主な違いは次の 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() が必要な場合は、この投稿も参照してください 。

于 2013-10-21T06:44:34.137 に答える
0

自分でコードの時間を計って、どちらが速いかを確認できます。

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));
于 2013-10-21T06:43:16.860 に答える
0

s1.CompareTo(s2)

0 - 両方が等しい

+ve - s2 よりも辞書的に s1 よりも低い

-ve - s2 より辞書式に s1 より高い

s1.equals(Object o1)

true - s1 と o1 が等しい場合

false - s1 と o1 が等しくない場合

compareToスローできますClassCastExceptionequals、s1 と o1 が異なるクラスの場合は false を返す必要があります。


TreeMapに依存しますが compareTo()、にHashMap依存し equals()ます。したがって、 equals と compareTo が一貫していない場合、動作が異なる可能性がTreeMapあります。HashMapしたがって、equals() と compareTo() を互いに一貫させることは良いことですが、必須ではありません。


literals文字列を比較する最良または効率的な方法は、比較を参照することだと思います(ただし、コード全体で使用する必要がありました)。文字列は本質的に不変であり、String クラスはメソッドまたはコンパイラによって内部にFlyWeightパターンを実装しているためです。intern()ですので参考に比較してみると良いと思います。

コード内のリテラルに自信がない場合は、最適化を行うことができます。

s1.hashCode() == s2.hashCode() && s1.equals(s2)

これは、文字列が不変であるためです。

于 2013-10-21T06:50:07.940 に答える
0

equalsIgnoreCase - これが最速だと聞いた

絶対にありません。小文字を大文字に、またはその逆に変換する必要があります。評判の良いところでそれを「聞いた」ことはできません。

一致 - おそらく最も遅いもの

同意した。

等しい

これらの違いを期待する理由はありません。

于 2013-10-21T08:48:28.190 に答える