Arrays.asList () बनाम संग्रह.सिंघटनलिस्ट ()


138

क्या Arrays.asList (कुछ) का उपयोग करने के लिए Collections.singletonList (कुछ) से अधिक का उपयोग करने के लिए एक वस्तु है जिसमें एक सूची है? उत्तरार्द्ध लौटी हुई सूची को भी अपरिवर्तनीय बनाता है।


8
आप अमरूद के फेंक कर सकते हैं ImmutableList.of()और Lists.newArrayList()मिश्रण में रूप में अच्छी तरह।
biziclop

इसके एक तरफ के रूप में, मेरे पास कलेक्शंस हैं। जब एक विधि एक सूची देती है जो बाद में डाउनस्ट्रीम में संशोधित होती है तो समस्याएं होती हैं।
हावर्ड ग्रिमबर्ग

1
जावा 10 में सच्ची अपरिवर्तनीय सूची है: stackoverflow.com/a/52536126/1216775
akhil_mittal

जवाबों:


207

Collections.singletonList(something)है अपरिवर्तनीय है, जबकि Arrays.asList(something)एक निश्चित आकार है Listकिसी सरणी जहां सूची और सरणी ढेर में शामिल हो गए हो जाता है का प्रतिनिधित्व।

Arrays.asList(something)इसे किए गए गैर-संरचनात्मक परिवर्तनों की अनुमति देता है, जो सूची और संयुग्मित सरणी दोनों को परिलक्षित होता है। यह UnsupportedOperationExceptionतत्वों को जोड़ने, हटाने के लिए फेंकता है, हालांकि आप किसी विशेष सूचकांक के लिए एक तत्व निर्धारित कर सकते हैं।

द्वारा दी गई सूची में किए गए किसी भी परिवर्तन के Collections.singletonList(something)परिणामस्वरूप होगा UnsupportedOperationException

इसके अलावा, द्वारा दी गई सूची की क्षमता Collections.singletonList(something)हमेशा 1 के विपरीत Arrays.asList(something)होगी , जिसकी क्षमता समर्थित सरणी का आकार होगी।


63

मैं सिर्फ यह जोड़ना चाहूंगा कि एकल सूची एक सरणी द्वारा समर्थित नहीं है और बस उस एक आइटम का संदर्भ है। संभवतः, यह कम मेमोरी लेगा और आपके द्वारा बनाई गई सूचियों की संख्या के आधार पर महत्वपूर्ण हो सकता है।


इस मेमोरी दक्षता बिंदु को वापस करने के लिए कोई लिंक या कोड? मेरे पास यह Arrays.asList (ONLY_ONE_OBJECT) विशाल रूप से एक कोडबेस में लिखा गया है और यह पता लगाना चाहते हैं कि क्या कलेक्शंस। सिंघलटनलिस्ट () के साथ बदलने से मेमोरी दक्षता बढ़ जाती है?
राहुल सैनी

Arrays.asList एक सरणी (स्पष्ट रूप से) को संदर्भित करता है: hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/be44bff34df4/src/share/… Collections.singletonList: hg.openjdk.java.net/jd8/dd8 / फ़ाइल / be44bff34df4 / src / share /…
बेंजामिन

13

विधि Arrays.asListनिर्दिष्ट सरणी द्वारा समर्थित एक निश्चित आकार की सूची देता है। यह विधि एक उदाहरण देती है, ArrayListजो एक निजी नेस्टेड स्टेटिक क्लास है, जो विस्तारित है AbstractListऔर नहीं java.util.ArrayList। यह स्थिर वर्ग कुछ विधियों जैसे set, indexOf, forEach, replaceAllआदि का कार्यान्वयन प्रदान करता है, लेकिन जब हम addइसे लागू करते हैं तो इसका स्वयं का कोई कार्यान्वयन नहीं होता है, बल्कि इस विधि AbstractListको लागू किया जाता हैjava.lang.UnsupportedOperationException

Collections.singletonListएक रिटर्न अपरिवर्तनीय सूची केवल निर्दिष्ट ऑब्जेक्ट वाला है और यह रूप में अच्छी तरह serializable है।

एक साइड नोट पर, अपरिवर्तनीय सूचियों के लिए हम आम तौर पर उपयोग करते हैं Collections.unmodifiableListजो निर्दिष्ट सूची का एक अपरिवर्तनीय दृश्य देता है।

List<String> srcList = Arrays.asList("Apple", "Mango", "Banana");
var fruits = new ArrayList<>(srcList);
var unmodifiableList = Collections.unmodifiableList(fruits);     
fruits.set(0, "Apricot");
var modFruit = unmodifiableList.get(0);
System.out.println(modFruit); // prints Apricot

एक unmodifiable दृश्य संग्रह एक संग्रह है जो unmodifiable है और एक बैकिंग संग्रह पर एक दृश्य भी है। ध्यान दें कि बैकिंग संग्रह में परिवर्तन अभी भी संभव हो सकता है, और यदि वे होते हैं, तो वे असम्बद्ध दृश्य के माध्यम से दिखाई देते हैं।

हमारे पास जावा 10 और बाद में एक सच्ची अपरिवर्तनीय सूची हो सकती है । वास्तव में अपरिहार्य सूची प्राप्त करने के दो तरीके हैं :

  1. var unmodifiableList = List.copyOf(srcList);
  2. var unmodifiableList = srcList.stream().collect(Collectors.toUnmodifiableList()); यदि इन दो चर में से किसी का उपयोग किया जाता है तो भी मूल्य "Apple" होगा और "खुबानी" नहीं।

के अनुसार दस्तावेज़ के जावा 10 :

List.ofऔर List.copyOfस्थिर कारखाने तरीकों unmodifiable सूची बनाने के लिए एक सुविधाजनक तरीका प्रदान करते हैं। इन विधियों द्वारा बनाई गई सूची उदाहरणों में निम्नलिखित विशेषताएं हैं:

  1. वे अचूक हैं । तत्वों को जोड़ा, हटाया या प्रतिस्थापित नहीं किया जा सकता है। सूची में किसी भी उत्परिवर्ती विधि को कॉल करने पर हमेशा UnsupportedOperationExceptionफेंक दिया जाएगा। हालाँकि, यदि निहित तत्व स्वयं परिवर्तनशील हैं, तो इससे सूची की सामग्री बदल सकती है।
  2. वे अशक्त तत्वों को अस्वीकार करते हैं। अशक्त तत्वों के साथ उन्हें बनाने के प्रयासों का परिणाम है NullPointerException
  3. यदि सभी तत्व क्रमिक हैं, तो वे क्रमबद्ध हैं।
  4. सूची में तत्वों का क्रम प्रदान किए गए तर्कों के क्रम के समान है, या प्रदान की गई सरणी में तत्वों का है।
  5. वे हैं value-based। कॉल करने वालों को लौटे उदाहरणों की पहचान के बारे में कोई धारणा नहीं बनानी चाहिए। फैक्ट्रियां नए उदाहरण बनाने या मौजूदा लोगों के पुन: उपयोग के लिए स्वतंत्र हैं। इसलिए, इन उदाहरणों (संदर्भ समानता (==), पहचान हैश कोड, और सिंक्रनाइज़ेशन) पर पहचान-संवेदनशील संचालन अविश्वसनीय हैं और इसे टाला जाना चाहिए।
  6. वे पर निर्दिष्ट के रूप में क्रमानुसार लगे हुए हैं धारावाहिक फार्म पेज।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.