Java 使用equals和compareTo进行字符串比较-哪个更快?

Java 使用equals和compareTo进行字符串比较-哪个更快?,java,string,Java,String,我需要比较2个字符串。我可以想到以下方法: equalsIgnoreCase-听说这是最快的,但我不能使用它,因为我的字符串区分大小写 匹配-可能是最慢的一个 等于 比较 因此,在上面的选项中,我只剩下等于和比较。其中哪一个更快 注意:输入的字符串数量很大[大约每秒5000个] 我剩下的是平等和比较 两者都有不同的用途 CompareTo 如果参数字符串等于此字符串,则值为0;如果此字符串在字典上小于字符串参数,则值小于0;如果该字符串在字典上大于字符串参数,则该值大于0 何处为 equals

我需要比较2个
字符串。我可以想到以下方法:

  • 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