2015-05-21 5 views
9

मैं वास्तव में जावा की तरह 7+ लेखन hashCode() विधि की शैली:सर 7 के साथ जावा 7+ 'ऑब्जेक्ट्स.hash()' का उपयोग कैसे करें?

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

हालांकि यह सरणियों के साथ सही ढंग से काम नहीं करता है। निम्नलिखित कोड:

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

array1 के लिए के रूप में, काम नहीं करेगा और array2 नियमित hashCode()Arrays.hashCode() के बजाय लागू किया जाएगा।

मैं उचित तरीके से सरणी के साथ Objects.hash() का उपयोग कैसे कर सकता हूं?

+2

आप शायद था 'Arrays.deepHashCode' का उपयोग करना होगा। –

+1

@ लुइस वासरमैन - क्या आप विस्तृत कर सकते हैं कि मुझे ** गहरी ** हैश कोड का उपयोग करने की आवश्यकता क्यों हो सकती है? –

उत्तर

5

आप की कोशिश कर सकते:

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

यह एक सरणी कि field1, field2 होता है, array1 की सामग्री और array2 की सामग्री बनाने जैसा ही है। फिर इस सरणी पर Arrays.hashCode कंप्यूटिंग करें।

4

Arrays.deepHashCode सरणी में सरणी (instanceof Object[] के माध्यम से) खोजेगा और फिर से कॉल कर देगा। code देखें।

यदि सरणी में तत्वों के रूप में अन्य सरणी शामिल हैं, तो हैश कोड उनकी सामग्री पर आधारित है और इसी तरह विज्ञापन infinitum।

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

यह Objects.hash की तरह एक पैरामीटर संस्करण है के लिए उपयोगी हो सकता है, लेकिन आप को लिखने के लिए होगा अपनी खुद की:

public final class HashUtils { 
    private HashUtils(){} 

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

उपयोग:

@Override 
public int hashCode() { 
    return HashUtils.deepHashCode(field1, field2, array1, array2); 
} 
संबंधित मुद्दे