එක් පේළියක අරා ලැයිස්තුවක් ආරම්භ කිරීම


2766

පරීක්ෂණ අරමුණු සඳහා විකල්ප ලැයිස්තුවක් නිර්මාණය කිරීමට මට අවශ්‍ය විය. මුලදී, මම මෙය කළා:

ArrayList<String> places = new ArrayList<String>();
places.add("Buenos Aires");
places.add("Córdoba");
places.add("La Plata");

ඉන්පසුව, මම කේතය පහත පරිදි ප්‍රතිනිර්මාණය කළෙමි:

ArrayList<String> places = new ArrayList<String>(
    Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));

මෙය කිරීමට වඩා හොඳ ක්‍රමයක් තිබේද?


34
මෙය ඒකක පරීක්ෂාව සඳහා අදහස් කරන්නේ නම්, පැද්දීම සඳහා අශෝභන ලෙස උත්සාහ කරන්න. ජාවා කේතය පරික්ෂා කිරීමේදී ඔබට ඔබේ පරීක්ෂණ කේතය එහි ලිවිය හැකිය, සහ භාවිතා කරන්නArrasyList<String> places = ["Buenos Aires", "Córdoba", "La Plata"]
ripper234

3
ජාවා SE 7 හි, ඔබට ඉදිකිරීම්කරුගේ පරාමිතිගත කළ වර්ගය හිස් වර්ග පරාමිතීන් සමඟ ආදේශ කළ හැකිය (<>): සිතියම <string, list <String>> myMap = new HashMap <> ();
රෝස්


2
ද්විත්ව බ්‍රේසිං ආරම්භය භාවිතා කරන්න :)
මොහොමඩ්‍රෙසා කටාමි

8
Stream.of ("val1", "val2") එකතු කරන්න (එකතුකරන්නන්. ලැයිස්තුව ()); // ArrayList, Java8 විසඳුම නිර්මාණය කරයි.
ටොරිනා

Answers:


2031

ඇත්ත වශයෙන්ම, බොහෝ විට ආරම්භ කිරීමට “හොඳම” ක්‍රමය ArrayListවන්නේ ඔබ ලියූ ක්‍රමයයි, එයට Listකිසිම ආකාරයකින් නව නිර්මාණයක් කිරීමට අවශ්‍ය නොවන නිසා :

ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");

අල්ලා ගැනීම නම්, එම අවස්ථාව යොමු කිරීම සඳහා යතුරු ලියනය කිරීම තරමක් අවශ්‍ය වේ list.

නිදර්ශන ආරම්භකය සමඟ නිර්නාමික අභ්‍යන්තර පංතියක් සෑදීම වැනි විකල්ප ඇත ("ද්විත්ව වරහන් ආරම්භය" ලෙසද හැඳින්වේ):

ArrayList<String> list = new ArrayList<String>() {{
    add("A");
    add("B");
    add("C");
}};

කෙසේ වෙතත්, මම එම ක්‍රමයට එතරම් කැමැත්තක් නොදක්වන්නේ ඔබ අවසන් කරන්නේ උප පංතියක් නිසාය ArrayList පංතියක් අතර එය නිදර්ශන ආරම්භකයක් ඇති අතර එම පන්තිය නිර්මාණය කර ඇත්තේ එක් වස්තුවක් නිර්මාණය කිරීම සඳහා පමණි - එය මට ටිකක් අධික ලෙස මරා දැමීමක් සේ පෙනේ.

ව්‍යාපෘති කාසිය සඳහා එකතු කිරීමේ සාහිත්‍ය යෝජනාව පිළිගනු ලැබුවා නම් හොඳයි (එය ජාවා 7 හි හඳුන්වා දීමට නියමිතව තිබුණත් එය ජාවා 8 හි කොටසක් වීමට ඉඩක් නැත.):

List<String> list = ["A", "B", "C"];

අවාසනාවකට එය මෙහි ඔබට උදව් නොකරනු ඇත, මන්ද එය එය Listනොව වෙනස් කළ නොහැකි දෙයක් ආරම්භ කරනු ඇති ArrayListඅතර තව දුරටත් එය තවමත් ලබා ගත නොහැක.


173
ද්විත්ව වරහන් ආරම්භ කිරීම, වාසි සහ අවාසි පිළිබඳ වැඩි විස්තර සඳහා stackoverflow.com/questions/924285 බලන්න .
එඩී

6
D එඩී: සබැඳිය සඳහා හොඳ ඇමතුමක් - ද්විත්ව-වරහන් ආරම්භයේ එක් වාක්‍යයක් එය සම්පූර්ණයෙන් විස්තර කිරීමට ප්‍රමාණවත් නොවේ.
කූබර්ඩ්

