ArrayList के लिए प्रारंभिक आकार


257

आप एक ArrayList के लिए प्रारंभिक आकार निर्धारित कर सकते हैं

ArrayList<Integer> arr=new ArrayList<Integer>(10);

हालाँकि, आप ऐसा नहीं कर सकते

arr.add(5, 10);

क्योंकि यह सीमा के अपवाद का कारण बनता है।

यदि आप आवंटित स्थान का उपयोग नहीं कर सकते हैं, तो प्रारंभिक आकार सेट करने का क्या उपयोग है?

ऐड फ़ंक्शन को परिभाषित किया जाता है, add(int index, Object element)इसलिए मैं इंडेक्स 10 में नहीं जोड़ रहा हूं।


52
दरअसल, डॉक्स से यह स्पष्ट नहीं है कि सूची में आपको कम से कम n आइटम जोड़ने की आवश्यकता है, इससे पहले कि आप n-1 को set/addआइटम कर सकें ।
धारणा

5
धारणा: मुझे नहीं पता कि यह स्पष्ट है, लेकिन यह निर्दिष्ट है। किसी को JavaDoc को ध्यान से पढ़ना होगा।
नेटिक्स

3
एचएम, निर्माता कहते हैं, "निर्दिष्ट प्रारंभिक क्षमता के साथ एक खाली सूची का निर्माण करता है।", एक खाली सूची की धारणा को लेते हुए, वहाँ एक सूचकांक 5 हो सकता है। लेकिन मैं मानता हूं कि यह पहली नज़र में नहीं दिखाई दे सकता है ...
quaylar

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

1
क्या इस तरह संग्रह बनाया गया है? यह चर-लंबाई वाले तत्वों (यानी ArrayList <string []> जहां प्रत्येक सरणी की एक अलग लंबाई हो सकती है) के साथ संरचना के समानांतर तात्कालिकता के लिए निरर्थक कार्य करता है। यदि मेमोरी पहले से ही आबंटित है, तो एन तत्वों को जोड़ने के बाद सूची को पुनः प्राप्ति की आवश्यकता नहीं है, उन सूचकांकों को शुरू से ही सीधे पहुंच योग्य होना चाहिए। Oracle में कोई भी C / C ++, C #, ऑब्जेक्टिव C और स्विफ्ट के बाद इस पैटर्न को नहीं सीख पाया है?
patrickjp93

जवाबों:


387

आप अपनी क्षमता से सरणी सूची के आकार को भ्रमित कर रहे हैं:

  • आकार सूची में तत्वों की संख्या है,
  • क्षमता कितने तत्वों सूची संभवतः की आंतरिक संरचना के पुनः दिए बिना समायोजित कर सकते हैं है।

जब आप कॉल new ArrayList<Integer>(10)करते हैं, तो आप सूची की प्रारंभिक क्षमता निर्धारित कर रहे हैं , इसका आकार नहीं। दूसरे शब्दों में, जब इस तरीके से निर्माण किया जाता है, तो सरणी सूची अपना जीवन खाली करना शुरू कर देती है।

लूप का उपयोग करके सरणी सूची में दस तत्वों को जोड़ने का एक तरीका है:

for (int i = 0; i < 10; i++) {
  arr.add(0);
}

ऐसा करने के बाद, आप अब तत्वों को 0..9 पर संशोधित कर सकते हैं।


51
+1: छोटा लूप है while(arr.size() < 10) arr.add(0);यह कहना उपयोगी हो सकता है, आकार कम से कम होना चाहिए 10। उदाहरण के लिए, आप उपयोग कर सकते हैंarr.set(9, n);
पीटर लॉरी

10
+1: शानदार प्रतिक्रिया, अगर मैं कर सकता तो मैं +10 देता। यह एपीआई से तुरंत स्पष्ट नहीं है कि आप किसी एकल निर्माता कॉल में प्रारंभिक आकार और प्रारंभिक क्षमता क्यों सेट नहीं कर सकते। आप एपी के माध्यम से पढ़ना चाहते हैं और कहते हैं "ओह, मुझे लगता है कि ArrayList के पास ऐसा करने के लिए कोई विधि या निर्माता नहीं है"
डेमोन्गोलम

@PeterLawrey आपका कोड छोटा हो सकता है, लेकिन केवल एक के बजाय दो विधि कॉल प्रति लूप पुनरावृत्ति को समाहित करता है।
तंत्रिका

