4

我正在使用ArrayList, 并且在程序中的某个时刻我使用 contains 方法来检查某个项目是否包含在ArrayList. ArrayList保存 type的对象CharProfile,一个自定义类,它正在查看其中是否包含 char。

所以我假设它在 contains 方法中使用了 equals 方法。像这样的东西CharProfile.contains(char),但它不起作用。

我覆盖了 CharProfile 中的 equals 方法:

@Override
public boolean equals(Object o) {
    if (this.character == (Character)o) {
        return true;
    }
    else {
        return false;
    }
}

因此,当 CharProfile 尝试使用它时,它应该使用我的 equals 方法,对吗?那么为什么它不起作用呢?

(就“不工作”而言,我指的是contains总是返回错误的事实。)

4

5 回答 5

9

您正在使用 == 比较引用类型,这是错误的。您必须使用equals, 并添加适当的null-checks。

但这仅仅是开始。您的主要问题是您试图将CharProfile对象与Character对象进行比较。你可能需要这个:

public boolean equals(Object o) {
  return o instanceof CharProfile 
     && this.character.equals((CharProfile)o).character;
}

这假设您的character字段永远不会为空。如果它可以为空,您还需要在取消引用之前检查它。

于 2012-10-29T12:49:08.863 回答
2

您正在覆盖 equals 以便它测试引用的相等性,即运算符的默认行为==

于 2012-10-29T12:50:13.747 回答
1

你需要使用equals ()。你也可以让它成为一个单线,在你的演员阵容中更加明确。

@Override
public boolean equals(Object o) {
    return o instanceof Character && this.character.equals(Character.class.cast(o));
}
于 2012-10-29T12:51:30.550 回答
1

您必须使用 equals() 方法,并且不要忘记覆盖 hashCode() 方法。他们齐头并进。

有些人不知道这一点,但是如果使用 eclipse 你可以右键单击选择 Source-> 并生成 hashCode() 和 equals()...

但是,我建议您在使用这种便利之前先了解它们的用途。

于 2012-10-29T12:58:23.727 回答
0

例如,您有CharProfile如下。

List<CharProfile> list = new ArrayList<CharProfile>();
list.add(new CharProfile('a'));
list.add(new CharProfile('b'));
list.add(new CharProfile('c'));

什么list.contains('a')时候,JVM 不会Override equals()调用CharProfile.

为了更清楚;

public class Data {
    public boolean equals(Object o) {
        System.out.println("I am data");
        return false;
    }
}

什么list.contains(new Data())时候,JVM 不会Override equals()调用Data. 现在,您将收到消息,就像我是数据一样。.

于 2012-10-29T13:01:12.463 回答