我需要比较 2 Strings
。我有以下我能想到的方法:
equalsIgnoreCase
- 听说这是最快的,但我不能使用它,因为我的字符串区分大小写matches
- 可能是最慢的一个equals
compareTo
所以在上面的选项中,我留下了equals
and compareTo
。其中哪一个更快?
注意:输入的字符串数量很大[每秒大约 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 不同,此方法仅当两个 BigDecimal 对象的值和比例相等时才认为它们相等(因此,通过此方法进行比较时,2.0 不等于 2.00)。
等于忽略大小写
您通常使用它来进行字符串比较。
火柴
慢,因为它是基于 RegEx 的。
等于
我不认为这比equalsIgnoreCase
相比于
这将返回一个整数或 0。例如,这用于排序。不要将其用于平等。
两个主要区别是:
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()
等于 -
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。
您可以自己计时代码,看看哪个更快:
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 - 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 不一致TreeMap
,HashMap
则行为可能会有所不同。因此,让 equals() 和 compareTo() 相互一致是很好的,但这不是强制性的。
我认为比较字符串的最佳或有效方法是引用比较(但您应该literals
在整个代码中使用)。因为字符串本质上是不可变的,并且 String 类通过方法或编译器在内部实现FlyWeight模式。intern()
所以最好比较参考。
如果您对代码中的文字没有信心,则可以进行优化:
s1.hashCode() == s2.hashCode() && s1.equals(s2)
这是因为 String 是不可变的。
equalsIgnoreCase - 听说这个是最快的
当然不。它必须做一些事情来将小写字母转换为大写字母,反之亦然。你不可能在任何有声望的地方“听说”过。
匹配 - 可能是最慢的一个
同意。
等于 compareTo
没有理由期望这些之间存在差异。