Java 使用equals和compareTo进行字符串比较-哪个更快?
我需要比较2个Java 使用equals和compareTo进行字符串比较-哪个更快?,java,string,Java,String,我需要比较2个字符串。我可以想到以下方法: equalsIgnoreCase-听说这是最快的,但我不能使用它,因为我的字符串区分大小写 匹配-可能是最慢的一个 等于 比较 因此,在上面的选项中,我只剩下等于和比较。其中哪一个更快 注意:输入的字符串数量很大[大约每秒5000个] 我剩下的是平等和比较 两者都有不同的用途 CompareTo 如果参数字符串等于此字符串,则值为0;如果此字符串在字典上小于字符串参数,则值小于0;如果该字符串在字典上大于字符串参数,则该值大于0 何处为 equals
字符串。我可以想到以下方法:
equalsIgnoreCase
-听说这是最快的,但我不能使用它,因为我的字符串区分大小写
匹配
-可能是最慢的一个
等于
比较
因此,在上面的选项中,我只剩下等于
和比较
。其中哪一个更快
注意:输入的字符串数量很大[大约每秒5000个]
我剩下的是平等和比较
两者都有不同的用途
CompareTo
如果参数字符串等于此字符串,则值为0;如果此字符串在字典上小于字符串参数,则值小于0;如果该字符串在字典上大于字符串参数,则该值大于0
何处为
equals
如果给定对象表示与此字符串等效的字符串,则为true,否则为false
因此,compareTo()
需要更多的计算equals()
您可以在这两者的源代码中看到这一点的证明
----更喜欢使用此选项。注意和之间的一个非常重要的区别:
现在,我建议您查看这两种方法的比较,得出结论,与涉及一些计算的相比,等于更可取
还要注意的是,equals
首先生成一个=
!当对象相同时,这可能是一个很大的优势。特别是当您提到您有大量字符串时,因为Java实习生使用字符串,这可能比您想象的要多
虽然您询问了字符串,但我想添加以下注释:
当涉及到BigDecimal
时,这些方法可能会非常不同。例如,请参见:
equals将此BigDecimal与指定的对象进行相等比较。
与compareTo不同,此方法认为两个BigDecimal对象相等
仅当它们的值和比例相等时(因此2.0不等于
2.00(使用此方法进行比较时)
您可以自己对代码计时,看看哪个更快:
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));
final long start=System.currentTimeMillis();
for(int i=0;i
等信号盒
您通常使用这个来进行字符串比较
火柴
慢,因为它是基于正则表达式的
相等于
我不认为这比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.
这是类代码url。
如果你愿意,你也可以看这篇文章
0-两者相等
+ve-than s2在词典编纂上低于s1
-ve-than s2在词典编纂上高于s1
真-如果s1和o1等于
错误-如果s1和o1不相等
compareTo
可以抛出ClassCastException
,但如果s1和o1是不同的类,则应返回false
TreeMap
依赖于compareTo()
,而HashMap
依赖于equals()
。因此,如果equals和compareTo不一致,则TreeMap
和HashMap
的行为可能不同。因此,让equals()和compareTo()彼此一致是很好的,但这不是强制性的
我认为比较字符串的最好或最有效的方法是引用compare(但您应该在整个代码中使用文本)。因为string本身是不可变的,string类通过intern()
方法或编译器在内部实现了FlyWeight模式。所以比较参考文献是很好的
如果您对代码中的文字没有信心,则可以进行优化:
s1.hashCode() == s2.hashCode() && s1.equals(s2)
这是因为字符串是不可变的。等于-
1-重写GetHashCode方法以允许类型在哈希表中正确工作
2-不要在Equals方法的实现中引发异常。相反,对于空参数,返回false
三,-
只要不修改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
equalsIgnoreCase-听说这是最快的
绝对不是。它必须做一些事情来将小写字母提升为大写字母,反之亦然。你不可能在任何有声誉的地方“听到”
比赛-可能是最慢的一场
同意
相等于
比较
没有理由期望它们之间有区别。我非常怀疑 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.Equals(null) returns false.
Object obj1 = new Object();
Object obj2 = new Object();
Console.WriteLine(obj1.Equals(obj2));
obj1 = obj2;
Console.WriteLine(obj1.Equals(obj2));
False
True