2
ඔබ ක්‍රියා කරන්නේ ස්වයංක්‍රීය බොක්සිං ලැයිස්තුව <Double> list = [1.0, 2.0, 3.0] මත රඳා නොසිටින්නේ නම් පමණි; අසමත් වේ.
රිචඩ් බී

1
ද්විත්ව ලැයිස්තු
ආරම්භයේදී

6
මෙම පිළිතුර වඩාත්ම ඉහළට සහ සඳහන් කළ ව්‍යාපෘති කාසිය බැවින් මම සිතන්නේ ඔබ ජාවා 9 ලැයිස්තුගත කර ඇත්තේ List.of (...) සින්ටැක්ස් සමඟ ය: docs.oracle.com/javase/9/docs/api/java/util/ List.html # of-E ...-
අසාෆ්

2159

ඔබ එය නිකම්ම ප්‍රකාශයට පත් කරන්නේ නම් එය වඩාත් සරල වනු ඇත List- එය අරා ලැයිස්තුවක් විය යුතුද?

List<String> places = Arrays.asList("Buenos Aires", "Córdoba", "La Plata");

හෝ ඔබට ඇත්තේ එක් අංගයක් නම්:

List<String> places = Collections.singletonList("Buenos Aires");

මෙයින් අදහස් කරන්නේ placesඑය වෙනස් කළ නොහැකි බවයි ( එය වෙනස් කිරීමට උත්සාහ කිරීම UnsupportedOperationExceptionව්‍යතිරේකයක් විසි කිරීමට හේතු වේ).

විකෘති ලැයිස්තුවක් කොන්ක්‍රීට් එකක් බවට පත් කිරීම සඳහා ArrayListඔබට ArrayListවෙනස් කළ නොහැකි ලැයිස්තුවෙන් සෑදිය හැකිය :

ArrayList<String> places = new ArrayList<>(Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));

18
Ar මාකේස්: අරේලිස්ට් වෙනුවට ලැයිස්තුවක් භාවිතා කිරීමට ඔබේ පන්තිය වෙනස් කළ නොහැකිද?
ලෝරන්ස් ඩොල්

74
මගේ පිළිතුරට අනුව, ඔබ විශේෂිත ක්‍රම භාවිතා නොකරන්නේ නම් ArrayList, ප්‍රකාශය වෙනස් කිරීම වඩා හොඳ නිර්මාණයක් වනු ඇත List. ක්‍රියාත්මක කිරීම් නොව අතුරු මුහුණත් සඳහන් කරන්න.
ක්‍රිස්ටෝෆර් හාමර්ස්ට්‍රෝම්

9
H ක්‍රිස්ටෝෆර් හාමර්ස්ට්‍රෝම්: ඔහු ප්‍රකාශය ලැයිස්තුවට වෙනස් කර ලැයිස්තුව භාවිතා කරන්නේ නම් <String> places = Arrays.asList (...); ඔහු භාවිතා කිරීමට නොහැකි වනු ඇත places.add ( "blabla")
maks

57
යන්තම් පැහැදිලි කිරීමට, asList(...)ස්ථාවර ප්රමාණය නැවත Listවැනි මෙහෙයුම් mutating මත හමා බව removeහා clearඑම දේවල් Listසහාය කොන්ත්රාත් හිමිකම්. ඔබ ප්‍රකාශය අතහැර දැමුවද List, List l = new ArrayList(asList(...))OperationNotSupported ව්‍යතිරේකයන් විසි නොකරන වස්තුවක් ලබා ගැනීම සඳහා ඔබ භාවිතා කළ යුතුය . ලිස්කොව් ආදේශන මූලධර්මය කවුරුහරි?
ස්ප්ලෑෂ්

5
Pla ස්ප්ලෑෂ්: removeසහ clearවිකල්ප මෙහෙයුම් වේ List, එබැවින් asList(...)කොන්ත්‍රාත්තුව අනුගමනය කරයි. OP විසින් පසුව තවත් මූලද්‍රව්‍ය එකතු කළ යුතු යැයි කොතැනකවත් නොකියයි, උදාහරණය Listමූලද්‍රව්‍ය තුනක් සමඟ ආරම්භ කළ යුතු ය.
ක්‍රිස්ටෝෆර් හාමර්ස්ට්‍රෝම්

876

සරල පිළිතුර

දී ජාවා 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;  

ඕනෑම නවීන IDE එකක් ඔබ වෙනුවෙන් ස්වයංක්‍රීයව කරනු ඇත.
උදාහරණයක් ලෙස IntelliJ IDEA හි ඔබ ඔබාගෙන Alt+Enterතෝරන්න Static import method....


