2009-02-22 15 views
11

में impl मुझे डर है कि यह एक सच में बेवकूफ सवाल है, लेकिन यहाँ जाता है:स्पष्ट() जावा के LinkedList

क्यों जावा के डिफ़ॉल्ट LinkedList कार्यान्वयन में स्पष्ट विधि सूची चलना और सभी नोड्स घृणाजनक परेशान करता है? क्यों न केवल शीर्षलेख को अनदेखा करें और शेष सूची को छोड़ दें - जीसी इसे वैसे भी प्राप्त करेगी, नहीं?

/** 
* Removes all of the elements from this list. 
*/ 
public void clear() { 
    Entry<E> e = header.next; 
    while (e != header) { 
     Entry<E> next = e.next; 
     e.next = e.previous = null; 
     e.element = null; 
     e = next; 
    } 
    header.next = header.previous = header; 
    size = 0; 
modCount++; 
} 

यह क्यों चलना:

यहाँ विधि है? क्यों न केवल header.next = header.previous = header; पर जाएं?

सबसे अच्छा मैं समझ सकता हूं कि यह जीसी की मदद करता है ...? यह लिंक http://java.sun.com/docs/books/performance/1st_edition/html/JPAppGC.fm.html#997442 प्रकार का सुझाव देता है कि।

TIA ...

उत्तर

18

उनकी विधि सुनिश्चित करता है कि भले ही अन्य कोड अभी भी विशेष नोड्स के लिए संदर्भ रखती है, अन्य नोड GC'ed कर दिया जाएगा।

अन्यथा, नोड्स में से एक के लिए भी एक बाहरी संदर्भ पूरे श्रृंखला को एकत्र होने से रोक देगा।

इसके अलावा, सूची में अन्य कार्यों (subList() या Collections.unmodifiableList(), iterators के माध्यम से जैसे विचारों में) एक साथ चल रहा हो सकता है, और यह उन चीजों के रूप में "खाली" सूची मानता है कि तुरंत सुनिश्चित करता है।

+0

मैं असहमत होने के लिए तैयार था, कह रहा था कि बाहरी कोड को लिंक्डलिस्ट $ एंट्री का संदर्भ प्राप्त करने का कोई तरीका नहीं है ... लेकिन अप्रत्यक्ष रूप से लिंक्डलिस्ट $ ListItr के माध्यम से आप निश्चित रूप से कर सकते हैं ... धन्यवाद और अच्छी पकड़! – overthink

+0

एक नोड पकड़ेगा क्या होगा? एक इटरेटर या सबलिस्ट, लेकिन ये वैध नहीं होंगे, इसलिए ध्यान रखने के बारे में नहीं। –

+0

@ टॉम: यदि आपने ऐसा नहीं किया है तो उपसूची और इटरेटर काम करना जारी रखेंगे, लेकिन संग्रह ढांचा विफल होने की कोशिश करता है (लेकिन इसकी गारंटी नहीं देता है)। –

2

आईआईआरसी, यह कुछ (पीढ़ी) जीसी एल्गोरिदम के प्रदर्शन में सहायता के लिए जेडीके 6 में किया गया एक बदलाव था। अक्सर, List स्वयं और पुराने नोड्स कुछ अन्य नोड्स की तुलना में पुरानी पीढ़ी में होंगे। युवा पीढ़ियों को अधिक बार एकत्रित किया जाएगा, जिसके परिणामस्वरूप युवा नोड्स की खोज की जाती है इससे पहले कि यह पता चला कि सभी नोड्स कचरे हैं।

तो यह मामूली प्रदर्शन अनुकूलन है। मेमोरी प्रदर्शन अनुकूलन उसमें थोड़ा अजीब है, अक्सर यह कोड नहीं है जो समस्या उत्पन्न कर रहा है जो निष्पादित करने के लिए अतिरिक्त समय ले रहा है।

0

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

0

के स्रोत कोड java.util.LinkedListhttp://developer.classpath.org/doc/java/util/LinkedList-source.html पर पता चलता है कि आप बस शून्य पर पहली और आखिरी तत्वों सेट कर सकते हैं।

बेशक यदि आप सुरक्षात्मक होने की स्थिति में हैं, तो आप पूरी चीज से लूप कर सकते हैं। मैं व्यक्तिगत रूप से सोचता हूं कि यदि आपकी सूची में हजारों तत्व हैं तो यह एक बहुत महंगा काम हो सकता है।

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