2010-03-24 10 views
87

जावा संग्रह केवल ऑब्जेक्ट्स स्टोर करते हैं, प्राचीन प्रकार नहीं; हालांकि हम रैपर वर्गों को स्टोर कर सकते हैं।जावा संग्रह सीधे Primitives प्रकार क्यों स्टोर नहीं कर सकते हैं?

यह बाधा क्यों?

+2

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

उत्तर

73

यह एक जावा डिजाइन निर्णय है, और एक है कि कुछ एक गलती करने पर विचार किया गया था। कंटेनर चाहते हैं ऑब्जेक्ट्स और प्राइमेटिव ऑब्जेक्ट से प्राप्त नहीं होते हैं।

यह एक ही स्थान पर जो .NET डिजाइनरों JVM और कार्यान्वित मूल्य प्रकार और जेनरिक ऐसी है कि बॉक्सिंग कई मामलों में निकाल दिया जाता है से सीखा है। सीएलआर में, जेनेरिक कंटेनर अंतर्निहित कंटेनर संरचना के हिस्से के रूप में मूल्य प्रकारों को स्टोर कर सकते हैं।

जावा JVM से समर्थन के बिना संकलक में जेनेरिक समर्थन जोड़ने के लिए 100% का विकल्प चुना। जेवीएम यह है कि, यह "गैर-ऑब्जेक्ट" ऑब्जेक्ट का समर्थन नहीं करता है। जावा जेनेरिक आपको नाटक करने की इजाजत देता है कि कोई रैपर नहीं है, लेकिन आप अभी भी मुक्केबाजी के प्रदर्शन मूल्य का भुगतान करते हैं। कार्यक्रमों के कुछ वर्गों के लिए यह महत्वपूर्ण है।

मुक्केबाजी एक तकनीकी समझौता है, और मुझे लगता है यह भाषा में लीक कार्यान्वयन विस्तार है। Autoboxing अच्छा वाक्य रचनात्मक चीनी है, लेकिन अभी भी एक प्रदर्शन जुर्माना है। यदि कुछ भी हो, तो मैं संकलक को ऑटोबॉक्स करते समय चेतावनी देना चाहता हूं। (मुझे पता है, अब यह है, मैंने 2010 में यह जवाब लिखा था)। अतः बारे में बॉक्सिंग पर

एक अच्छा स्पष्टीकरण: Why do some languages need Boxing and Unboxing?

और आलोचना जावा जेनरिक की: Why do some claim that Java's implementation of generics is bad?

जावा के बचाव में, यह पीछे की ओर देखते हैं और आलोचना करने के लिए आसान है। जेवीएम ने समय की परीक्षा को रोक दिया है, और कई मामलों में एक अच्छा डिजाइन है।

+0

+1। – Thilo

+5

कोई गलती नहीं है, एक सावधानीपूर्वक चुने गए ट्रेडऑफ जो मेरा मानना ​​है कि जावा ने वास्तव में बहुत अच्छी तरह से सेवा की है। – DJClayworth

+12

यह एक गलती थी कि .NET ने इसे सीखा और शुरुआत से ऑटोबॉक्सिंग लागू की, और बॉक्सिंग ओवरहेड के बिना वीएम स्तर पर जेनेरिक। सुधार में जावा का अपना प्रयास केवल एक सिंटैक्स स्तर समाधान था जो अभी भी ऑटोबॉक्सिंग बनाम कोई मुक्केबाजी के प्रदर्शन हिट से पीड़ित नहीं है। जावा के कार्यान्वयन ने बड़ी डेटा संरचनाओं के साथ खराब प्रदर्शन दिखाया है। – codenheim

7

auto-boxing और ऑटो unboxing की अवधारणा नहीं है। यदि आप को List<Integer> में स्टोर करने का प्रयास करते हैं तो जावा कंपाइलर स्वचालित रूप से इसे Integer में परिवर्तित कर देगा।

+0

मुझे लगता है कि यह जावा 1.5 के बाद जोड़ा गया .. ठीक है? – JavaUser

+1

जेनिक्स के साथ जावा 1.5 में ऑटोबॉक्सिंग पेश की गई थी। – Jeremy

+1

लेकिन इसकी एक संकलन समय बात है; प्रदर्शन लाभ के बिना वाक्यविन्यास चीनी। जावा कंपाइलर ऑटोबॉक्स, इसलिए वीएम कार्यान्वयन की तुलना में प्रदर्शन दंड जैसे .NET जेनिक्स में मुक्केबाजी शामिल नहीं है। – codenheim

