2011-01-04 12 views
10

संभव डुप्लिकेट:
storing primitive values in a java collection?जावा संग्रह। कोई आदिम प्रकार क्यों नहीं?

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

उत्तर

2

ऐसी वस्तुएं हैं जिन्हें "रैपर" कहा जाता है जो सभी प्राचीन प्रकारों का प्रतिनिधित्व करते हैं। उदाहरण के लिए, Integer नामक एक कक्षा है जो int का समर्थन करती है। आप संग्रह में मूल्य रखने के लिए आदिम रैपर का उपयोग कर सकते हैं।

आदिम प्रकारों (कम से कम जावा 5 तक) की समस्या यह है कि वे आधार Object कक्षा से विस्तारित नहीं हुए हैं। सभी संग्रहों को वे सभी विधियों के लिए कक्षा निर्दिष्ट करने की आवश्यकता है - और वे Object निर्दिष्ट करते हैं, क्योंकि Object सभी कक्षाओं का आधार है।

जावा 5 के अनुसार, आप पाएंगे कि जब जावा की आवश्यकता हो तो जावा एक आदिम और इसके संबंधित रैपर वर्ग के बीच निश्चित रूप से स्विच करेगा। इसका मतलब है कि आप एक संग्रह में int, या double इत्यादि जोड़ सकते हैं। वीएम स्वचालित रूप से आपके लिए एक रैपर वर्ग में आदिम लपेटेगा और संग्रह में रैपर रखेगा।

+6

"आदिम प्रकारों (कम से कम जावा 5 तक) समस्या ..." और बाद के संस्करण भी। यद्यपि अब ऑटो-मुक्केबाजी है, फिर भी प्राचीन प्रकार के लिए कोई सामान्य आधार वर्ग नहीं है। –

5

भंडारण unwrapped पुरातन नाटकीय रूप से संग्रह कोड को मुश्किल होगा। जबकि, रैपर के साथ (Integerint, आदि के लिए), कोड काफी सीधे आगे है। कई सालों से, जावा ने "ऑटो-मुक्केबाजी" का समर्थन किया है, जिसका अर्थ है कि यदि आप int देते हैं, जहां Integer की अपेक्षा की जाती है, तो int आपके लिए Integer उदाहरण (और इसके विपरीत) में लपेटा गया है।

1

विकिपीडिया पर इस लेख को पढ़ें। यह मदद कर सकता है: http://en.wikipedia.org/wiki/Object_type_(object-oriented_programming)#Autoboxing

कंप्यूटर विज्ञान में, एक वस्तु प्रकार (उर्फ लपेटकर वस्तु) एक डेटाप्रकार जो यह की तरह लग रहे बनाने के लिए एक गैर ऑब्जेक्ट प्रकार रैप करने के लिए वस्तु उन्मुख प्रोग्रामिंग में प्रयोग किया जाता है एक गतिशील वस्तु।

कुछ ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग भाषाओं संदर्भ और मूल्य प्रकार के बीच एक अंतर है, अक्सर वस्तुओं के रूप में भेजा और प्लेटफार्मों पर गैर वस्तुओं जहां जटिल मूल्य प्रकार मौजूद नहीं है इस तरह के क्रम के रूप में कारणों के लिए, दक्षता और वाक्यविन्यास या अर्थपूर्ण मुद्दों। उदाहरण के लिए, जावा आदिम आवरण वर्गों प्रत्येक आदिम प्रकार के अनुरूप है: पूर्णांक और पूर्णांक, चरित्र और चार, फ्लोट और नाव, सी ++ संदर्भ प्रकार के कम या कोई धारणा है की तरह आदि बोली; इस प्रकार, ऑब्जेक्ट प्रकार का उपयोग थोड़ा हित नहीं है।

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

इस दरकिनार करने के लिए, ints पूर्णांकों, जो गतिशील वस्तुओं रहे हैं में बॉक्सिंग किया जा सकता है, और फिर पूर्णांकों की एक LinkedList को जोड़ा गया। अन्य ओर (सामान्य पैरामिट्रीकृत J2SE 5.0 में पेश प्रकार का उपयोग करना, इस प्रकार LinkedList के रूप में प्रतिनिधित्व किया है।), सी # एक सामान्य वस्तु संदर्भ लौटने कक्षाएं नहीं आदिम आवरण है, लेकिन किसी भी मान प्रकार की मुक्केबाजी अनुमति देता है।

बॉक्स की गई वस्तु हमेशा मूल्य वस्तु की एक प्रति है, और आमतौर पर अपरिवर्तनीय है। ऑब्जेक्ट को अनबॉक्स करना संग्रहित मान की एक प्रति देता है। के बाद से यह गतिशील नई वस्तुओं आवंटित और फिर उन्हें कचरा संग्रह के लिए पात्र बनाती ध्यान दें कि मुक्केबाजी और वस्तुओं की unboxing दोहराया, एक गंभीर प्रदर्शन प्रभाव हो सकता है।

7

वहाँ यह कर के खिलाफ कुछ बाधा नहीं है?

आप ArrayList के निकट-समान संस्करणों को लिख सकते हैं जो कि गैर-वर्ग प्रकारों में से किसी एक को स्टोर करने के लिए तैयार किए गए थे, उदाहरण के लिए IntegerArrayList और इसी तरह। इसके खिलाफ बाधा यह है कि इस तरह के वर्गों का विस्फोट होगा, क्योंकि आप संग्रह प्रकारों की संख्या से आदिम प्रकारों की संख्या को गुणा करेंगे। मानक संग्रह ढांचे को व्यवस्थित रखने के लिए, यह अस्वीकार कर दिया गया था।

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

0

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

1

वर्तमान में सीधे संग्रह में प्राइमेटिव स्टोर करने का एकमात्र तरीका है, प्रत्येक आदिम प्रकार के लिए एक संग्रह है। TIntArrayList।

आपको यह पता चलने की संभावना है कि भले ही एरेलिस्टिस्ट प्राइमेटिव्स का उपयोग करने से धीमा है, यह 9 0% उपयोग के मामलों के लिए पर्याप्त तेज़ है।

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