2010-01-25 72 views
21

Tôi nên triển khai hashCode()equals() cho lớp sau bằng Java như thế nào?Cách triển khai phương thức hashCode và equals

class Emp 
{ 
    int empid ; // unique across all the departments 
    String name; 
    String dept_name ; 
    String code ; // unique for the department 
} 
+0

Đó không phải là mã nguồn Java. Hay bạn đã tạo ra lớp của riêng bạn gọi là 'string'? Và bạn thực sự cần phải có một cái nhìn tại đây: http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html –

+0

Tôi thấy Joachim đã thay đổi một vài lỗi trong mẫu mã của bạn. Tuy nhiên, tôi khuyên bạn nên xem liên kết tôi đã đăng trong nhận xét trước của mình. –

+0

Tôi đang sử dụng lớp String của chuỗi – Vidya

Trả lời

30

trong Eclipse cấp nhấp chuột chuột phải> nguồn -> tạo hashCode() và equals() cho phép này:

/* (non-Javadoc) 
* @see java.lang.Object#hashCode() 
*/ 
@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + (code == null ? 0 : code.hashCode()); 
    return result; 
} 
/* (non-Javadoc) 
* @see java.lang.Object#equals(java.lang.Object) 
*/ 
@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (!(obj instanceof Emp)) 
     return false; 
    Emp other = (Emp) obj; 
    return code == null ? other.code == null : code.equals(other.code); 
} 

Tôi đã chọn mã làm trường duy nhất

+1

Hmmm ... Tôi thường so sánh tất cả các trường trong phương thức equals() trừ khi bạn thực sự có lý do chính đáng để không ... –

+1

Vì vậy, nếu hai 'Emp' từ các phòng ban khác nhau có cùng mã, chúng bằng nhau? Bạn cần ít nhất để thêm 'dept_name' trong việc triển khai này. –

+0

Tôi chấp nhận câu trả lời này khi tôi có ý tưởng cần làm gì.jutky đã giả định mã là mã định danh duy nhất. – Vidya

0

Nếu mã là duy nhất (ví dụ: chính doanh nghiệp của bạn), tốt nhất là chỉ nên sử dụng mã cho equals và hashCode - đó là thực hành tốt để chìa khóa riêng biệt kinh doanh (code) từ đối tượng id (id).

Dưới đây là một đọc tốt đẹp: Hibernate Documentation: Equals and HashCode (có giá trị không chỉ cho Hibernate chính nó)

+1

Nó có vẻ là duy nhất cho một bộ phận, do đó cho thấy rằng các phòng ban có thể chia sẻ cùng một "mã". Dù sao, một câu hỏi khá mơ hồ nếu bạn hỏi tôi. –

-1

giá trị bao giờ bạn sử dụng bằng để xác định xem hai đối tượng có giống nhau không, là các giá trị bạn cần sử dụng để tạo mã băm hay không.

public boolean equals(Object o) { 

    boolean result = false; 

    if(o instanceof CategoryEnum) { 

     CategoryEnum ce = (CategoryEnum) o; 
     result = ce.toString().equals(name); 

    }  
    return result; 

} 


public int hashCode() 
{ 
    int hash = 6; 
    hash += 32 * name.hashCode(); 
    return hash; 
} 
+2

(không -1 từ tôi) Điều đó không hoàn toàn đúng. Hoàn toàn hợp pháp khi chỉ sử dụng tập hợp con cho hashCode (ví dụ: mã và tên cho bằng và chỉ mã cho hashCode). Nó thậm chí còn hợp pháp để sử dụng một hashCode không đổi ('public int hashCode() {return 42;}') - nó hủy hoại hiệu suất của các bộ sưu tập băm (HashMap, HashSet, ...) nhưng chúng vẫn hoạt động chính xác. Vì vậy, nó tốt hơn so với một phương thức hashCode không hợp lệ. Quy tắc duy nhất là: nếu hai đối tượng bằng nhau ('a.equals (b)'), chúng phải có cùng mã băm ('a.hashCode() == b.hashCode()'). Nếu chúng không bằng nhau, mã băm có thể vẫn bằng nhau. – sfussenegger

-2

bằng() và hashcode(), Chúng có nhiều vị trí khác nhau. bằng(), nếu chúng ta không ghi đè nó từ đối tượng, nó đại diện cho dù hai biến trỏ đến cùng một đống đối tượng?

public Class Student(){ 
    private int id; 
    private name; 
    public Student(int id,String name){ 
    this.name=name; 
    this.id=id; 
} 

public void main(String[] args){ 
    Student A=new Student(20,'Lily'); 
    Student B=new Student(20,'Lily'); 
    boolean flag=A.equals(B)//flag=flase; 
/* 
*Although they attribute the same, but they are two different objects, they point to  different memory 
*/ 


@Override 
public boolean equals(Object obj) { 


    if (obj == null) { 
    return false; 
    } 
    if (this == obj) { 
    return true; 
    } 

    if (this.getClass() != obj.getClass()) { 
    return false; 
    } 
    Student s=(Student)obj; 
    return new Integer(this.id).equals(new Integer(s.id))&&this.name.equals(s.name); 
    } 

/** 
    *Sometimes even though we Override the equals, but we still can not determine whether the *two objects the same, 
    *In the collection object, such as HashSet, this time we have to Override the hashoCode() 
    */ 

public int hashCode(){ 
    return id + name.hashCode() ; 
} 
3

thử mã này, sử dụng org.apache.commons.lang3.builder

public int hashCode() { 
    return new HashCodeBuilder(17, 31). // two randomly chosen prime numbers 
     append(empid). 
     append(name). 
     append(dept_name). 
     append(code). 
     toHashCode(); 
} 

public boolean equals(Object obj) { 

    if (obj == this) 
     return true; 
    if (!(obj instanceof Person)) 
     return false; 

    Emp rhs = (Emp) obj; 
    return new EqualsBuilder(). 
     // if deriving: appendSuper(super.equals(obj)). 
     append(name, rhs.name). 
     isEquals(); 
} 
2

ổi có phương pháp helper để tạo ra chúng. Bạn cho nó biết trường nào cần xem xét và nó sẽ xử lý null cho bạn và thực hiện phép tính số nguyên tố cho hashcode.

IDE cũng có thể tạo chúng dựa trên các trường bạn chọn.

Lợi thế của việc ủy ​​thác nó cho một công cụ như vậy là bạn nhận được một giải pháp tiêu chuẩn và sẽ lo lắng ít hơn về lỗi và bảo trì các triển khai đa dạng trên toàn bộ dự án của bạn.

Dưới đây là ví dụ về cách sử dụng tiếng Guava và được tạo bởi plugin IntelliJ: https://plugins.jetbrains.com/plugin/7244?pr=

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