StringBuilder在c#和Java中是相等的
我刚刚遇到了这个问题,java StringBuilder没有Equals()实现。然而,在c#中,我观察到有一个Equals()实现可用于StringBuilder在c#和Java中是相等的,java,c#,stringbuilder,Java,C#,Stringbuilder,我刚刚遇到了这个问题,java StringBuilder没有Equals()实现。然而,在c#中,我观察到有一个Equals()实现可用于StringBuilder类。我特别想知道在C语言中如何处理这个问题,为什么不在Java中处理这个问题。StringBuilder.equals()实际上存在,但它不比较字符串。从Java的角度来看,这是正确的方法StringBuilders变异,这就是它们的目的,这使得两个不同的StringBuilder对象在定义上不相等。大多数较新的Java API都遵
StringBuilder
类。我特别想知道在C语言中如何处理这个问题,为什么不在Java中处理这个问题。StringBuilder.equals()
实际上存在,但它不比较字符串。从Java的角度来看,这是正确的方法StringBuilder
s变异,这就是它们的目的,这使得两个不同的StringBuilder
对象在定义上不相等。大多数较新的Java API都遵循为不可变或最终类实现equal()
的方法,尽管也有例外。另一方面,可变类通常只继承依赖于对象标识的Object.equals()
这背后至少有两个原因。一种是在基于散列的数据结构中正确使用对象的能力,即作为HashSet
中的值或HashMap
中的键。尽管这取决于Object.hashCode()
,但它会影响Object.equals()
,因为hashCode
如果要用作基于哈希的数据结构中的条目,则在对象的生命周期内应该是稳定的,equals()
被定义为与hashCode()
一致
另一个是Object.equals()
被定义为对称的,不小心重写Object.equals()
会破坏这种对称性
总而言之,在Java中,
Object.equals()
不应被理解为值相等,而应根据实例的性质理解为相等。不同的框架采用不同的方法-要了解它们为什么会这样设计,您可能需要询问设计它们的团队。可变类型的相等可能有用,但也可能没有帮助。在java中,StringBuilder.toString()使用equals()来比较字符串值