3

यह वास्तव में एक बाधा नहीं है?

अगर आपको लगता है कि आदिम मान संग्रहीत एक संग्रह बनाना चाहता था पर विचार करें। आप एक संग्रह कैसे लिखेंगे जो या तो int, या float या char स्टोर कर सकता है? सबसे अधिक संभावना है कि आप कई संग्रहों के साथ समाप्त हो जाएंगे, इसलिए आपको एक इंटलिस्ट और चार्लिस्ट आदि की आवश्यकता होगी।

जब आप संग्रह कक्षा लिखते हैं तो जावा की ऑब्जेक्ट उन्मुख प्रकृति का लाभ लेते हुए यह किसी ऑब्जेक्ट को स्टोर कर सकता है ताकि आपको केवल एक की आवश्यकता हो संग्रह वर्ग यह विचार, बहुरूपता, बहुत शक्तिशाली है और पुस्तकालयों के डिजाइन को बहुत सरल बनाता है।

+6

"आप एक संग्रह कैसे लिखेंगे जो या तो int, या float या char स्टोर कर सकता है?"- अन्य भाषाओं की तरह उचित ढंग से कार्यान्वित जेनेरिक/टेम्पलेट्स के साथ जो सबकुछ दिखाते हुए दंड का भुगतान नहीं करते हैं, एक वस्तु है। – codenheim

+0

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

+0

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

9

यह दो तथ्यों का एक संयोजन है:

  • जावा आदिम प्रकार प्रकार को संदर्भित नहीं कर रहे हैं
  • जावा संदर्भ प्रकार के प्रकार के-विलोपन का उपयोग कर जेनरिक करता है (उदाहरण के लिए एक List<?> (जैसे एक int एक Object नहीं है) वास्तव में एक List<Object> रन-टाइम में है)

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

क्या इससे बचा जा सकता है? शायद।

  • तो एक int एक Object है तो सब पर बॉक्स प्रकार के लिए आवश्यकता नहीं है।
  • यदि जेनिक्स टाइप-एरर का उपयोग करके नहीं किया जाता है, तो प्राइमेटिव का उपयोग पैरामीटर के लिए किया जा सकता था।
14

कार्यान्वयन को आसान बनाता है। चूंकि जावा प्राइमेटिव को ऑब्जेक्ट्स नहीं माना जाता है, इसलिए आपको इन प्राइमेटिव्स में से प्रत्येक के लिए एक अलग संग्रह वर्ग बनाना होगा (साझा करने के लिए कोई टेम्पलेट कोड नहीं)।

आप यह कर सकते हैं, ज़ाहिर है, बस GNU Trove, Apache Commons Primitives या HPPC देखें।

जब तक आपके पास वास्तव में बड़े संग्रह नहीं होते हैं, तब तक रैपर के लिए ओवरहेड लोगों के लिए देखभाल करने के लिए पर्याप्त नहीं है (और जब आपके पास वास्तव में बड़े आदिम संग्रह होते हैं, तो आप एक विशेष/उपयोग करने के लिए प्रयास करने के लिए प्रयास करना चाहते हैं उनके लिए डेटा संरचना)।

+0

apache commons primitives और gnu trove उल्लेख के लिए धन्यवाद। उपयोगी कड़ियाँ –

0

मुझे लगता है कि हम इस जेईपी - http://openjdk.java.net/jeps/218 के आधार पर संभवतः जावा 10 में जेडीके में इस जगह में प्रगति देख सकते हैं।

यदि आप आज संग्रह में मुक्केबाजी प्राइमेटिव से बचना चाहते हैं, तो कई तृतीय पक्ष विकल्प हैं। पहले उल्लिखित तृतीय पक्ष विकल्पों के अलावा Eclipse Collections, FastUtil और Koloboke भी है।

आदिम मानचित्रों की तुलना कुछ समय पहले शीर्षक के साथ भी प्रकाशित की गई थी: बड़े हैश मैप ओवरव्यू: JDK, FastUtil, Goldman Sachs, HPPC, Koloboke, Trove। जीएस कलेक्शन (गोल्डमैन सैक्स) लाइब्रेरी को एक्लिप्स फाउंडेशन में माइग्रेट किया गया था और अब ग्रहण संग्रह है।

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