2012-04-02 14 views
56

स्ट्रिंग्स के List बनाने के लिए सबसे अच्छा निर्माण क्या है? क्या यह Lists.newArrayList() (अमरूद से) या new ArrayList() है?सूचियाँ। नया ऑरेलेस्ट बनाम नया ऐरेलिस्ट

क्या यह सिर्फ एक निजी वरीयता है?
या यह सिर्फ जेनेरिक प्रकार अनुमान टाइप करें?
या क्या Lists.newArrayList() का उपयोग करने में कोई सैद्धांतिक या व्यावहारिक मूल्य है?

+5

आप पढ़ना चाहिए [स्थिर कंस्ट्रक्टर्स के बारे में अनुभाग] (http://code.google.com/p/guava-libraries/wiki/CollectionUtilitiesExplained) – assylias

उत्तर

79

अमरूद निर्माता कई बार टाइप तर्क टाइपिंग बचाता है। की तुलना करें:

List<Foo<Bar, Baz>> list = Lists.newArrayList(); 
List<Foo<Bar, Baz>> list = new ArrayList<Foo<Bar, Baz>>(); 

जावा 7 में यह थोड़ा अप्रचलित है हालांकि, क्योंकि आप हीरा ऑपरेटर है:

List<Foo<Bar, Baz>> list = new ArrayList<>(); 
+28

यह काफी अप्रचलित नहीं, भार के की वजह से है - ' सूचियाँ।newArrayList (1, 2, 3) 'आपको तत्वों के साथ प्रारंभ करने देता है, और' Lists.newArrayListWithExpectedSize (20) '' 20 'का अर्थ' नए ArrayList <> (20) 'से अधिक स्पष्ट है। इस सवाल के लिए "आधिकारिक उत्तर", वैसे है, [यहां] (http://code.google.com/p/guava-libraries/wiki/CollectionUtilitiesExplained#Static_constructors) है। –

+10

हाँ, लेकिन यह एक और तरीका है। मेरा मतलब था कि नो-एर्ग अप्रचलित है। – Bozho

+4

इसके लायक होने के लिए, यह कॉल साइट को 'ऐरेलिस्ट' आयात करने से भी मुक्त करता है। –

24

से Guava's source:

public static <E> ArrayList<E> newArrayList() { 
    return new ArrayList<E>(); 
} 

सब कर रहा है प्रकार निष्कर्ष के लिए अनुमति देता है रनटाइम पर कोई फर्क नहीं पड़ता।

3

के रूप में समझाया here, मुख्य मंशा Lists, Sets आदि प्रयोग करने के लिए अपने कोड में पठनीयता/दोहराव में सुधार, और प्रकार निष्कर्ष के लिए कर रहे हैं।

1

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

4

यह वही है Lists.newArrayList करता है:

@GwtCompatible(serializable = true) 
public static <E> ArrayList<E> newArrayList() { 
    return new ArrayList<E>(); 
} 

तो इन दो, एक ही मूल रूप से कर रहे हैं newArrayList सामान्य प्रकार नकल करने नहीं होने पर लाभ होने का उपयोग कर के साथ। इस परिसर में जेनरिक पर बहुत उपयोगी है:

List<Map<X,List<Y>> list = new ArrayList<Map<X,List<Y>>(); 

List<Map<X,List<Y>> list = Lists.newArrayList(); 
+0

विधि हस्ताक्षर के अनुसार अमरूद के साथ पूर्ण विधि कॉल 'सूची' होगी। <मानचित्र >> newArrayList() '। आप जेनेरिक प्रकार छोड़ सकते हैं। लेकिन आप इसे कन्स्ट्रक्टर के साथ भी कर सकते हैं: 'सूची <मानचित्र >> सूची = नया ऐरेलिस्ट();' साथ ही साथ काम करता है। –

12

एक बिंदु, Lists.newArrayList() की संस्करण अधिक भार जोड़े अधिक उपयोगी है:

  • Lists.newArrayList(E... elements)
  • Lists.newArrayList(Iterable<? extends E> elements)
  • Lists.newArrayList(Iterator<? extends E> elements)

new ArrayList() से अधिक उपयोगी कार्य प्रदान करते हैं।

उदाहरण के लिए: new ArrayList() ऐसा नहीं कर सकते:

Lists.newArrayList("a","b"); 
Lists.newArrayList(anIterable); 
0

जावा 8 अतिभारित निर्माताओं के लिए दृष्टिकोण।

यदि आप गुवा से ओवरलोडेड कन्स्ट्रक्टर का उपयोग करना चाहते हैं, तो मैं जावा 8 स्ट्रीम बिल्डर का उपयोग करके एक और तरीका सुझाऊंगा।

List<String> listTest = Stream.<String>builder.add("Hello").add("My Name").add("Blah").build().collect(Collectors.toList()); 
संबंधित मुद्दे