කෙසේ වෙතත්, මම List.ofක්‍රමවේදය කෙටි කිරීමට නිර්දේශ නොකරමි of, මන්ද එය ව්‍යාකූල වේ.
List.ofදැනටමත් ප්‍රමාණවත් තරම් කෙටි වන අතර හොඳින් කියවයි.


StreamS භාවිතා කිරීම

එය විය යුත්තේ 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"));

නැතහොත් ඔබට a Streamසිට a දක්වා යා හැකිය List:

import static java.util.stream.Collectors.toList;

List<String> strings = Stream.of("foo", "bar", "baz").collect(toList());

නමුත් වඩාත් සුදුසු වන්නේ Streamඑය එකතු නොකොට a List.


ඔබට සැබවින්ම අවශ්‍ය නම්java.util.ArrayList

(ඔබ බොහෝ විට එසේ නොකරනු ඇත.) JEP 269
උපුටා දැක්වීමට (මගේ අවධාරණය):

ඒ නිසා එය කුඩා කට්ටලයක් සාරධර්ම වලට කෙළින් කට්ටලය සමඟ mutable එකතුව උදාහරණයක් ආරම්භනය සඳහා භාවිතා රෝගීන්. සාමාන්‍යයෙන් එම පූර්ව නිශ්චිත අගයන් වෙනස් කළ නොහැකි එකතුවක තිබීම වඩාත් සුදුසුය, පසුව පිටපත් සාදන්නෙකු හරහා විකෘති එකතුව ආරම්භ කිරීම වඩාත් සුදුසුය.


ඔබට අවශ්ය නම් දෙකම 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");

නමුත් නැවතත්, එය Streama ට එකතු කිරීම වෙනුවට කෙලින්ම භාවිතා කිරීම වඩා හොඳය 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හෝ a BufferedInputStreamඑකක් වුවද සෑම විටම විචල්‍යය ප්‍රකාශ කිරීම තවත් උදාහරණයකි , මන්ද යම් දවසක ඔබට හෝ වෙනත් කෙනෙකුට වෙනත් ආකාරයක භාවිතා කිරීමට අවශ්‍ය වනු ඇත InputStream.


3
ol ජොලිරොජර්: Arrays.asListස්ථිතික ක්‍රමයකි. Docs.oracle.com/javase/1.5.0/docs/guide/language/…
ක්‍රිස්ටෝෆර්

2
@ ChristofferHammarström එවැනි අවස්ථාවකදී, මගේ නවක මනස මට පවසන්නේ ස්ථිතික ආනයනය ගෝලීය විචල්‍යයන් හා එවැනි භාවිතයට අදාළ අනතුරු වලට ප්‍රබල සමානකමක් දක්වන බවයි. මෙම උපකල්පනය නිවැරදිද? වැඩි ඡන්ද ප්‍රමාණයක් ලබා ගැනීමට ඉහත සමාන පිළිතුරට හේතුවද?
jollyroger

2
ඉහත පිළිතුර මම හිතන්නේ ඔබ කතා කරන්නේ මීට වසරකට පෙරය. නැත, ගෝලීය විචල්‍යයන්හි ගැටළුව වන්නේ ඒවා විකෘති වීමයි. ස්ථිතික ආනයන සමඟ ඔවුන්ට කිසිදු සම්බන්ධයක් නැත.
ක්‍රිස්ටෝෆර් හාමර්ස්ට්‍රෝම්

2
ඔබට ස්ථිතික ආනයනය අවශ්‍ය නොවන්නේ නම්, ස්ථිතික asList ක්‍රමයට සම්පූර්ණ මාර්ගය නිර්වචනය කළ හැකිය: ලැයිස්තුව <String> strings = java.util.Arrays.asList ("", "");
Geert Weening

2
නැතහොත් ඔබට ආනයනය java.util.Arrays භාවිතා කළ හැකිය; සහ අරාස්.ලිස්ට් ("", ""); ඔබට ස්ථිතික ආයාතයක් භාවිතා කිරීමට අවශ්‍ය නැත. ඔබට සම්පූර්ණ මාර්ගයක් භාවිතා කිරීමට අවශ්‍ය නැත. ස්ථිතික ක්‍රම ආනයනය ගැන තැකීමක් නොකරයි. ඔබ ඔවුන් සොයා ගැනීමට උදාහරණයක් භාවිතා කරන්නේ නම් ඔවුන් කෝපයට පත් වේ.
candied_orange

111

ඔබට 1 ප්‍රමාණයේ සරල ලැයිස්තුවක් අවශ්‍ය නම්:

List<String> strings = new ArrayList<String>(Collections.singletonList("A"));

ඔබට වස්තු කිහිපයක ලැයිස්තුවක් අවශ්‍ය නම්:

