2011-03-01 11 views
26

मुझे लगता है कि मैं जिस परियोजना पर काम कर रहा हूं उस पर लिंकडलिस्ट। क्लीयर() ओ (1) था, क्योंकि मैंने अपने उपभोक्ता में अवरुद्ध करने के लिए एक लिंक्डलिस्ट का उपयोग किया था इसके बाद बाद में लिंक्डलिस्ट को उच्च थ्रूपुट, समाशोधन और पुन: उपयोग करने की आवश्यकता है।LinkedList.Clear() ओ (1)

बदल जाता है बाहर है कि इस धारणा है, गलत था के रूप में (OpenJDK) कोड करता है:

Entry<E> e = header.next; 
    while (e != header) { 
     Entry<E> next = e.next; 
     e.next = e.previous = null; 
     e.element = null; 
     e = next; 
    } 

इसमें कुछ समय आश्चर्य की बात थी, देखते हैं किसी भी अच्छे कारण के LinkedList.Clear सकता है बस नहीं अपने हैडर "भूल" .next और header.previous सदस्य?

// Clearing all of the links between nodes is "unnecessary", but: 
// - helps a generational GC if the discarded nodes inhabit 
// more than one generation 
// - is sure to free memory even if there is a reachable Iterator 

कि यह काफी स्पष्ट करता है कि वे क्यों कर रहे हैं:

+1

http://www.docjar.com/html/api/java/util/LinkedList.java.html सद्भावना में यह है (1) – Bozho

+1

अच्छी व्याख्या आप यहां पा सकते हैं: http://stackoverflow.com/questions/575,995/साफ-impl-इन-Javas-linkedlist। जेसन – smas

उत्तर

31

संस्करण मैं ग्रहण में (1.7.0-EA-b84 निर्माण) पर देख रहा हूँ में स्रोत कोड उनके ऊपर इस टिप्पणी है हालांकि, हालांकि मैं मानता हूं कि यह थोड़ा खतरनाक है कि यह ओ (1) ऑपरेशन को ओ (एन) में बदल देता है।

+0

द्वारा उत्तर दिया गया, धन्यवाद - उन टिप्पणियों में 1.6 स्रोतों में नहीं थे :-) – Leri

+2

आइए आशा करें कि सभी नोड्स रैम में मौजूद पृष्ठों पर हैं, अन्यथा .... –

+0

एकमात्र समाधान जो मैं उस समस्या को देखता हूं एक कस्टम स्पष्ट विधि के साथ कक्षा का विस्तार करना होगा। सही नहीं होना मुश्किल है (आप मूल कार्यान्वयन पर सभी के बाद देख सकते हैं और केवल पुनरावृत्ति को हटा सकते हैं), लेकिन फिर भी ऐसा कुछ नहीं जो मैं करना चाहता हूं। खराब एपीआई डिजाइन imho। – Voo

0

चूंकि मैं उत्तर (?) पर टिप्पणी करने में सक्षम नहीं लग रहा हूं: अगले और पिछले के बीच पॉइंटर्स कोई फर्क नहीं पड़ता। चूंकि किसी भी आंतरिक प्रविष्टि को किसी भी जीसी रूट से सुलभ नहीं किया जाएगा, इसलिए पूरी संरचना एकत्र की जाएगी। अगर जावा एक refcounting कलेक्टर का इस्तेमाल किया था, हम चक्र की समस्या से अटक जाएगा।

सही जवाब जॉन स्कीट ने नोट किया है।

3

जबकि मैं जीसी अनुकूलन के कारण बहुत प्रभावित नहीं कर रहा हूँ - यह स्पष्ट रूप से अपने मामले में उल्टा पड़ता दाँव -

समाशोधन और LinkedList

कि सही नहीं लग रहा पुन: उपयोग। क्यों न केवल एक नया नया लिंक्डलिस्ट ऑब्जेक्ट बनाएं?

+0

पुरानी सूची के माध्यम से आंशिक रूप से एंट्री नोड्स में से एक के लिए एक मौजूदा संदर्भ पुरानी सूची को देखना जारी रखेगा, और इसके माध्यम से फिर से सक्षम हो जाएगा। (यह टिप्पणी के दूसरे भाग से संबंधित है, और जीसी के साथ कुछ लेना देना नहीं है।) – Oddthinking

+0

स्पष्ट रूप से सूची में एक और संदर्भ नहीं है। – irreputable

+0

आप सही हैं कि यहां एक नई लिंक्डलिस्ट बनाने से पूरी समस्या से छुटकारा पड़ेगा। अंत में मैं वास्तव में एक ऐरेलिस्ट पर स्विच करता हूं, स्पष्ट() ओ (एन) है, हम अभी भी इसे बेहतर प्रदर्शन करने के लिए मापते हैं, हमारे विशिष्ट मामले के लिए, हमारी लिंक्ड सूची एकत्रित कचरा अकेले 150-200 एमबी/सेकंड कचरा आंतरिक लिंक्ड सूची नोड्स (आम तौर पर हम इस तरह की चीजों की परवाह नहीं करेंगे, लेकिन इस विशेष ऐप के लिए हमें वास्तव में यह करना होगा) – Leri

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