2013-08-02 32 views
6

//Student.javaLàm thế nào để sử dụng phương thức hashCode gốc() sau khi trọng nó

class Student{ 
private int roll; 
private String name; 

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

    public int hashCode(){ 
    return roll+name.length(); 
    } 

    public boolean equals(Object obj){ 
    Student s=(Student)obj; 
    return (this.roll==s.roll && this.name.equals(s.name)); 
    } 

} 

//IssueID.java

class IssueID{ 

    public static void issueID(Student s1,Student s2){ 

    if(s1.equals(s2)) 
    System.out.println("New ID issued"); 

    else 
    System.out.println("New ID NOT issued"); 

    } 

} 

//Institute.java

import java.lang.Object; 
class Institute{ 
    public static void main(String[] args){ 
    Student s1=new Student(38,"shiva"); 
    Student s2=new Student(45,"aditya"); 

    IssueID.issueID(s1,s2); 


    System.out.println(s1.hashCode()); 
    System.out.println(s2.hashCode()); 
    } 

} 

Như trong đoạn mã trên, tôi đã ghi đè phương thức hashCode(). Điều này nghe có vẻ ngớ ngẩn, nhưng tôi có thể truy cập phương thức java.lang.Object.hashCode() sử dụng cùng một đối tượng Sinh viên (s1 và s2) cùng một lúc không?

+1

'super.hashCode() ', nhưng điều đó sẽ không sử dụng IMHO. –

Trả lời

17

Vâng, với System.identityHashCode:

Trả về mã băm tương tự cho các đối tượng nhất định như sẽ được trả lại bởi hashCode phương pháp mặc định(), có hoặc không lớp đối tượng cho trước sẽ ghi đè hashCode().

0

Bạn có thể sử dụng System.identityHashCode hoặc super.hashCode() Ngoài ra, bạn nên viết một mã băm tốt như bất kỳ sinh viên với tổng chiều dài của tên and roll là như nhau sẽ có cùng mã băm. Giống như (9, "Bob") và (7, "Steve"). Điều đó sẽ mở ra nhiều vấn đề tiềm năng cho các lỗi trong tương lai. Tiết kiệm cho mình những cơn đau đầu và viết một cái gì đó như thế này:

public int hashCode() { 
     int hash = 31 * roll; 
     hash = 31 * hash + name.hashCode(); 
     return hash; 
} 

Ngoài ra, hãy lưu ý rằng phương pháp equals của bạn không thỏa mãn phương pháp bằng trong JLS.

this.equals(null) phải trả về false, bạn sẽ ném ClassCastException.

Điều đó cũng có thể dẫn đến lỗi trong tương lai.

+0

vâng! phương thức hashcode đó chỉ để thử nghiệm. Anyways cảm ơn cho đề xuất của bạn! –

+1

[HashCodeBuilder] (http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/builder/HashCodeBuilder.html) là bạn của bạn! – chrylis

0

viết một cái gì đó như thế này:

class Student { 
    public int originalHashCode() { 
     return super.hashCode(); 
    } 
} 

sau đó gọi s.originalHashCode() khi bạn muốn sử dụng một bản gốc ~

Các vấn đề liên quan