List<String> strings = new ArrayList<String>();
Collections.addAll(strings,"A","B","C","D");

57

ගුවා සමඟ ඔබට ලිවිය හැකිය:

ArrayList<String> places = Lists.newArrayList("Buenos Aires", "Córdoba", "La Plata");

ගුවා හි තවත් ප්‍රයෝජනවත් ස්ථිතික ඉදිකිරීම්කරුවන් ද ඇත. ඔබට ඒවා ගැන මෙතැනින් කියවිය හැකිය .


1
මට විශ්වාසයි ඔබට මෙය කළ හැකි බව java.util.Arrays,List<String> names = Arrays.asList("Beckah", "Sam", "Michael");
බෙකා

2
බෙකා ක්‍රමය Arrays.asLists වර්ග ලැයිස්තුවේ වස්තුවක් නිර්මාණය කරන අතර ප්‍රශ්නය වන්නේ ArrayList
Paweł Adamski


34

එකතු කිරීමේ වචනාර්ථය එය ජාවා 8 බවට පත් කළේ නැත, නමුත් එක් දිගු පේළියකින් ලැයිස්තුවක් ආරම්භ කිරීමට ස්ටීම් ඒපීඅයි භාවිතා කළ හැකිය:

List<String> places = Stream.of("Buenos Aires", "Córdoba", "La Plata").collect(Collectors.toList());

ඔබ ඔබේ බව සහතික කිරීමට අවශ්ය නම් Listයනු ArrayList:

ArrayList<String> places = Stream.of("Buenos Aires", "Córdoba", "La Plata").collect(Collectors.toCollection(ArrayList::new));

34

සමඟ සහ ඊට ඉහළින්, JEP 269 හි යෝජනා කර ඇති පරිදි : එකතු කිරීම සඳහා පහසු කර්මාන්තශාලා ක්‍රම , මෙය දැන් එකතු කිරීමේ වචනාර්ථයෙන් භාවිතා කර ගත හැකිය -

List<String> list = List.of("A", "B", "C");

Set<String> set = Set.of("A", "B", "C");

ඒ හා සමාන ප්‍රවේශයක් ද අදාළ Mapවේ -

Map<String, String> map = Map.of("k1", "v1", "k2", "v2", "k3", "v3")

එය @ කුබර්ඩ් ප්‍රකාශ කළ පරිදි එකතු කිරීමේ සාහිත්‍ය යෝජනාවට සමානය. JEP හි තවදුරටත් පැහැදිලි කර ඇත -


විකල්ප

භාෂා වෙනස්වීම් කිහිප වතාවක් සලකා බලා ප්‍රතික්ෂේප කර ඇත:

ව්‍යාපෘති කාසි යෝජනාව, 2009 මාර්තු 29

ව්‍යාපෘති කාසි යෝජනාව, 2009 මාර්තු 30

JEP 186 ලැම්බඩා-දේව් පිළිබඳ සාකච්ඡාව, 2014 ජනවාරි-මාර්තු

මෙම පණිවුඩයේ සාරාංශගත කර ඇති පරිදි පුස්තකාල පදනම් කරගත් යෝජනාවකට වඩා භාෂා යෝජනා වෙන් කරන ලදී .

ආශ්‍රිත: ජාවා 9 හි එකතු කිරීම සඳහා අධික ලෙස පටවන ලද පහසු කර්මාන්තශාලා ක්‍රමවල තේරුම කුමක්ද?


31
import com.google.common.collect.ImmutableList;

....

List<String> places = ImmutableList.of("Buenos Aires", "Córdoba", "La Plata");

4
එය සිදු කිරීම සඳහා නව යැපීමක් එක් කිරීමට මට අවශ්‍ය නැත.
මැකාර්ස්

6
ඒ ලෙස ද එය එසේ ම ය Collections.unmodifiableList(Arrays.asList("Buenos Aires", "Córdoba", "La Plata"))බවට පත්, unmodifiableList(asList("Buenos Aires", "Córdoba", "La Plata"))ස්ථිතික ආනයන සමග. මේ සඳහා ඔබට ගූගල් එකතු කිරීම් අවශ්‍ය නොවේ.
ක්‍රිස්ටෝෆර් හාමර්ස්ට්‍රෝම්

9
නැත, එය සමාන නොවේ. වෙනස් කළ නොහැකි ලැයිස්තුව සාමාන්‍ය ලැයිස්තුවක් ලෙස වෙස්වලා ගත් විට ප්‍රතිශක්තිකරණ වර්ගයෙහි එහි වෙනස් කළ නොහැකි බව ImmutableList ලේඛනගත කරයි.
ඩේවිඩ් පියරේ

