StringBuilder在c#和Java中是相等的

StringBuilder在c#和Java中是相等的,java,c#,stringbuilder,Java,C#,Stringbuilder,我刚刚遇到了这个问题,java StringBuilder没有Equals()实现。然而,在c#中,我观察到有一个Equals()实现可用于StringBuilder类。我特别想知道在C语言中如何处理这个问题,为什么不在Java中处理这个问题。StringBuilder.equals()实际上存在,但它不比较字符串。从Java的角度来看,这是正确的方法StringBuilders变异,这就是它们的目的,这使得两个不同的StringBuilder对象在定义上不相等。大多数较新的Java API都遵

我刚刚遇到了这个问题,java StringBuilder没有Equals()实现。然而,在c#中,我观察到有一个Equals()实现可用于
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()来比较字符串值