簡體   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