2011-02-15 9 views
8

मैं एक और एपीआई में एक विधि बुला रहा हूं जो वस्तुओं के java.util.Collection स्वीकार करता है। मैंने विधि को देखा है और यह अपने कार्य को करने से पहले संग्रह में सब कुछ ArrayList में प्रतिलिपि बनाता है।java.util. सबसे निचले ओवरहेड के साथ चयन?

यह मुझे आश्चर्यचकित कर रहा है: इस विधि के लिए पैरामीटर को जल्दी से इकट्ठा करने के लिए मैं पूर्ण निम्न ओवरहेड जावा संग्रह क्या उपयोग कर सकता हूं?

उत्तर

6

कि कैसे यह प्रतियां तत्वों, लेकिन अगर यह ArrayList -copy इस

new ArrayList<Something>(inputCollection); 

की तरह बनाता है पर निर्भर करता है या अगर यह

someCopy.addAll(inputCollection); 

करता है तो यह inputCollection.toArray() के माध्यम से जाना होगा जो शायद ArrayList द्वारा सर्वोत्तम रूप से लागू किया गया है।

+2

+1 अच्छा जवाब। यहां तक ​​कि यदि .toArray() का उपयोग नहीं किया जाता है, तो दूसरा विकल्प एक प्रकार का पुनरावर्तक है और एक सरणी (ArrayList में अंतर्निहित भंडारण) के माध्यम से पुनरावृत्ति करना किसी और चीज से तेज़ है। तो ArrayList किसी भी मामले में विजेता है। ArrayList के बेहतर उपयोग के लिए – rfeak

+0

, निर्माण करते समय इसे पूर्व-आकार, उदा। 'नया ArrayList (numItems)'। – jtahlborn

+0

@jtahlborn: यह नहीं देख सकता कि इससे कैसे मदद मिलेगी। यदि आप पहले से ही कन्स्ट्रक्टर-दृष्टिकोण का उपयोग करते हैं, और यदि आप 'addAll' विधि का उपयोग करते हैं, तो सुनिश्चित करें कि वैसे भी तत्वों को जोड़ने से पहले क्षमता को आंतरिक रूप से बुलाया जाता है। – aioobe

0

यह आपके स्रोत डेटा पर निर्भर करता है।

अपने स्रोत डेटा पहले से ही एक सरणी है, और सरणी दूसरों के द्वारा उपयोग नहीं किया जाएगा, तो सबसे तेज़ तरीका एक पतली आवरण है:

final Object[] source = ... 

Collection colllection = new AbstractCollection(){ 
    public Object[] toArray(){ return source; } 
    // other methods don't matter 
} 
0

आप स्मृति पदचिह्न बारे में बात कर रहे हैं, तो एक ले में this table पर देखें। Arrays$ArrayList गुम है, लेकिन ArrayList (Arrays.asList(...)) के लिए एक अच्छा विकल्प हो सकता है।

संबंधित मुद्दे