6

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

  1. equalsIgnoreCase- 听说这是最快的,但我不能使用它,因为我的字符串区分大小写
  2. matches- 可能是最慢的一个
  3. equals
  4. compareTo

所以在上面的选项中,我留下了equalsand compareTo。其中哪一个更快?

注意:输入的字符串数量很大[每秒大约 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 不同,此方法仅当两个 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

等于忽略大小写

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

火柴

慢,因为它是基于 RegEx 的。

等于

我不认为这比equalsIgnoreCase

相比于

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

于 2013-10-21T06:43:48.340 回答
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 字符串,你也可以看看这篇文章 :compareTo() vs. equals()

于 2013-10-21T06:44:34.137 回答
1

等于 -

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

2- 不要在 Equals 方法的实现中抛出异常。相反,为空参数返回 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

比较-

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

它返回 -

小于零 - 此实例在排序顺序中位于 obj 之前。零 - 此实例在排序顺序中与 obj 出现在同一位置。大于零 - 此实例在排序顺序中位于 obj 之后。

如果对象与实例的类型不同,它可能会抛出 ArgumentException。

例如,您可以访问这里

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

于 2013-10-21T06:59:06.500 回答
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 - than 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 不一致TreeMapHashMap则行为可能会有所不同。因此,让 equals() 和 compareTo() 相互一致是很好的,但这不是强制性的。


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

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

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

这是因为 String 是不可变的。

于 2013-10-21T06:50:07.940 回答
0

equalsIgnoreCase - 听说这个是最快的

当然不。它必须做一些事情来将小写字母转换为大写字母,反之亦然。你不可能在任何有声望的地方“听说”过。

匹配 - 可能是最慢的一个

同意。

等于 compareTo

没有理由期望这些之间存在差异。

于 2013-10-21T08:48:28.190 回答