2
වෙනස් කළ නොහැකි එක වෙනුවට, ගූගල් එකතුව විකෘති අරා ලැයිස්තුවක් ද ඉදිරිපත් කරයි: ලැයිස්තුව <String> = Lists.newArrayList ("බුවනෝස් අයර්ස්", "කෝර්ඩෝබා", "ලා ප්ලාටා");
එල්. හොලන්ඩා

3
ඔබ එය ImmutableListගන්නා වෙනත් ක්‍රම වෙත යොමු කරනු ඇත List, එවිට ඔබට කෙසේ හෝ එම ලියකියවිලි නැති වී යයි.
ක්‍රිස්ටෝෆර් හාමර්ස්ට්‍රෝම්

23

ඔබට කර්මාන්තශාලා ක්‍රමයක් නිර්මාණය කළ හැකිය:

public static ArrayList<String> createArrayList(String ... elements) {
  ArrayList<String> list = new ArrayList<String>();
  for (String element : elements) {
    list.add(element);
  }
  return list;
}

....

ArrayList<String> places = createArrayList(
  "São Paulo", "Rio de Janeiro", "Brasília");

නමුත් එය ඔබගේ පළමු ප්‍රතිනිර්මාණයට වඩා හොඳ නැත.

වැඩි නම්යතාවයක් සඳහා, එය සාමාන්ය විය හැකිය:

public static <T> ArrayList<T> createArrayList(T ... elements) {
  ArrayList<T> list = new ArrayList<T>();
  for (T element : elements) {
    list.add(element);
  }
  return list;
}

1
මුල් පෝස්ට් එක දෙස ආපසු හැරී බලන්න, එය ඉල්ලන්නේ එක් පේළියක අරාව ආරම්භ කිරීම මිස අතිරේක පේළි 7 ක් නොවේ.
එල්. හොලන්ඩා

7
ELeoHolanda: සෑම කුඩා දෙයක් සඳහාම කර්මාන්තශාලා ක්‍රම සෑදීම ඕනෑවට වඩා වැඩිය, මම එකඟ වෙමි. නමුත් තත්වය මත පදනම්ව සහ එම ක්‍රමය භාවිතා කිරීමට යන වාර ගණන අනුව එය නිර්මාණය කිරීම අර්ථවත් විය හැකිය. අමතර වියුක්ත ස්ථර නිර්මාණය කිරීම යනු නිර්මාණකරුගේ අභිප්‍රාය ග්‍රහණය කර ගන්නා වඩාත් අර්ථවත් ක්‍රම නිර්මාණය කිරීමෙන් සංකීර්ණත්වය ඉවත් කිරීමයි .
ජෝර්ඩෝ

16

ජාවා 9 හි අපට ArrayListතනි පේළියකින් පහසුවෙන් ආරම්භ කළ හැකිය :

List<String> places = List.of("Buenos Aires", "Córdoba", "La Plata");

හෝ

List<String> places = new ArrayList<>(List.of("Buenos Aires", "Córdoba", "La Plata"));

ජාවා 9 හි මෙම නව ප්‍රවේශය පෙර ඒවාට වඩා බොහෝ වාසි ඇත:

  1. අභ්‍යවකාශ කාර්යක්ෂමතාව
  2. නිශ්චලතාව
  3. නූල් ආරක්ෂිතයි

වැඩි විස්තර සඳහා මෙම ලිපිය බලන්න -> List.of සහ Arrays.asList අතර වෙනස කුමක්ද?


8

මෙය කිරීමට වඩාත්ම සංයුක්ත ක්‍රමය ගැන:

Double array[] = { 1.0, 2.0, 3.0};
List<Double> list = Arrays.asList(array);

8

පහත කේතය පහත පරිදි භාවිතා කරන්න.

List<String> list = new ArrayList<String>() {{
            add("A");
            add("B");
            add("C");
}};

2
@bsd ඕනෑම ක්‍රමයකට ඇතුළු වීමට පෙර ලැයිස්තුව ප්‍රකාශ කිරීමට ඔබට මෙම ක්‍රමය භාවිතා කළ හැකිය. එබැවින් පන්ති විචල්‍යයන් නිර්වචනය කිරීමේදී, ක්‍රමවේදයක් අනුගමනය නොකර අන්තර්ගතය ලැයිස්තුවට එක් කළ හැකිය.
මෙල්විල්

2
ද්විත්ව වරහන් ආරම්භ කිරීම හැකිතාක් දුරට වළක්වා ගත යුතුය. බලන්න: stackoverflow.com/a/924326/760393
Raúl

8

සූර්යග්‍රහණ එකතුව සමඟ ඔබට පහත සඳහන් දෑ ලිවිය හැකිය:

List<String> list = Lists.mutable.with("Buenos Aires", "Córdoba", "La Plata");

