字符串与equals和compareTo比较 - 哪个更快?

时间:2013-10-21 06:37:49

标签: java string

我需要比较2 Strings。我有以下方法可以想到:

  1. equalsIgnoreCase - 听说这是最快的,但由于我的字符串区分大小写,我无法使用它
  2. matches - 可能是最慢的
  3. equals
  4. compareTo
  5. 因此,在上面的选项中,我留下了equalscompareTo。其中哪一个更快?

    注意:字符串的输入数量很大[每秒5000左右]。

8 个答案:

答案 0 :(得分:12)

请注意compareToequals之间非常重要的区别:

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

现在,我建议您查看两种方法的source code,得出结论equals优于compareTo,但涉及Math次计算。

另请注意,equals首先生成==!当对象相同时,这可能是一个很大的优势。特别是当你提到你有大量的字符串时,因为Java实习生字符串,这可能比你想象的要多。


虽然你问过Strings,但我想补充一下这个说明:
涉及BigDecimal时,这些方法可能会有很大不同。例如,请参阅docs

  

equals 将此BigDecimal与指定的Object进行比较以获得相等性。   与compareTo 不同,此方法认为两个BigDecimal对象相等   只有它们的价值和规模相等(因此2.0不等于   2.00用这种方法比较时。)

答案 1 :(得分:6)

  

我留下了等于和比较。

两者都有不同的用途。

CompareTo
  

如果参数字符串等于此字符串,则值为0;如果此字符串按字典顺序小于字符串参数,则小于0的值;如果此字符串按字典顺序大于字符串参数,则值大于0.

在哪里

equals
  

如果给定对象表示与此字符串等效的String,则为true,否则为

因此compareTo()需要更多equals()

的计算

您可以在两者的源代码中看到相关证明。

compareTo()

equals() -----更喜欢使用它。

答案 2 :(得分:1)

  

equalsIgnoreCase

您通常使用此字符串进行字符串比较。

  

匹配

慢,因为它是基于RegEx的。

  

等于

我认为这不比equalsIgnoreCase

  

的compareTo

返回一个整数,或0.例如,这用于排序。不要将它用于平等。

答案 3 :(得分:1)

两个主要区别是:

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.

这是类代码网址http://www.docjar.com/html/api/java/lang/String.java.html。 如果你想,你也可以看看这篇文章 Java Strings: compareTo() vs. equals()

答案 4 :(得分:1)

等于 -

1-重写GetHashCode方法以允许类型在哈希表中正常工作。

2-不要在Equals方法的实现中抛出异常。相反,为null参数返回false。

3 -

 x.Equals(x) returns true.

 x.Equals(y) returns the same value as y.Equals(x).

 (x.Equals(y) && y.Equals(z)) returns true if and only if x.Equals(z) returns true.

只要x和y引用的对象未被修改,x.Equals(y)的连续调用就会返回相同的值。

 x.Equals(null) returns false.

4-对于某些类型的对象,最好使用Equals测试值相等而不是引用相等。如果两个对象具有相同的值,则Equals的此类实现将返回true,即使它们不是同一个实例。

例如 -

  Object obj1 = new Object();
  Object obj2 = new Object();
  Console.WriteLine(obj1.Equals(obj2));
  obj1 = obj2; 
  Console.WriteLine(obj1.Equals(obj2)); 

输出: -

  False
  True

compareTo -

将当前实例与同一类型的另一个对象进行比较,并返回一个整数,该整数指示当前实例是否在排序顺序中与其他对象相同的位置之前,之后或出现。

它返回 -

小于零 - 此实例在排序顺序中位于obj之前。 零 - 此实例与obj在排序顺序中的相同位置。 大于零 - 此实例遵循排序顺序中的obj。

如果object与实例的类型不同,它可以抛出ArgumentException。

例如,您可以访问here

所以我建议使用Equals代替compareTo。

答案 5 :(得分: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));

答案 6 :(得分:0)


s1.CompareTo(s2)
  

0 - 两者相等

     

+ ve - 比s2在字典上低于s1

     

-ve - 比s2在字典上高于s1

s1.equals(Object o1)
  

如果s1和o1等于

,则为真      

false-如果s1和o1不相等

compareTo可以抛出ClassCastException但是equals如果s1和o1是不同的类,则应该返回false。


TreeMap取决于compareTo()HashMap取决于equals()。因此,如果您等于并且compareTo与TreeMap不一致,HashMap的行为可能不同。因此,让equals()和compareTo()相互一致是很好的,但它不是强制性的。


我认为比较字符串的最佳或最有效的方法是引用比较(但您应该在整个代码中使用literals)。因为字符串本身不可变和String类通过intern()方法或编译器实现 FlyWeight 模式。所以比较参考是好的。

如果你对代码中的文字没有信心,那么你可以进行优化:

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

这是因为String in immutable。

答案 7 :(得分:0)

  

equalsIgnoreCase - 听说这是最快的

绝对不是。它必须做的事情是将小写字母提升为大写字母或反之亦然。你无法在任何声誉良好的地方“听到”。

  

匹配 - 可能是最慢的

同意。

  

等于   的compareTo

没有理由期待它们之间存在差异。