contentequals java_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#equals和String#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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值