2013-02-09 23 views
8

जावा में की जाँच करें, एक HashMap पूरी तरह से इस तरह के फार्म के डेटा के साथ में भरा होने:एक HashMap के अस्तित्व कुंजी

:

HashMap<Integer, int[]> map = new HashMap<Integer, int[]>(1000000, 1); 

जब एक यादृच्छिक कुंजी के अस्तित्व की जाँच क्या तेजी से होता है, 100 का कहना है

if (map.get(100) == null)) 

या

if (!map.containsKey(100)) 

?

प्रश्न माइक्रो-ऑप्टिमाइज़ेशन बिंदु से दिलचस्प है।

+0

आप इसका परीक्षण क्यों नहीं करते? – rekire

+0

मैंने किया, लेकिन यह हर समय विभिन्न निष्पादन समय देता है जो कुछ अंतराल में होते हैं और कम-से-कम होते हैं। तो मुझे नहीं पता कि वास्तव में क्या तेज़ है। –

उत्तर

15

containsKeyधीमी होना चाहिए बहुत थोड़ा क्योंकि यह एक अतिरिक्त समारोह कॉल में परिणाम है (यह सिर्फ getEntry कॉल) (इसे दूर अनुकूलित हो सकता है, मुझे यकीन है कि Java ऐसा करेंगे नहीं कर रहा हूँ)। containsKey लगता है:

public boolean containsKey(Object key) { 
    return getEntry(key) != null; 
} 

लेकिन ध्यान दें कि containsKey दूसरी ओर हो सकता है बहुत थोड़ा अन्य Map कार्यान्वयन (लेकिन शायद नहीं मानक जावा एपीआई में उन लोगों के) पर तेजी से

आम तौर पर मेरी कार्यान्वयन की तरह लग रहे:

int[] arr = map.get(100); 
if (arr == null) // doesn't exist 
    // do stuff 
else // exists 
    // do stuff with arr 

(containsKey के लिए जरूरत से परहेज) नीचे निश्चित रूप से ऊपर की तुलना में धीमी होगा: (आइटम आप के लिए देखने के लिए समय के लिए उचित समय मौजूद है, तो)

if (!map.containsKey(100)) // doesn't exist 
    // do stuff 
else // exists 
{ 
    int[] arr = map.get(100); 
    // do stuff with arr 
} 

संपादित करें: धन्यवाद containsKey के स्रोत प्रदान करने के लिए zvzdhk करने के लिए। मुझे वास्तव में जांच करनी चाहिए।

5

असल में दोनों दृष्टिकोण समान हैं। आप java.util.HashMap स्रोत कोड में देखें, तो आप अगले containsKey अहसास पा सकते हैं:

public boolean containsKey(Object key) { 
    return getEntry(key) != null; 
} 
+1

ठीक है, @downvoter, अगर मैं गलत हूं तो मुझे सही करें। – bsiamionau

2

दो अलग है कि map.get(key) को छोड़कर केवल में return प्रकार मामला अगर इसकी एक प्रमुख में आप null वापस आ सकते हैं, हालांकि map.containsKey(key) आप वापस आ जाएगी boolean जो कर सकते थे map.get(key) के दो संभावित मामलों को null लौटने के लिए इस्तेमाल किया जाए।

1

इन दो दृष्टिकोणों के बीच कोई अंतर नहीं है। मुख्य अंतर केवल आप जो करने जा रहे हैं। यदि आपको मूल्य की आवश्यकता है, तो निश्चित रूप से आपके पास मूल्य होगा।