java - C# 和 Java 中的 StringBuilder 相等

标签 java c# stringbuilder

我刚刚遇到这个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/

相关文章:

c# - 在 Quartz.net 中处理 JobExecutionException

c# - 如何按 child 的 child 的数量在 EF parent 中排序?

java - 使用字符串生成器时字符串索引超出范围

java - Docker 服务健康检查不适用于 Spring Boot 应用程序

C# Path.Combine 没有使用 AppData 位置

java - JSONException 字符串无法转换为 JSONObject

java - Android Logcat 每次输出调用是否限制为 4096 个字符?

vb.net - 由于内存中的 StringBuilder 实例过大,服务器停止

java - 文件重命名时的线程安全

java - Java中的类可以确定它是否被修改了吗?