为什么我的equals方法不起作用?

时间:2012-10-29 12:47:22

标签: java equals

我正在使用ArrayList,并且在程序中的某一点我正在使用contains方法来检查ArrayList中是否包含某个项目。 ArrayList包含CharProfile类型的对象,一个自定义类,它会查看其中是否包含字符。

因此,我假设它在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总是返回false的事实。)

5 个答案:

答案 0 :(得分:9)

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

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

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

这假定您的character字段永远不会为空。如果它可以为null,则需要在解除引用之前检查它。

答案 1 :(得分:2)

你正在重写equals,以便测试引用的相等性,运算符的默认行为==

答案 2 :(得分:1)

您需要使用equals()。你也可以使它成为一个oneliner并在你的演员阵容中更明确。

@Override
public boolean equals(Object o) {
    return o instanceof Character && this.character.equals(Character.class.cast(o));
}

答案 3 :(得分:1)

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

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

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

答案 4 :(得分: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的{​​{1}} equals()方法。

更清楚;

CharProfile

public class Data { public boolean equals(Object o) { System.out.println("I am data"); return false; } } 成功时,JVM将不会调用list.contains(new Data())的{​​{1}} Override方法。 现在,您将收到消息,例如我是数据。