2013-02-09 21 views
58

मैं एंड्रॉइड में विकास के लिए नया हूं। मेरे Android एप्लिकेशन में मैं HashMap उपयोग कर रहा हूँ, लेकिन मैं एक चेतावनी हो रही है:चेतावनी दिखाती है कि जब मैं एंड्रॉइड में हैश मैप का उपयोग करता हूं (नया स्पैर्सएरे <String> का उपयोग करें)

**"Use new SparseArray<String>(...) instead for better performance"** 

क्या मतलब है, और कैसे मैं SparseArray<String> बजाय उपयोग कर सकते हैं?

उत्तर

105

उपयोग नई SparseArray<String>(...) बजाय बेहतर प्रदर्शन

हैं कि यह चेतावनी हो रही है क्योंकि कारण की here वर्णित के लिए।

स्पैस ऑर ऑब्जेक्ट्स के लिए नक्शा पूर्णांक। ऑब्जेक्ट्स की सामान्य सरणी के विपरीत, सूचकांक में अंतर हो सकते हैं। ऑब्जेक्ट्स के इंटीग्रर्स को मैप करने के लिए यह हैश मैप का उपयोग करने से अधिक कुशल होने का इरादा है।

अब

मैं कैसे SparseArray का उपयोग करें?

आप नीचे दिए गए तरीके से यह कर सकते हैं:

  1. HashMap रास्ता:

    Map<Integer, Bitmap> _bitmapCache = new HashMap<Integer, Bitmap>(); 
    private void fillBitmapCache() { 
        _bitmapCache.put(R.drawable.icon, BitmapFactory.decodeResource(getResources(), R.drawable.icon)); 
        _bitmapCache.put(R.drawable.abstrakt, BitmapFactory.decodeResource(getResources(), R.drawable.abstrakt)); 
        _bitmapCache.put(R.drawable.wallpaper, BitmapFactory.decodeResource(getResources(), R.drawable.wallpaper)); 
        _bitmapCache.put(R.drawable.scissors, BitmapFactory.decodeResource(getResources(), 
    } 
    
    Bitmap bm = _bitmapCache.get(R.drawable.icon); 
    
  2. SparseArray रास्ता:

    SparseArray<Bitmap> _bitmapCache = new SparseArray<Bitmap>(); 
    private void fillBitmapCache() { 
        _bitmapCache.put(R.drawable.icon, BitmapFactory.decodeResource(getResources(), R.drawable.icon)); 
        _bitmapCache.put(R.drawable.abstrakt, BitmapFactory.decodeResource(getResources(), R.drawable.abstrakt)); 
        _bitmapCache.put(R.drawable.wallpaper, BitmapFactory.decodeResource(getResources(), R.drawable.wallpaper)); 
        _bitmapCache.put(R.drawable.scissors, BitmapFactory.decodeResource(getResources(), 
    } 
    
    Bitmap bm = _bitmapCache.get(R.drawable.icon); 
    

उम्मीद है कि यह मदद करेगा।

+0

लिंक किए गए दस्तावेज़ों को देखने के लिए निश्चित करें जो विस्तार से आगे बढ़ता है कि "कार्यान्वयन का उद्देश्य डेटा संरचनाओं के लिए उचित नहीं होना चाहिए जिसमें बड़ी संख्या में आइटम हो।" एक स्पैर्सएरे आमतौर पर तुलनात्मक हैश मैप से धीमा होता है। –

39

SparseArray का उपयोग तब किया जाता है जब आप Integer कुंजी के रूप में उपयोग कर रहे हों।

जब SparseArray का उपयोग कर, कुंजी जब आप HashMap जहां यह जो कारण होगा एक Object एक कुंजी रूप करने के लिए आवश्यक है का उपयोग के विपरीत हर समय एक आदिम चर के रूप में रहना होगा मानचित्र में ऑब्जेक्ट प्राप्त करते समय Integer ऑब्जेक्ट बनने के लिए int।

SparseArray का उपयोग करके आप कचरा कलेक्टर कुछ काम बचाएंगे।

तो Map<Integer,String> की तरह उपयोग करें।

+4

+1, ऑटोबॉक्सिंग (और संबंधित ऑब्जेक्ट्स + जीसी) से बचाता है जो हैश मैप के साथ होता है। @ साइरिल-मॉटियर ने इसके बारे में यहां लिखा: https://speakerdeck.com/cyrilmottier/optimizing-android-ui-pro-tips-for-creating-smooth-and-responsive-apps – orip

+0

तकनीकी रूप से आप ** ** नहीं हैं " एक कुंजी के रूप में 'इंटीजर' का उपयोग कर "। आप एक 'int' का उपयोग कर रहे हैं। –

5

यह एक संकेत है कि आपके कोड के लिए एक बेहतर डेटा संरचना है।

यह संकेत लिंट से है। जब आप किसी अन्य चीज के HashMap पूर्णांक के होते हैं तो आप आमतौर पर इसे प्राप्त करते हैं।

इसका सबसे बड़ा लाभ इंटीजर कुंजी को आदिम के रूप में मानना ​​है। दूसरे शब्दों में, यह एक कुंजी के रूप में उपयोग करने के लिए Integer (जावा ऑब्जेक्ट) पर नहीं पहुंच जाएगा।

बड़े मानचित्रों का उपयोग करते समय यह एक बड़ा सौदा है। HashMap के परिणामस्वरूप उस मामले में कई Integer ऑब्जेक्ट्स का निर्माण होगा।

जानकारी के कुछ और टुकड़े here देखें।

+0

https://developer.android.com/reference/android/util/SparseArray.html कहता है: "कार्यान्वयन का उद्देश्य डेटा संरचनाओं के लिए उपयुक्त नहीं होना चाहिए जिसमें बड़ी संख्या में आइटम हो सकते हैं। यह आमतौर पर पारंपरिक हैश मैप से धीमा है , ... "- इसका मतलब है: यदि आप गति में रूचि रखते हैं और कई मूल्यों को स्टोर करना चाहते हैं तो आपको हैश मैप का उपयोग करना होगा। –