String#equals和String#contentEquals方法之间的区别

问题

String#equals方法和String#contentEquals方法有什么区别?


#1 热门回答(122 赞)

TheString#equals()不仅比较String的内容,还检查另一个对象是否也是aString的实例。如果另一个对象也是String的实例,则String#contentEquals()仅比较内容(字符序列)和而不是check。它可以是任何东西,只要它是CharSequence的实现,其涵盖a.o.String,StringBuilder,StringBuffer,CharBuffer等。


#2 热门回答(30 赞)

轻松一点:String.contentEquals()String.equals()的更聪明的兄弟,因为它在实现中可以比String.equals()更自由。

有一些原因可以解释为什么有单独的String.contentEquals()方法。我认为最重要的原因是:

  • equals方法必须是自反的。这意味着:x.equals(y)== y.equals(x)。这意味着aString.equals(aStringBuffer)必须与aStringBuffer.equals(aString)相同。这需要Java API开发人员在StringBuffer,StringBuilder和CharSequence的equals()方法中为Strings做一些特殊的实现。这将是一个烂摊子。

所以,那就是String.contentEquals收入的时候。这是一个独立方法,这是**,而不是**,请到遵循严格的要求和规则forObject.equals。这样,你就可以更自由地实现"平等内容"的感觉。例如,这允许你在StringBuffer和String之间进行智能比较。

并说明究竟有什么区别:

  • String.contentEquals()可以比较String,StringBuilder,StringBuffer,CharSequence以及它们的所有派生类的内容。如果参数的类型为String,则执行String.equals()。
  • String.equals()仅比较String对象。所有其他对象类型都被视为不相等。
  • String.contentEquals()可以智能方式比较StringBuffer和StringBuilder。它不会调用繁重的toString()方法,该方法将整个内容复制到新的String对象。相反,它与底层的char []数组进行比较,这很好。

#3 热门回答(25 赞)

这个答案已经发布了dbw但是他删除了它但是他在比较执行时间时有一些非常有效的差异点,抛出了什么异常,

如果你看一下源代码String#equalsString#contentEquals,很明显有两个重写的方法forString#contentEqualsone,取得了StringBuilder和其他CharSequence
它们之间的区别,

  • 如果提供的参数为null,则String#contentEquals将抛出NPE但String#equals将返回false
  • String#equals仅在提供的参数是String的实例时才比较内容,否则在所有其他情况下它将返回false但另一方面String#contentEquals检查实现接口CharSequence的所有对象的内容。
  • 你还可以调整代码,以便String#contentEquals通过覆盖传递的参数的equals方法返回错误的结果或结果,如下所示,但是你不能使用String#equals进行这些调整。只要s包含3个字符长的字符串,下面的代码将始终生成true String s = new String("abc"); //"abc";
        System.out.println(s.contentEquals(new CharSequence()
        {

        @覆盖
        public CharSequence subSequence(int arg0,int arg1){
            // TODO自动生成的方法存根
            return null;
        }

        @覆盖
        public int length(){
            // TODO自动生成的方法存根
            返回0;
        }

        @覆盖
        public char charAt(int arg0){
            // TODO自动生成的方法存根
            返回0;
        }

        @覆盖
        public boolean equals(Object obj)
        {
           返回true;
        }
    }));

  • 如果提供的参数是String的实例并且两个String的长度相同但内容不相等,则String#contentEquals将慢于String#Equals。例如,如果字符串是String s ="madam"并且String argPassed ="madan"那么s.contentEquals(argPassed)在这种情况下将花费几乎两倍的执行时间与s.equals(argPassed)相比
  • 如果两个字符串的内容长度不同,那么函数String#contentEquals在几乎所有可能的情况下都会比String#Equals具有更好的性能。
    还有一点要添加到他的答案中- String对象的内容#contentEquals也将与StringBuilder内容进行比较并提供适当的结果,而String#Equals将返回false