2010-09-29 7 views
26

जावा का उपयोग करना (1.6) क्या सूची में स्पष्ट() विधि को कॉल करना बेहतर है या संदर्भ को फिर से चालू करना बेहतर है?किसी सूची को पुन: प्रारंभ करने या स्पष्ट करने के लिए बेहतर अभ्यास()

मेरे पास एक ऐरेलिस्ट है जो ऑब्जेक्ट्स की अज्ञात संख्या से भरा हुआ है और समय-समय पर "फ्लश" - जहां ऑब्जेक्ट संसाधित होते हैं और सूची साफ़ हो जाती है। एक बार फ्लश हो जाने पर सूची फिर से भर जाती है। फ्लश एक यादृच्छिक समय पर होता है। सूची में संख्या संभावित रूप से छोटी (वस्तुओं के 10s) या बड़ी (लाखों वस्तुओं) हो सकती है।

तो क्या यह बेहतर है कि "फ्लश" कॉल स्पष्ट() या नया ऐरेलिस्ट() हो?

क्या इस तरह के मुद्दों के बारे में चिंता करने लायक है या क्या मुझे वीएम को इसके बारे में चिंता करने देना चाहिए? मैं अपने लिए इस तरह की चीज को काम करने के लिए जावा के मेमोरी पदचिह्न को देखने के बारे में कैसे जा सकता हूं?

किसी भी मदद की बहुत सराहना की।

+0

ऑप्टिमाइज़ेशन हिस्से के बारे में जॉन का जवाब नोट करें - यदि आप उच्च तीव्रता से निपट रहे हैं, और धीमा है, तो इसे प्रोफाइल करें। यदि स्पष्ट समस्या है, तो आप इसके बजाय एक नई सूची बनाने के लिए इसे आसानी से बदलने का परीक्षण कर सकते हैं। लेकिन अन्यथा, सबसे अधिक अर्थपूर्ण रूप से सही उपयोग करें - यानी कोड वास्तव में क्या करने की कोशिश कर रहा है। – aperkins

+0

प्रदर्शन से संबंधित: [नक्शा-स्पष्ट-बनाम-नया-नक्शा-कौन-एक-होगा-बेहतर होगा) (http://stackoverflow.com/questions/6757868/map-clear-vs-new-map-which- एक-बेहतर होगा) – nawfal

उत्तर

29

इस बारे में चिंतित होने वाली मुख्य बात यह है कि अन्य कोड में सूची का संदर्भ हो सकता है। यदि मौजूदा सूची कहीं और दिखाई दे रही है, तो क्या आप चाहते हैं कि वह कोड एक साफ़ सूची देखने के लिए, या मौजूदा रखें?

यदि सूची में कुछ और नहीं देख सकता है, तो शायद मैं इसे साफ़ कर दूंगा - लेकिन प्रदर्शन कारणों से नहीं; सिर्फ इसलिए कि आपने ऑपरेशन का वर्णन किया है लगता है "एक नई सूची बनाएं" से साफ़ करने की तरह।

ArrayList<T> डॉक्स निर्दिष्ट नहीं करते हैं क्या अंतर्निहित डेटा संरचनाओं के लिए होता है, लेकिन ग्रहण में 1.7 कार्यान्वयन को देखते हुए, ऐसा लगता है कि आप शायद clear() के बाद trimToSize() बुलाना चाहिए - अन्यथा आप अभी भी एक बड़ा द्वारा समर्थित एक सूची हो सकता था शून्य संदर्भों की सरणी। (हो सकता है कि यह आपके लिए कोई मुद्दा नहीं है, बेशक ... हो सकता है कि आकार को फिर से बनाने के रूप में सरणी की प्रतिलिपि बनाने से अधिक कुशल हो। आप इसके बारे में और जानेंगे।)

(बेशक एक नई सूची बनाने के लिए पुरानी सूची को सभी सरणी तत्वों को शून्य पर सेट करने की आवश्यकता नहीं है ... लेकिन मुझे संदेह है कि यह ज्यादातर मामलों में महत्वपूर्ण होगा।)

+0

दृश्यता कोई समस्या नहीं है।मुझे स्पष्ट विधि के लिए आपकी तर्क पसंद है, क्योंकि, यह बताता है कि क्या हो रहा है। मैंने पहले कभी trimToSize() नहीं देखा - मैं इसे – Phil

+0

से बाहर देखूंगा, इसके अलावा, क्या आपका मतलब "1.7 कार्यान्वयन" था? निश्चित रूप से ग्रहण जावा 1.7 का समर्थन नहीं करता है (क्योंकि यह अभी तक बाहर नहीं है) या मैंने गलत व्याख्या की है। – Phil

+0

@ फिल: मैं बिल्ड 1.7.0-e-b78 का उपयोग कर रहा हूं। यह इस प्रणाली पर एकमात्र जेवीएम है। यद्यपि इसे जारी नहीं किया गया है, फिर भी उम्र के लिए इसके लिए निर्माण किया गया है, और ग्रहण उस पर चलता है जिसके बिना मैंने देखा है। –

1

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

2

जिस तरह से आप इसका उपयोग कर रहे हैं, यह बहुत अच्छा लगता है कि Queue का उपयोग कैसे किया जाता है। जब आप कतार पर वस्तुओं का काम करते हैं तो उन्हें हटाते समय हटा दिया जाता है।

कतार कक्षाओं में से किसी एक का उपयोग कोड को और अधिक सुरुचिपूर्ण बना सकता है।

ऐसे वेरिएंट भी हैं जो एक अनुमानित तरीके से समवर्ती अपडेट को संभालते हैं।