我刚刚遇到这个StringBuilder .equals Java ,其中 java StringBuilder 没有 Equals() 实现。然而,在 c# 中,我观察到 StringBuilder 类有一个 Equals() 实现。我特别想知道这在 C# 中是如何处理的,而为什么在 Java 中则不然。
最佳答案
StringBuilder.equals()
实际上存在,但它不比较字符串。从Java的角度来看,这是正确的做法。 StringBuilder 会发生变化,这就是它们的目的,这使得两个不同的 StringBuilder 对象在定义上不相等。大多数较新的 Java API 都遵循为不可变或最终类实现 equal()
的方法,但也有异常(exception)。另一方面,可变类通常简单地继承依赖于对象标识的Object.equals()
。
这背后至少有两个原因。一是能够正确使用基于哈希的数据结构中的对象,即作为 HashSet 中的值或 HashMap 中的键。虽然这取决于 Object.hashCode()
,但它会影响 Object.equals()
,因为 hashCode
在对象的生命周期内应该保持稳定,如果它被用作基于哈希的数据结构中的条目,并且 equals()
被定义为与 hashCode()
一致。
另一个是 Object.equals()
被定义为对称的,不小心重写 Object.equals()
可能会破坏这种对称性。
总而言之,在 Java 中,Object.equals()
不应该被理解为值相等,而应该被理解为根据实例性质的相等。
关于java - C# 和 Java 中的 StringBuilder 相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27186075/