@neuralmer मुझे आकार की उम्मीद है () और जोड़ () को इनलाइन किया जाएगा ताकि कोई वास्तविक विधि कॉल रनटाइम पर न हो।
पीटर लॉरी

109

यदि आप एक पूर्वनिर्धारित आकार के साथ एक सूची चाहते हैं तो आप भी उपयोग कर सकते हैं:

List<Integer> arr = Arrays.asList(new Integer[10]);

11
यहाँ थोड़ा नुकसान, परिणामस्वरूप Listनल से भरा हुआ है। अमरूद के साथ हम कर सकते हैं Ints.asList(new int[10])जो हमारी सूची को 0एस के साथ आरंभ करेगा । स्वच्छ पैटर्न हालांकि, उदाहरण के लिए धन्यवाद।
19o में dimo414

1
सवाल ArrayList <E> के बारे में बात करता है। आप सूची <E> का उपयोग कर रहे हैं। इस पर किसी ने गौर नहीं किया ??? इसके अलावा, उन्होंने इस अप्रासंगिक उत्तर को उखाड़ फेंका है ! मैं आपके उत्तर को अस्वीकार नहीं करता क्योंकि मैं कभी नहीं करता। बस ... Godssake!
अपोस्टोलोस

3
@ एपोस्टोलोस इंटरफ़ेस ArrayListका कार्यान्वयन है Listऔर Arrays.asListरिटर्न ए ArrayList। मेरा सुझाव है कि आप बहुरूपता को देखें।
लियाम पोटर

हालांकि यह एक निश्चित आकार के साथ एक सूची देता है। अधिक तत्वों को जोड़ने की कोशिश कर रहा हैUnsupportedOperationException
कोरा तुगे

47

यदि आप कलेक्शंस का उपयोग करना चाहते हैं।फिल (सूची, obj); वैकल्पिक रूप से बार-बार ऑब्जेक्ट के साथ सूची को भरने के लिए आप उपयोग कर सकते हैं

ArrayList<Integer> arr=new ArrayList<Integer>(Collections.nCopies(10, 0));

पंक्ति आपके ArrayList में 10 बार 0 कॉपी करती है


20

क्षमता एक की ArrayListअपनी के समान नहीं है आकारआकारArrayList (और किसी भी Listकार्यान्वयन) में निहित तत्वों की संख्या के बराबर है ।

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

set(index, element)सूची पर कॉल करते समय, indexसूची तत्वों (= आकार) की वास्तविक संख्या से संबंधित है (जो आपके कोड में शून्य है, इसलिए AIOOBEइसे फेंक दिया गया है), सरणी लंबाई (= क्षमता) के लिए नहीं (जो कार्यान्वयन विवरण विशिष्ट है) को ArrayList)।

यह setविधि सभी Listकार्यान्वयनों के लिए सामान्य है , जैसे कि LinkedList, जो वास्तव में किसी सरणी द्वारा कार्यान्वित नहीं की जाती है, लेकिन प्रविष्टियों की लिंक की गई श्रृंखला के रूप में।

संपादित करें : आप वास्तव में add(index, element)विधि का उपयोग करते हैं , नहीं set(index, element), लेकिन सिद्धांत यहाँ एक ही है।


10

यदि आप तत्वों को अनुक्रमणिका के साथ जोड़ना चाहते हैं, तो आप इसके बजाय एक सरणी का उपयोग कर सकते हैं।

    String [] test = new String[length];
    test[0] = "add";

5
ओपी शुरू में एक सूची का उपयोग करना चाहता था ... एक सरणी नहीं।
Stephan

9

10 एएल की प्रारंभिक क्षमता है, न कि आकार (जो 0 है)। जब आप बहुत सारे तत्व रखने जा रहे हैं तो आपको कुछ उच्च मूल्य के लिए प्रारंभिक क्षमता का उल्लेख करना चाहिए, क्योंकि यह क्षमता का विस्तार करने से बचता है क्योंकि आप तत्वों को जोड़ते रहते हैं।


6

मुझे लगता है कि आपके प्रश्न का सटीक उत्तर होगा:

