2015-05-21 14 views
9

Tôi thực sự thích Java 7+ phong cách viết phương pháp hashCode():Làm thế nào để sử dụng Java 7+ 'Objects.hash()' với mảng?

@Override 
public int hashCode() { 
    Objects.hash(field1, field2); 
} 

Nó không làm việc một cách chính xác với mảng mặc dù. Các mã sau đây:

@Override 
public int hashCode() { 
    Objects.hash(field1, field2, array1, array2); 
} 

sẽ không hoạt động, như đối với array1array2 thường xuyên hashCode() thay vì Arrays.hashCode() sẽ được gọi.

Tôi làm cách nào để sử dụng Objects.hash() với mảng theo cách phù hợp?

+2

bạn muốn có thể phải sử dụng 'Arrays.deepHashCode'. –

+1

@LouisWasserman - bạn có thể giải thích tại sao tôi có thể cần sử dụng ** mã băm ** sâu không? –

Trả lời

5

Bạn có thể thử:

Objects.hash(field1, field2, Arrays.hashCode(array1), Arrays.hashCode(array2)); 

này cũng giống như việc tạo ra một mảng chứa field1, field2, nội dung của array1 và các nội dung của array2. Sau đó, tính toán Arrays.hashCode trên mảng này.

4

Arrays.deepHashCode sẽ phát hiện các mảng trong mảng (qua số instanceof Object[]) và tự gọi lại theo cách đệ quy. Xem code.

Nếu mảng chứa mảng khác làm thành phần, mã băm dựa trên nội dung của chúng, v.v.

@Override 
public int hashCode() { 
    Object[] fields = {field1, field2, array1, array2}; 
    return Arrays.deepHashCode(fields); 
} 

Nó sẽ là hữu ích để có một phiên bản params như Objects.hash, nhưng bạn sẽ phải viết riêng của bạn:

public final class HashUtils { 
    private HashUtils(){} 

    public static int deepHashCode(Object... fields) { 
     return Arrays.deepHashCode(fields); 
    } 
} 

Cách sử dụng:

@Override 
public int hashCode() { 
    return HashUtils.deepHashCode(field1, field2, array1, array2); 
} 
Các vấn đề liên quan