我需要比较2 Strings
。我有以下方法可以想到:
equalsIgnoreCase
- 听说这是最快的,但由于我的字符串区分大小写,我无法使用它matches
- 可能是最慢的equals
compareTo
因此,在上面的选项中,我留下了equals
和compareTo
。其中哪一个更快?
注意:字符串的输入数量很大[每秒5000左右]。
答案 0 :(得分:12)
"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()
您可以在两者的源代码中看到相关证明。
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
没有理由期待它们之间存在差异。