2012-03-24 20 views
19

मैं जावा के ArrayList के स्रोत पढ़ रहा था और मैं इसके समर्थन सरणी घोषणा भर में आया था:ऐरेलिस्ट क्षणिक भंडारण का उपयोग क्यों करता है?

private transient Object[] elementData; 

क्यों क्षणिक इस जरूरत है? इस वर्ग को क्रमबद्ध क्यों नहीं किया जा सकता है?

सहायता के लिए धन्यवाद!

उत्तर

23

यह क्रमबद्ध किया जा सकता है; ArrayList कक्षा डिफ़ॉल्ट तंत्र का उपयोग करने के बजाय, चीजों का ख्याल रखती है। उस श्रेणी में writeObject() और readObject() विधियों को देखें, जो मानक क्रमिकरण तंत्र का हिस्सा हैं।

यदि आप स्रोत को देखते हैं, तो आप देखते हैं कि writeObject() बैकिंग सरणी को सहेज नहीं देता है। इसके बजाय, यह size() सीमा तक एक समय में तत्वों (शून्य मान सहित) को क्रमबद्ध करता है। यह सरणी के क्रम में, और विशेष रूप से किसी भी अप्रयुक्त स्लॉट सरणी को क्रमबद्ध करने के ऊपरी भाग से बचाता है। Deserialization पर, न्यूनतम आवश्यक आकार की एक नई बैकिंग सरणी readObject() द्वारा बनाई गई है।यदि चर serializable नहीं है, तो क्रमबद्धता तंत्र एक अपवाद है जब यह चर क्रमानुसार करने की कोशिश करता है फेंक होगा

5

यह क्षणिक होने की आवश्यकता क्यों है?

यह करता है यह क्योंकि यह कस्टम readObject और writeObject तरीकों कि डिफ़ॉल्ट से क्रमबद्धता का एक बेहतर काम कर सकते हैं। विशेष रूप से, writeObject विधि केवल आकार और तत्वों के अनुक्रम लिखता है। यह निजी सरणी ऑब्जेक्ट को क्रमबद्ध करने से बचाता है, जिसमें 1) का अपना हेडर और ओवरहेड्स होता है, और 2) आमतौर पर null एस के साथ गद्देदार होता है। अंतरिक्ष की बचत महत्वपूर्ण हो सकती है।

(वास्तव में, मुझे नहीं लगता कि उस क्षेत्र सख्ती से जरूरत बिल्कुल transient के रूप में घोषित किया जाना है, लेकिन यह डेवलपर के इरादे दस्तावेज़ के लिए मदद करता है।)

क्यों कर सकते हैं ' इस वर्ग को क्रमबद्ध किया जा सकता है?

एक पूरे के रूप ArrayList वर्ग धारावाहिक जा सकता है। Object[] को क्रमबद्ध किया जा सकता है, लेकिन उन्होंने इसे एक और तरीके से लागू करना चुना।


1 - वास्तव में, यह तत्व 'क्रम प्रकार पर निर्भर करता है। उदाहरण के लिए, यदि आपने ArrayList को Thread संदर्भों को क्रमबद्ध करने का प्रयास किया है, तो आपको पहले गैर-शून्य संदर्भ के लिए रनटाइम अपवाद मिलेगा।

1

क्योंकि यह स्पष्ट क्रमबद्धता लागू करता है। ArrayList # writeObject देखें।

3

ArrayListSerializable लागू करता है, तो यह धारावाहिक जा सकता है, कि वास्तव में क्यों निजी समर्थन सरणी transient है, तो यह कक्षा में अन्य डेटा के साथ धारावाहिक नहीं है, के बाद से सभी ArrayList के writeObject और readObject द्वारा नियंत्रित किया जाता तरीकों।

1

चर serializable

  • नहीं है। इससे बचने के लिए, आप परिवर्तनीय को क्षणिक घोषित कर सकते हैं।

चर अनावश्यक है

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

लिंक: http://onjava.com/pub/a/onjava/excerpt/JavaRMI_10/index.html?page=3