सरल उत्तर
में जावा 9 या बाद में, के बाद List.of()
जोड़ा गया है:
List<String> strings = List.of("foo", "bar", "baz");
साथ जावा 10 या बाद में, इस के साथ छोटा किया जा सकता var
कीवर्ड।
var strings = List.of("foo", "bar", "baz");
यह आपको अपरिवर्तनीय देगा List
, इसलिए इसे बदला नहीं जा सकता।
जो आप चाहते हैं कि ज्यादातर मामलों में आप इसे तैयार कर रहे हैं।
जावा 8 या पूर्व:
List<String> strings = Arrays.asList("foo", "bar", "baz");
यह आपको एक List
सरणी द्वारा समर्थित देगा , इसलिए यह लंबाई नहीं बदल सकता है।
लेकिन आप कॉल कर सकते हैं List.set
, इसलिए यह अभी भी परिवर्तनशील है ।
आप Arrays.asList
स्थैतिक आयात के साथ भी कम कर सकते हैं :
List<String> strings = asList("foo", "bar", "baz");
स्थिर आयात:
import static java.util.Arrays.asList;
जो कोई भी आधुनिक आईडीई सुझाव देगा और स्वचालित रूप से आपके लिए करेगा।
IntelliJ IDEA में उदाहरण के लिए आप दबाएँ Alt+Enter
और चुनें Static import method...
।
हालाँकि, मैं छोटा करने की सलाह नहीं देता List.of
विधि को करता of
, क्योंकि यह भ्रामक हो जाता है।
List.of
पहले से ही काफी छोटा है और अच्छी तरह से पढ़ता है।
का उपयोग करते हुए Stream
रों
यह एक होना क्यों है List
?
जावा 8 या बाद में आप एक का उपयोग कर सकते हैं Stream
जो अधिक लचीला है:
Stream<String> strings = Stream.of("foo", "bar", "baz");
आप सहमति बना सकते हैं Stream
:
Stream<String> strings = Stream.concat(Stream.of("foo", "bar"),
Stream.of("baz", "qux"));
या आप ए से जा सकते हैं Stream
एक करने के लिए List
:
import static java.util.stream.Collectors.toList;
List<String> strings = Stream.of("foo", "bar", "baz").collect(toList());
लेकिन अधिमानतः, बस का उपयोग करें Stream
इसे इकट्ठा बिना एक काList
।
अगर तुम सच में विशेष रूप से एक की जरूरत हैjava.util.ArrayList
(आप शायद नहीं।)
बोली के लिए JEP 269 (जोर मेरा) :
एक छोटा सा सेट हैमूल्यों के पूर्वनिर्धारित सेट के साथ एक उत्परिवर्तित संग्रह उदाहरण को शुरू करने के लिए उपयोग के मामलों है। आमतौर पर उन पूर्वनिर्धारित मूल्यों को एक अपरिवर्तनीय संग्रह में रखना बेहतर होता है, और फिर एक प्रतिलिपि निर्माता के माध्यम से उत्परिवर्तित संग्रह को आरंभ करना।
आप चाहते हैं दोनों prepopulate एक ArrayList
और बाद में, उपयोग यह करने के लिए जोड़ (क्यों?)
ArrayList<String> strings = new ArrayList<>(List.of("foo", "bar"));
strings.add("baz");
या जावा 8 या पूर्व में:
ArrayList<String> strings = new ArrayList<>(asList("foo", "bar"));
strings.add("baz");
या उपयोग कर रहा है Stream
:
import static java.util.stream.Collectors.toCollection;
ArrayList<String> strings = Stream.of("foo", "bar")
.collect(toCollection(ArrayList::new));
strings.add("baz");
लेकिन फिर, यह सिर्फ का उपयोग करने के लिए बेहतर है Stream
सीधे करने के बजाय इसे इकट्ठा करने के लिए बेहतर है List
।
कार्यक्रम इंटरफेस के लिए, कार्यान्वयन के लिए नहीं
आपने कहा कि आपने सूची को ArrayList
अपने कोड में घोषित कर दिया है , लेकिन आपको केवल यही करना चाहिए कि यदि आप ArrayList
उस सदस्य का उपयोग कर रहे हैं जो अंदर नहीं हैList
।
जो आप कर रहे हैं सबसे अधिक संभावना है।
आमतौर पर आपको केवल सबसे सामान्य इंटरफ़ेस द्वारा चर घोषित करना चाहिए जिसे आप उपयोग करने जा रहे हैं (उदाहरण Iterable
के लिए Collection
, या List
), और उन्हें विशिष्ट कार्यान्वयन के साथ आरंभ करें (जैसे ArrayList
,LinkedList
याArrays.asList()
)।
अन्यथा आप अपने कोड को उस विशिष्ट प्रकार तक सीमित कर रहे हैं, और जब आप चाहते हैं तब इसे बदलना कठिन होगा।
उदाहरण के लिए, यदि आप एक ArrayList
को पास कर रहे हैं void method(...)
:
// Iterable if you just need iteration, for (String s : strings):
void method(Iterable<String> strings) {
for (String s : strings) { ... }
}
// Collection if you also need .size(), .isEmpty(), or .stream():
void method(Collection<String> strings) {
if (!strings.isEmpty()) { strings.stream()... }
}
// List if you also need .get(index):
void method(List<String> strings) {
strings.get(...)
}
// Don't declare a specific list implementation
// unless you're sure you need it:
void method(ArrayList<String> strings) {
??? // You don't want to limit yourself to just ArrayList
}
एक और उदाहरण हमेशा चर की घोषणा करना होगा InputStream
भले ही यह आमतौर पर एक FileInputStream
या एक है BufferedInputStream
, क्योंकि एक दिन जल्द ही आप या कोई और किसी अन्य प्रकार का उपयोग करना चाहेगा InputStream
।
ArrasyList<String> places = ["Buenos Aires", "Córdoba", "La Plata"]