2014-04-28 65 views
-2

相同的值的代碼如下:爲什麼不是Object.hashCode()返回看似相同的對象

public class Main { 
    public static void main(String[] args) { 
     Student a = new Student(10, "Ole"); 
     Student b = new Student(10, "Ole"); 

     System.out.println(a.hashCode()); 
     System.out.println(b.hashCode()); 
    } 
} 

和物體看起來像這樣:

public class Student { 
    private int snr; 
    private String namn; 

    public Student(int snr, String namn) { 
     this.snr = snr; 
     this.namn = namn; 
    } 
} 

這些都是運行結果時,代碼:

57651960 
441366923 

我讀過一些的Javadoc的,但我不能找出原因,任何人都可以解釋爲什麼這HAPP ENS?還有我需要做什麼才能使結果一致? (如果可能)

感謝您的解釋:)!現在有意義;)

+0

查看方法覆蓋。 –

+0

[如果hashCode()沒有被覆蓋,什麼是對象的哈希碼] [duplicate](http://stackoverflow.com/questions/2237720/what-is-an-objects-hash-code-if-hashcode-is -not-overridden) – buzzsawddog

回答

6

你是不是覆蓋Object.hashCode(),所以它的基於對象的身份返回一個值。

documentation

多達是合理可行,通過 類對象定義的hashCode方法並返回不同的整數爲不同的對象。 (此 通常通過轉換 對象的內部地址轉換成一個整數實現,但該實現方式的技術是不被的JavaTM編程語言不需要 。)

+0

我看到了,謝謝你:D! – Patidati

+1

我會大膽轉換內部地址的部分。 – buzzsawddog

2

Student類是負責提供一個合適的equals()方法,該方法與hashCode()合同一致。根據JavaDoc:

如果兩個對象根據equals(Object)方法是相等的,則調用在每個兩個對象的hashCode()方法必須產生相同的整數結果。

這裏的完整的例子:

class Student { 

    private int snr; 
    private String name; 

    public Student(int snr, String name) { 
     this.snr = snr; 
     this.name = name; 
    } 

    @Override public boolean equals(Object obj) { 
     if (!(obj instanceof Student)) return false; 
     Student other = (Student) obj; 
     return Objects.equals(snr, other.snr) && Objects.equals(name, other.name); 
    } 

    @Override public int hashCode() { 
     return Objects.hash(snr, name); 
    } 
} 
+0

因此,如果我要在Student類中創建一個表示它們相等的equals()方法,那麼值會是相同的?或者我誤解了? – Patidati

+2

你需要實施何時考慮兩個「學生」是平等的。如果他們被認爲是相同的,他們必須返回相同的哈希碼。合同有點複雜,但我指出的方面是必須執行的。仔細閱讀這兩種方法的JavaDoc。您將不得不爲您的職業生涯中的許多次提供實現。 – Harmlezz

+0

有幾個人和我有同樣的名字。這是否影響到他們是否與我一樣。顯然不是,所以這個名字不應該是'equals' /'hashCode'實現的一部分。在這裏重寫'equals'可能沒有意義。 –

1

您沒有覆蓋底層Object.Hashcode,你需要這樣的東西,你的IDE可以生成哈希碼並且等於你。

public class Student { 
    private int snr; 
    private String namn; 

    public Student(int snr, String namn) { 
     this.snr = snr; 
     this.namn = namn; 
    } 

@override 
public int hashcode(){ 
    int result = super.hashCode(); 
    result = 31 * result + (namn!= null ? namn.hashCode() : 0) + snr; 
    return result; 
    } 
} 
+0

是的,我明白,但我需要這樣做,而不是壓倒一切:) – Patidati

+1

@patidati你有什麼好理由呢?另外,這是不可能的。 –

相關問題