වර්ග සහ ඒවා විකෘති හෝ වෙනස් කළ නොහැකි ඒවා ද යන්න පිළිබඳව ඔබට වඩාත් නිශ්චිත විය හැකිය.

MutableList<String> mList = Lists.mutable.with("Buenos Aires", "Córdoba", "La Plata");
ImmutableList<String> iList = Lists.immutable.with("Buenos Aires", "Córdoba", "La Plata");

කට්ටල සහ බෑග් සමඟද ඔබට එය කළ හැකිය:

Set<String> set = Sets.mutable.with("Buenos Aires", "Córdoba", "La Plata");
MutableSet<String> mSet = Sets.mutable.with("Buenos Aires", "Córdoba", "La Plata");
ImmutableSet<String> iSet = Sets.immutable.with("Buenos Aires", "Córdoba", "La Plata");

Bag<String> bag = Bags.mutable.with("Buenos Aires", "Córdoba", "La Plata");
MutableBag<String> mBag = Bags.mutable.with("Buenos Aires", "Córdoba", "La Plata");
ImmutableBag<String> iBag = Bags.immutable.with("Buenos Aires", "Córdoba", "La Plata");

සටහන: මම සූර්යග්‍රහණ එකතුව සඳහා කැපවන්නෙක් වෙමි.


7

මෙන්න තවත් ක්‍රමයක්:

List<String> values = Stream.of("One", "Two").collect(Collectors.toList());

7

(අදහස් දැක්වීමක් විය යුතුය, නමුත් දිග වැඩිය, එබැවින් නව පිළිතුර). අනෙක් අය සඳහන් කර ඇති පරිදි, Arrays.asListක්‍රමය ස්ථාවර ප්‍රමාණයකි, නමුත් එය සමඟ ඇති එකම ගැටළුව එය නොවේ. එය ද උරුමය හොඳින් හසුරුවන්නේ නැත. උදාහරණයක් ලෙස, ඔබට පහත සඳහන් දේ ඇතැයි සිතමු:

class A{}
class B extends A{}

public List<A> getAList(){
    return Arrays.asList(new B());
}

ඉහත List<B>ප්‍රති results ල සම්පාදක දෝෂයකට හේතු වේ, මන්ද (එය Arrays.asList විසින් ආපසු ලබා දෙනු ලැබේ) ඔබට උප වර්ගයක් නොවේ List<A>, ඔබට B වර්ගයේ List<A>වස්තු වස්තුවකට එක් කළ හැකි වුවද . මෙය මඟහරවා ගැනීම සඳහා, ඔබ මෙවැනි දෙයක් කළ යුතුය:

new ArrayList<A>(Arrays.<A>asList(b1, b2, b3))

මෙය කිරීමට හොඳම ක්‍රමය මෙය විය හැකිය. ඔබට අසීමිත ලැයිස්තුවක් අවශ්‍ය නම් හෝ උරුමය භාවිතා කිරීමට අවශ්‍ය නම්.


6

ඔබට පහත ප්‍රකාශ භාවිතා කළ හැකිය:

කේත ස්නිපෙට්:

String [] arr = {"Sharlock", "Homes", "Watson"};

List<String> names = Arrays.asList(arr);

සංයුක්ත විසඳුමක් ලබා ගැනීම සඳහා ඔබට පළමු ප්‍රකාශනය පේළිගත කළ හැකිය:letters = Arrays.asList(new String[]{"A", "B", "C"});
පවෙල් රෙපින්

5

ටොම් කීවාක් මෙන් :

List<String> places = Arrays.asList("Buenos Aires", "Córdoba", "La Plata");

අරා ලැයිස්තුවක් අවශ්‍ය බවට ඔබ පැමිණිලි කළ බැවින්, ඔබ මුලින්ම දැනගත යුත්තේ අරේලිස්ට් ලැයිස්තුවේ උප පංතියක් වන අතර ඔබට මෙම පේළිය එක් කළ හැකිය:

ArrayList<String> myPlaces = new ArrayList(places);

කෙසේ වෙතත්, එමඟින් ඔබ 'කාර්ය සාධනය' ගැන පැමිණිලි කළ හැකිය.

එවැනි අවස්ථාවකදී එය මට තේරුමක් නැත, ඇයි, ඔබේ ලැයිස්තුව කලින් නිර්වචනය කර ඇති බැවින් එය අරාව ලෙස අර්ථ දක්වා නැත (ආරම්භක අවස්ථාවේ ප්‍රමාණය දන්නා බැවින්). එය ඔබට විකල්පයක් නම්:

String[] places = {"Buenos Aires", "Córdoba", "La Plata"};