एक ArrayList पर एक intial size सेट करना nr को कम करता है। बार-बार आंतरिक मेमोरी री-एलोकेशन होना पड़ता है। सूची एक सरणी द्वारा समर्थित है। यदि आप प्रारंभिक क्षमता 0 निर्दिष्ट करते हैं, तो पहले से ही एक तत्व के पहले सम्मिलन में आंतरिक सरणी को आकार बदलना होगा। यदि आपको इस बात का अंदाजा है कि आपकी सूची में कितने तत्व होंगे, तो प्रारंभिक क्षमता सेट करने से एनआर कम हो जाएगा। जब आप सूची का उपयोग करते हैं तब मेमोरी पुनः आवंटन हो रहा है।



3

यह देर से हो रहा है, लेकिन जावा 8 के बाद , मैं व्यक्तिगत रूप से Streamएपीआई के साथ इस दृष्टिकोण को अधिक संक्षिप्त रूप में पाता हूं और स्वीकृत उत्तर का विकल्प हो सकता है ।

उदाहरण के लिए,

Arrays.stream(new int[size]).boxed().collect(Collectors.toList())

sizeवांछित Listआकार कहां है और यहां बताए गए नुकसान के बिना , सभी तत्व Listप्रारंभिक रूप में हैं 0

(मैंने त्वरित खोज की और streamपोस्ट किए गए किसी भी उत्तर में नहीं देखा - बेझिझक मुझे बताएं कि क्या यह उत्तर निरर्थक है और मैं इसे हटा सकता हूं)


1

अभी आपकी सूची में कोई तत्व नहीं हैं, इसलिए आप सूची के 5 को जोड़ नहीं सकते जब यह मौजूद नहीं है। आप सूची की क्षमता को उसके वर्तमान आकार के साथ भ्रमित कर रहे हैं।

बस कॉल करना:

arr.add(10)

अपने ArrayList में पूर्णांक जोड़ने के लिए


1

हालाँकि आपकी सरणी सूची में 10 की क्षमता है, लेकिन वास्तविक सूची में कोई तत्व नहीं है। किसी सूची को वास्तविक सूची में डालने के लिए ऐड मेथड का उपयोग किया जाता है। चूंकि इसमें कोई तत्व नहीं है, आप 5 के सूचकांक में एक तत्व नहीं डाल सकते।


1

यदि आप अपने लिए 10 आइटम जोड़ना चाहते हैं तो आप ArrayListकोशिश कर सकते हैं:

for (int i = 0; i < 10; i++)
    arr.add(i);

यदि आपने पहले से ही एक सरणी आकार चर घोषित कर दिया है, तो आप sizeसंख्या '10' के बजाय चर का उपयोग करेंगे ।


1

मुझे इसी तरह के मुद्दे का सामना करना पड़ा, और बस सरणी जानने वाला सूची इंटरफ़ेस का एक बदलने योग्य-सरणी कार्यान्वयन है, मुझे यह भी उम्मीद है कि आप किसी भी बिंदु पर तत्व जोड़ सकते हैं, लेकिन कम से कम प्रारंभिक आकार को परिभाषित करने का विकल्प है। वैसे भी, आप पहले एक सरणी बना सकते हैं और उसे सूची में बदल सकते हैं:

  int index = 5;
  int size = 10;

  Integer[] array = new Integer[size];
  array[index] = value;
  ...
  List<Integer> list = Arrays.asList(array);

या

  List<Integer> list = Arrays.asList(new Integer[size]);
  list.set(index, value);

0

ArrayList myList = नया ArrayList (10);

//  myList.add(3, "DDD");
//  myList.add(9, "III");
    myList.add(0, "AAA");
    myList.add(1, "BBB");

    for(String item:myList){
        System.out.println("inside list : "+item);
    }

/ * सरणी सूची की प्रारंभिक capasity घोषणा आंतरिक रूप से स्थानांतरण समय की बचत के अलावा कुछ भी नहीं है; जब हम तत्व को आंतरिक रूप से जोड़ते हैं तो यह कैपेसिटी को बढ़ाने के लिए कैपेसिटी की जांच करता है, आप तत्व को शुरुआत में 0 इंडेक्स में जोड़ सकते हैं फिर 1 और इसी तरह। * /


0

मेरे दो सेंट Stream। मुझे लगता है कि इसका उपयोग करना बेहतर है

IntStream.generate(i -> MyClass.contruct())
         .limit(INT_SIZE)
         .collect(Collectors.toList());

किसी भी प्रारंभिक मूल्यों को रखने के लिए लचीलेपन के साथ।

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