अलग-अलग जावा संग्रह में अलग-अलग डिफ़ॉल्ट क्षमता क्यों है?


11

विभिन्न संग्रह रचनाकारों को देखकर सवाल दिमाग में आता है। ArrayList () दस की प्रारंभिक क्षमता के साथ एक खाली सूची का निर्माण करता है और ArrayDeque () 16 तत्वों को धारण करने के लिए पर्याप्त प्रारंभिक क्षमता के साथ एक खाली सरणी deque का निर्माण करता है।


मैं नया था क्षमता क्षमता नहीं थी। मैं बस जोड़ने के साथ नए तत्वों को जोड़ने ()। यह हमेशा काम करता है।
ट्यूलेंस कोर्डोवा

1
मुझे लगता है कि वह ArrayList कार्यान्वयन के अंदर सरणी के प्रारंभिक सरणी आकार के बारे में बात कर रहा है। जैसा कि इसके नाम का अर्थ है, ArrayList कवर के नीचे एक सादा-पुराना सरणी है, और जब आप इसके वर्तमान सरणी आकार की तुलना में अधिक तत्वों को जोड़ने का प्रयास करते हैं तो यह स्वचालित रूप से बड़े सरणियों का निर्माण करता है।
dsw88

1
मुझे लगता है कि StringBuilder एक और एक डिफ़ॉल्ट क्षमता है, क्या यह 10 या 16 थी?
इंगो

@ इंगो दिलचस्प। मुझे क्षमता से अधिक संग्रहित चीजों के बारे में भी जानकारी नहीं थी, लेकिन मुझे लगता है कि यह समझ में आता है। उस समय क्षमता के लिए कोई टैग नहीं था, इसलिए मैंने अन्य उपयोगों में ज्यादा दिलचस्पी नहीं जगाई।
ओल्ड बैडमैन ग्रे

जवाबों:


17

संक्षिप्त जवाब

क्योंकि ArrayDeque क्षमता दो की शक्ति होनी चाहिए, और 16 दो की सबसे छोटी शक्ति है जो कम से कम 10 है।


ArrayDeque को एक रैखिक सरणी के चारों ओर लपेटने के लिए हर जगह बहुत सारे% संचालन का उपयोग करने की आवश्यकता होती है जो परिपत्र होने का दिखावा करता है।

a % bके रूप में व्यक्त किया जा सकता a & (b - 1) है, तो b दोनों में से एक शक्ति है। बिटवाइज़ और बड़े पैमाने पर तेज़ है इसलिए ArrayDeque की क्षमता दो की शक्ति तक सीमित है। कार्यान्वयन में वास्तविक% के बजाय सभी% संचालन बिटमास्किंग के साथ किए जाते हैं।

यही कारण है कि नए HashMap प्राइम नंबर टेबल आकारों का उपयोग नहीं करता है , लेकिन दो की शक्ति , फिर से क्योंकि% ऑपरेशन को इतनी बार और बिटवाइज़ प्रदर्शन करने की आवश्यकता होती है और यह बहुत तेज़ है।

इसलिए यदि आधार रेखा 10 है, तो दो सीमाओं की शक्ति वाली संरचनाओं को 16 उपयोग करना चाहिए यह दो की सबसे छोटी शक्ति है जो कम से कम 10 है।


3

इस संभावना को बाहर न करें कि कोई विशिष्ट कारण नहीं है।

यह हो सकता है कि ये दोनों संग्रह अलग-अलग टीमों द्वारा लिखे गए हों। दोनों ने एक छोटी संख्या को डिफ़ॉल्ट क्षमता के रूप में चुना, लेकिन पहली टीम ने निर्णायक रूप से सोचा और 10 का चयन किया, जबकि दूसरी टीम ने द्विआधारी सोचा और 16 का चयन किया।


1

@ एस्लेइजा का जवाब इस विशिष्ट मामले के लिए अच्छा है।

आमतौर पर हालांकि, यह एक ऐसा व्यापार है जो कई कारकों पर निर्भर करता है। मैं कुछ उदाहरण दूंगा:

  • आमतौर पर डेटा संरचना का उपयोग कैसे किया जाता है ? डेटा संरचनाएं जो डेटा बफ़र्स के रूप में उपयोग की जाती हैं, आमतौर पर छोटे ट्यूपल्स के लिए उपयोग किए जाने वाले डेटा संरचनाओं की तुलना में बहुत अधिक क्षमता को पसंद करती हैं, उदाहरण के लिए।
  • आपके लक्ष्य CPU प्लेटफॉर्म पर कैश लाइन में डेटा का डिफ़ॉल्ट आकार क्या है? अगर कैश लाइन में डिफ़ॉल्ट फिट बैठता है तो यह प्रदर्शन के लिए एक बड़ा अंतर बना सकता है। 10 का विकल्प जावा में एक डिफ़ॉल्ट के रूप में है क्योंकि अच्छी तरह से हो सकता है क्योंकि 10 32-बिट शब्दों के साथ-साथ 64 बाइट कैश लाइन में सरणी / ऑब्जेक्ट ओवरहेड फिट बैठता है।
  • आप अंतरिक्ष की अधिकतम रनटाइम दक्षता को कितना महत्व देते हैं ? यदि आप बेहतर रनटाइम प्रदर्शन चाहते हैं, तो बाद में अतिरिक्त री-आवंटन से बचने के लिए अधिक स्थान पूर्व-आवंटित करना बेहतर है।

इन ट्रेड-ऑफ के परिणामस्वरूप, यह काफी समझ में आता है कि विभिन्न संग्रह कार्यान्वयन में एक अलग इष्टतम डिफ़ॉल्ट क्षमता हो सकती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.