සුළු කාර්ය සාධන වෙනස්කම් ඔබ නොසලකන්නේ නම් ඔබට අරාව ලැයිස්තුවකට ඉතා සරලව පිටපත් කළ හැකිය:

ArrayList<String> myPlaces = new ArrayList(Arrays.asList(places));

හරි, නමුත් අනාගතයේදී ඔබට ස්ථාන නාමයට වඩා ටිකක් වැඩියෙන් අවශ්‍යයි, ඔබට රට කේතයක්ද අවශ්‍යයි. මෙය තවමත් පූර්ව නිශ්චිත ලැයිස්තුවක් යැයි සිතමු, එය ධාවන කාලය තුළ කිසි විටෙකත් වෙනස් නොවනු ඇත, එවිට enumකට්ටලයක් භාවිතා කිරීම සුදුසුය , අනාගතයේදී ලැයිස්තුව වෙනස් කිරීමට අවශ්‍ය නම් නැවත සම්පාදනය කිරීම අවශ්‍ය වේ.

enum Places {BUENOS_AIRES, CORDOBA, LA_PLATA}

බවට පත්වන්නේ:

enum Places {
    BUENOS_AIRES("Buenos Aires",123),
    CORDOBA("Córdoba",456),
    LA_PLATA("La Plata",789);

    String name;
    int code;
    Places(String name, int code) {
      this.name=name;
      this.code=code;
    }
}

එනුම්ස් හි ස්ථිතික valuesක්‍රමයක් ඇති අතර ඒවා ප්‍රකාශිත අනුපිළිවෙලෙහි එනූම් හි සියලු අගයන් අඩංගු අරාවක් ලබා දෙයි, උදා:

for (Places p:Places.values()) {
    System.out.printf("The place %s has code %d%n",
                  p.name, p.code);
}

එවැනි අවස්ථාවකදී මම හිතන්නේ ඔබට ඔබේ අරා ලැයිස්තු අවශ්‍ය නොවනු ඇත.

පීඑස් රන්‍යා විසින් ස්ථිතික උපයෝගිතා ක්‍රමයක් වන Collections.addAll භාවිතා කරමින් තවත් හොඳ ක්‍රමයක් නිරූපණය කළේය.


5

වෙනස් කළ නොහැකි ලැයිස්තුවක් නිර්මාණය කිරීම සඳහා ජාවා 9 හි පහත ක්‍රමවේදය ඇත :

List<String> places = List.of("Buenos Aires", "Córdoba", "La Plata");

අවශ්‍ය නම් විකෘති ලැයිස්තුවක් නිර්මාණය කිරීම සඳහා පහසුවෙන් අනුවර්තනය කළ හැකි:

List<String> places = new ArrayList<>(List.of("Buenos Aires", "Córdoba", "La Plata"));

සමාන ක්රම සඳහා ලබා ගත හැකිය Setසහ Map.


1
එහි හොඳ දෙය නම් ඔබ “වෙනස් කළ නොහැකි ලැයිස්තුවක්” පැහැදිලිව පැවසූ අතර පසුව විකෘති ලැයිස්තුවට තවත් උදාහරණයක් පෙන්වීම නිසා එය භාවිතා කළ යුත්තේ කවදාද යන්න පැහැදිලි කරයි.
චෙරිට්


4

ඔව්, අරා ආධාරයෙන් ඔබට එක් පේළියකින් අරාව ලැයිස්තුව ආරම්භ කළ හැකිය,

List<String> strlist= Arrays.asList("aaa", "bbb", "ccc");



2

ජාවා හි, ඔබට කළ නොහැක

ArrayList<String> places = new ArrayList<String>( Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));

පෙන්වා දුන් පරිදි, ඔබට ද්විත්ව වරහන් ආරම්භයක් කිරීමට අවශ්‍ය වනු ඇත:

List<String> places = new ArrayList<String>() {{ add("x"); add("y"); }};

නමුත් මෙය ඔබට ව්‍යාඛ්‍යාවක් එක් කිරීමට බල කරයි @SuppressWarnings("serial")හෝ කරදරකාරී වන UUID අනුක්‍රමික උත්පාදනය කරයි. බොහෝ කේත ආකෘතිකරුවන් එය බහු ප්‍රකාශ / රේඛාවලට මුදා හරිනු ඇත.

විකල්පයක් ලෙස ඔබට කළ හැකිය

List<String> places = Arrays.asList(new String[] {"x", "y" });

නමුත් ඔබට එය කිරීමට අවශ්‍ය විය හැකිය @SuppressWarnings("unchecked") .

ජාවාඩොක්ට අනුව ඔබට මෙය කළ හැකි විය යුතුය:

List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");

