繁体   English   中英

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

[英]Why isn't my equals method working?

我正在使用一个ArrayList ,并且在程序中的某一点我正在使用contains方法来检查ArrayList是否包含某个项目。 ArrayList保存CharProfile类型的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始终返回false的事实。)

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

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

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

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

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

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

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

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

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

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

例如,您有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将不会调用CharProfile Override equals()方法。

为了更清楚;

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

list.contains(new Data())是呢,JVM将不会调用Override equals()方法Data 现在,你会得到像我是数据的消息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM