簡體   English   中英

等於方法覆蓋問題

[英]equals method override issue

我是Java的新手。 我為Animal類重寫了equalshashcode 我希望使用HashSet<Animal>如下所示,僅將一個Animal插入HashSet 但是,盡管具有相同的屬性,第二個Animal對象卻被添加到集合中。 有人可以調查嗎?

import java.util.*;

class SetTest
{    
    public static void main(String [] args)
    {
      Set<Animal>s=new HashSet<Animal>();
      Animal a=new Animal(2);
      boolean b1=s.add(a);
      System.out.println("hi "+b1);

      Animal b=new Animal(2);
      boolean b2=s.add(b);
      System.out.println("hi "+b2);    
    }
}


class Animal
{
    int t;
    Animal(int a)
    {
        t=a;       
    }

    public boolean equals(Object O)
    {
        if(O instanceof Animal && ((Animal)O).t==t)
            return true;

        return false;
    }

    public int hashcode()
    {   
        return t; 
    }
}

輸出:hi true hi true

非常感謝。

您沒有覆蓋hashCode() 您介紹了另一個稱為hashcode()方法。 案件很重要。

當您打算重寫方法時,請始終使用@Override批注:

@Override
public int hashcode()

如果您這樣做了,編譯器會注意到錯字,並拒絕編譯該類。

您的代碼的哈希碼類型錯誤:寫hashCode而不是hashcode。

import java.util.*;
class SetTest { 
  public static void main(String [] args) { 
    Set<Animal>s=new HashSet<Animal>();
   Animal a=new Animal(2);
    boolean b1=s.add(a);
    System.out.println("hi "+b1);
     Animal b=new Animal(2);
    boolean b2=s.add(b);
     System.out.println("hi "+b2); 
  } 
}

class Animal { 
  int t;

  public Animal(int a) {
      t=a;
  }

  @Override
  public boolean equals(Object O) {
    return O instanceof Animal 
            && ((Animal)O).t==t;
  }

   @Override
   public int hashCode() { 
     return t;
  }
}

如果您使用的是eclipse,則可以使用源代碼生成器,並在其中避免常見的人為錯誤(就像您在此處所做的那樣。在類->源->生成哈希碼和equals方法上單擊鼠標右鍵。彈出窗口,您可以在其中選擇相等(對象相等)和哈希碼生成時需要考慮的字段。

Java使用hashCode和equals方法檢查兩個對象是否相等。 HashSet在內部使用HashMap。 您可以參考HashMap.put(K key,V value)方法以獲取更多詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM