Care este cel mai scurt mod de a inițializa o listă de șiruri de caractere în java? (Programare, Java, Array-Uri, String, Lista, Inițializare)

Vladimir a intrebat.

Caut cel mai scurt mod (în cod) de a inițializa o listă de șiruri de caractere și o matrice de șiruri de caractere, adică o listă/un matrice care să conțină elementele de șiruri „s1”, „s2”, „s3”.

7 răspunsuri
Jon Skeet

Există diverse opțiuni. Personal, îmi place să folosesc Guava:

List<String> strings = Lists.newArrayList("s1", "s2", "s3");

(Guava este o bibliotecă pe care merită să o ai oricum, desigur 🙂

Utilizând doar JDK, ați putea folosi:

List<String> strings = Arrays.asList("s1", "s2", "s3");

Rețineți că acest lucru va returna un ArrayList, dar acesta este nu normal java.util.ArrayList – ci unul intern, care este mutabil, dar cu dimensiune fixă.

Personal, prefer versiunea Guava, deoarece arată clar ce se întâmplă (implementarea listei care va fi returnată). De asemenea, este încă clar ce se întâmplă dacă importați static metoda:

// import static com.google.common.collect.Lists.newArrayList;
List<String> strings = newArrayList("s1", "s2", "s3");

… în timp ce dacă importați static asList arată puțin mai ciudat.

O altă opțiune Guava, dacă nu doriți o listă modificabilă în orice fel:

ImmutableList<String> strings = ImmutableList.of("s1", "s2", "s3");

De obicei, vreau să fie să am o listă complet mutabilă (caz în care Lists.newArrayList este cel mai bun) fie o listă complet imuabilă (caz în care ImmutableList.of este cea mai bună). Rareori se întâmplă ca eu chiar vreau o listă mutabilă, dar cu dimensiune fixă.

Comentarii

  • de ce nu doar Arrays.asList(„s1”, „s2”, „s3”)? –  > Por BegemoT.
  • @BegemoT: Am adăugat asta – personal, prefer natura explicită a versiunii Guava. –  > Por Jon Skeet.
  • care nu poate fi modificată — De fapt, este modificabilă (dar cu dimensiuni fixe). –  > Por aioobe.
  • @Matt: Nici o problemă. Îl voi șterge pe cel care îți răspunde ție și apoi voi șterge acest unul în curând, dacă vrei să-l ștergi și pe al doilea 🙂 –  > Por Jon Skeet.
  • Cu tot respectul pentru Jon Skeet. Nu este mai bine să folosiți Arrays.asList() în loc de ImmutableList.of(), deoarece cea din urmă, va menține matricea copiată. Puteți, vă rog, să ne lămuriți în această privință? –  > Por Ashish Lohia.
aioobe

Java 9+

Java 9 introduce o metodă convenabilă List.of utilizată după cum urmează:

List<String> l = List.of("s1", "s2", "s3");

Java 8 și mai vechi

Iată câteva alternative:

// Short, but the resulting list is fixed size.
List<String> list1 = Arrays.asList("s1", "s2", "s3");

// Similar to above, but the resulting list can grow.
List<String> list2 = new ArrayList<>(Arrays.asList("s1", "s2", "s3"));

// Using initialization block. Useful if you need to "compute" the strings.
List<String> list3 = new ArrayList<String>() {{
    add("s1");
    add("s2");
    add("s3");
}};

Când vine vorba de array-uri, le puteți inițializa în momentul declarării, astfel:

String[] arr = { "s1", "s2", "s3" };

Dacă aveți nevoie să o reinitializați sau să o creați fără a o stoca într-o variabilă, faceți

new String[] { "s1", "s2", "s3" }

Dacă constantele de șiruri de caractere sunt totuși mai, ar arăta astfel

String[] arr = { "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
                 "s11", "s12", "s13" };

În aceste cazuri, de obicei prefer să scriu

String[] arr = "s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13".split(",");

Comentarii

  • @The Elite Gentleman: Rezultatul lui Arrays.asList este imuabil. Dacă se construiește un nou ArrayList ca în str2 atunci este posibil să se adauge ulterior la listă. –  > Por Mathias Schwarz.
  • @Mathias Schwarz, nu este imuabil, ci de dimensiuni fixe. –  > Por aioobe.
  • @aioobe: Aveți dreptate! Este posibil să se suprascrieți intrările existente. –  > Por Mathias Schwarz.
  • Ar trebui să rețineți că bloc de inițializare creează o subclasă anonimă a clasei ArrayList. –  > Por Paŭlo Ebermann.
Buhake Sindi
List<String> stringList = Arrays.asList("s1", "s2", "s3");

Toate aceste obiecte există în JDK.

PS: După cum a precizat aioobe, acest lucru face ca lista să fie de dimensiuni fixe.

Comentarii

  • Lista rezultată este totuși de dimensiune fixă. –  > Por aioobe.
LazerBanana

JDK2

List<String> list = Arrays.asList("one", "two", "three");

JDK7

//diamond operator
List<String> list = new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");

JDK8

List<String> list = Stream.of("one", "two", "three").collect(Collectors.toList());

JDK9

List<String> list = List.of("one", "two", "three");

În plus, există o mulțime de alte modalități furnizate de alte biblioteci, cum ar fi Guava.

Mathias Schwarz

Puteți utiliza Arrays în API Java standard: http://download.oracle.com/javase/6/docs/api/java/util/Arrays.html#asList(T…)

List<String> strings = Arrays.asList("s1", "s2", "s3");

Rețineți că lista rezultată este de dimensiune fixă (nu puteți adăuga la ea).

Donald Raab

Cu Eclipse Collections, puteți scrie următoarele:

List<String> list = Lists.mutable.with("s1", "s2", "s3");

De asemenea, puteți fi mai specific în ceea ce privește tipurile și dacă sunt Mutable sau Immutable.

MutableList<String> mList = Lists.mutable.with("s1", "s2", "s3");
ImmutableList<String> iList = Lists.immutable.with("s1", "s2", "s3");

De asemenea, puteți face același lucru cu Seturi, Saci și Hărți:

Set<String> set = Sets.mutable.with("s1", "s2", "s3");
MutableSet<String> mSet = Sets.mutable.with("s1", "s2", "s3");
ImmutableSet<String> iSet = Sets.immutable.with("s1", "s2", "s3");

Bag<String> bag = Bags.mutable.with("s1", "s2", "s3");
MutableBag<String> mBag = Bags.mutable.with("s1", "s2", "s3");
ImmutableBag<String> iBag = Bags.immutable.with("s1", "s2", "s3");

Map<String, String> map = 
    Maps.mutable.with("s1", "s1", "s2", "s2", "s3", "s3");
MutableMap<String, String> mMap = 
    Maps.mutable.with("s1", "s1", "s2", "s2", "s3", "s3");
ImmutableMap<String, String> iMap = 
    Maps.immutable.with("s1", "s1", "s2", "s2", "s3", "s3");

Există fabrici și pentru SortedSets, SortedBags și SortedMaps.

SortedSet<String> sortedSet = SortedSets.mutable.with("s1", "s2", "s3");
MutableSortedSet<String> mSortedSet = SortedSets.mutable.with("s1", "s2", "s3");
ImmutableSortedSet<String> iSortedSet = SortedSets.immutable.with("s1", "s2", "s3");

SortedBag<String> sortedBag = SortedBags.mutable.with("s1", "s2", "s3");
MutableSortedBag<String> mSortedBag = SortedBags.mutable.with("s1", "s2", "s3");
ImmutableSortedBag<String> iSortedBag = SortedBags.immutable.with("s1", "s2", "s3");

SortedMap<String, String> sortedMap =
        SortedMaps.mutable.with("s1", "s1", "s2", "s2", "s3","s3");
MutableSortedMap<String, String> mSortedMap =
        SortedMaps.mutable.with("s1", "s1", "s2", "s2", "s3","s3");
ImmutableSortedMap<String, String> iSortedMap =
        SortedMaps.immutable.with("s1", "s1", "s2", "s2", "s3","s3");

Notă: Sunt un comitetor pentru Eclipse Collections.

MikaelF

Nu sunt familiarizat cu Guava, dar aproape toate soluțiile menționate în alte răspunsuri și care utilizează JDK suferă au unele defecte:

  1. Arrays.asList returnează o listă de dimensiune fixă.

  2. Se știe că inițializarea {{Double-brace initialization}} creează dezordine în classpath și încetinește execuția. De asemenea, necesită o linie de cod pentru fiecare element.

  3. Java 9: metoda statică de fabrică List.ofreturnează o listă imuabilă din punct de vedere structural. În plus, List.of este bazată pe valoriși, prin urmare, contractul său nu garantează că va returna de fiecare dată un obiect nou.


Iată un one-liner Java 8 pentru a aduna mai multe obiecte individuale într-o listă ArrayList, sau orice colecție, de altfel.

List<String> list = Stream.of("s1", "s2", "s3").collect(Collectors.toCollection(ArrayList::new));

Notă: soluția lui aioobe de copiere a unei colecții tranzitorii (new ArrayList<>(Arrays.asList("s1", "s2", "s3"))) este, de asemenea, excelentă.