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

标签 java object vector compare

编辑:问题是为什么我不能使用“.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/

相关文章:

java - 有没有办法手动损坏文件?

java - ArrayList<String> 类型中的方法 add(String) 不适用于参数 (String[])

javascript - 重新初始化 javascript 对象的属性

c++ - 使指向基类指针的 std::vector 的指针指向派生类指针的 std::vector

c++ - vector 和迭代器,打印出值而不是内存地址

c++ - 如何迭代地获取具有重复元素的排序旋转数组中的枢轴点?

java - 如何绕过 Java Web 服务客户端中的证书检查

java - 如何执行: Upload Image > Recognize Text > Make Image Searchable > Store into DB?

python - 类对象不更新空列表

java - 关于 Android 中 Java 类对象和从一个 Activity 到另一个 Activity 的数据传输的查询