නමුත් මට එය JDK 1.6 සමඟ සම්පාදනය කිරීමට නොහැකි විය.


5
වැරදි! ඔබට පළමු පේළිය කළ හැකිය , එය නිවැරදි පිළිතුර btw
බොහීමියානු

1
Collections.singletonList(messageBody)

ඔබට එක් අයිතමයක ලැයිස්තුවක් අවශ්‍ය නම් !

එකතු කිරීම් java.util පැකේජයෙන්.


1

එය කළ හැකි හොඳම ක්‍රමය:

package main_package;

import java.util.ArrayList;


public class Stackkkk {
    public static void main(String[] args) {
        ArrayList<Object> list = new ArrayList<Object>();
        add(list, "1", "2", "3", "4", "5", "6");
        System.out.println("I added " + list.size() + " element in one line");
    }

    public static void add(ArrayList<Object> list,Object...objects){
        for(Object object:objects)
            list.add(object);
    }
}

ඔබට අවශ්‍ය තරම් මූලද්‍රව්‍ය තිබිය හැකි ශ්‍රිතයක් නිර්මාණය කර ඒවා එක පේළියකට එක් කිරීමට අමතන්න.


1
ඔබ සියලු කරදර වලට මුහුණ දුන්නොත් එය සරල ලෙස භාවිතා කිරීම වෙනුවට අච්චු ක්‍රමයක් බවට පත් කළ හැකිය Object.
රොබට්

1

මෙන්න කේතය අබකස්උටිල් විසිනි

// ArrayList
List<String> list = N.asList("Buenos Aires", "Córdoba", "La Plata");
// HashSet
Set<String> set = N.asSet("Buenos Aires", "Córdoba", "La Plata");
// HashMap
Map<String, Integer> map = N.asMap("Buenos Aires", 1, "Córdoba", 2, "La Plata", 3);

// Or for Immutable List/Set/Map
ImmutableList.of("Buenos Aires", "Córdoba", "La Plata");
ImmutableSet.of("Buenos Aires", "Córdoba", "La Plata");
ImmutableSet.of("Buenos Aires", 1, "Córdoba", 2, "La Plata", 3);

// The most efficient way, which is similar with Arrays.asList(...) in JDK. 
// but returns a flexible-size list backed by the specified array.
List<String> set = Array.asList("Buenos Aires", "Córdoba", "La Plata");

ප්‍රකාශනය Ab මම අබකස්උටිල් හි සංවර්ධකයා වෙමි.


0

මට නම් Arrays.asList () හොඳම හා පහසු එකකි. මම සෑම විටම ඒ ආකාරයෙන් ආරම්භ කිරීමට කැමතියි. ඔබ ජාවා එකතුවට ආරම්භකයකු නම්, ඔබ අරා ලැයිස්තු ආරම්භය යොමු කිරීමට කැමතියි


add()ක්‍රම සමඟ එක් පේළියක නව අරා ලැයිස්තුවක් සෑදීමට වඩා Arrays.asList () වඩා හොඳ වන්නේ ඇයි ?
ඉගෝර්ගනාපොල්ස්කි

0

මෙය කරන සරල උපයෝගිතා ශ්‍රිතයක් නොකරන්නේ ඇයි?

static <A> ArrayList<A> ll(A... a) {
  ArrayList l = new ArrayList(a.length);
  for (A x : a) l.add(x);
  return l;
}

" ll" යන්නෙන් අදහස් කරන්නේ "වචනාර්ථ ලැයිස්තුව" යන්නයි.

ArrayList<String> places = ll("Buenos Aires", "Córdoba", "La Plata");

0

අනෙක් බර පැටවූ ක්‍රමය සමඟ එක් ලයිනර් එකක් Stream::collect ලැයිස්තුගත කර නැත

ArrayList<String> places = Stream.of( "Buenos Aires", "Córdoba", "La Plata" ).collect( ArrayList::new, ArrayList::add, ArrayList::addAll );

-1

ඇත්ත වශයෙන්ම, එය එක් පේළියකින් කළ හැකිය:

Arrays.asList(new MyClass[] {new MyClass("arg1"), new MyClass("arg2")})

3
මෙය ප්‍රශ්නයට එකතු කරන්නේ කුමක්දැයි මට විමසිය හැකිද? මෙම පිළිතුර දැනටමත් වෙනත් පිළිතුරු මගින් කිහිප වතාවක් ආවරණය කර ඇත.
අද්භූත

මෙය සැබවින්ම නරක විසඳුමක් වන අතර එය ABSTRACT ලැයිස්තුවක් නිර්මාණය කරයි. ඔබට කන්ටේනරයට තවත් කිසිවක් එකතු කිරීමට නොහැකි වනු ඇත.
අටයිස්
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.