gpt4 book ai didi

java - 覆盖 equals 并将对象转换为字符串

转载 作者:行者123 更新时间:2023-12-01 12:42:01 24 4
gpt4 key购买 nike

编辑:问题是为什么我不能使用“.contains”(覆盖对象中的.equals())来比较对象属性(字符串)而不是比较对象本身。谢谢杰布:结果我混淆了重写compareTo()和重写equals()

编辑:问题重新定义:

为什么我不能重写 equals 来比较对象中的字符串:

public boolean equals(Object obj){
...
if(obj instanceof String){
String testString = (String) obj;
...
}
...
}

或者甚至重载:

public boolean equals(String stringObj){
...
}

我在某处读到编译器不使用逻辑来决定这一点,它使用类型。因此,如果我随后调用myObj.equals(stringOne + "_" + stringTwo)这不应该工作吗,因为它知道正在传递一个字符串?谢谢,
史蒂夫。

最佳答案

为什么这段代码没有意义:

  1. 因为 Comparable 应该遵守规则:if a < b为真,则 b > a一定是真的。您可以将类的实例与 String 进行比较,但 String 无法与自定义类的实例进行比较。因此,您违反了 Comparable 的契约(Contract)
  2. 因为 Vector 不使用 compareTo()检查一个元素是否存在。它使用 equals() .
  3. 因为您不应该仅仅为了实现特定的用例(包括将此类的实例添加到列表中并检查重复项)而改变类的性质。这个逻辑应该在类之外。在创建自定义类实例之前,您可以简单地循环遍历列表并检查项目和位置是否已存在。
  4. 因为多年来您不应该使用 Vector(从 Java 2 开始 - 我们现在是 Java 8)。由于目标似乎是避免重复,因此您应该使用 Set .

做正确的事情,并使用 HashSet。确保 CustomClass 实现 equals()hashCode()正确。您还可以使用 HashMap<CustomClassKey, CustomClass> ,其中 CustomClassKey 是一个简单的类,包含标识您的 CustomClass 实例的两个字段。

关于java - 覆盖 equals 并将对象转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25015973/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com