Soru Java dizeleri dizesini başlatmak için en kısa yol nedir?


Dizeleri ve dizileri dizisini, yani liste / dizi içeren dizinin listesini başlatmak için en kısa yolu (kodda) arıyorum. "s1", "s2", "s3" dize elemanları.


44
2018-06-29 12:08


Menşei




Cevaplar:


Çeşitli seçenekler var. Şahsen kullanmaktan hoşlanıyorum Guava:

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

(Guava'nın sahip olduğu bir kütüphane, elbette :)

Sadece JDK'yi kullanarak şunları kullanabilirsiniz:

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

Bunun bir geri döneceğini unutmayın. ArrayListama bu değil normal java.util.ArrayList - Değişebilir ama sabit boyutlu olan bir içsel.

Kişisel olarak Guava versiyonunu tercih ediyorum, çünkü neler olup bittiğini açıklıyor (iade edilecek liste uygulaması). Ayrıca yine yöntemi statik olarak içe aktarırsanız neler olup bittiğini netleştirin:

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

... statik olarak içe aktarıyorsanız asList biraz tuhaf görünüyor.

Değiştirilebilir herhangi bir yol listesinde istemiyorsanız başka bir Guava seçeneği:

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

Ben genellikle istiyorum ya Tamamen değişebilir bir listeye sahip olmak Lists.newArrayList en iyisi) veya tamamen değişmez bir liste (bu durumda) ImmutableList.of en iyisi). Çok nadiren istemek değişebilen ama sabit boyutlu bir liste.


87
2018-06-29 12:10



Güzel....Arrays.asList() aynı şeyi yapar ..... :) - Buhake Sindi
neden sadece Arrays.asList ("s1", "s2", "s3") değil? - BegemoT
@BegemoT: Bunu ekliyordum - kişisel olarak Guava versiyonunun açık doğasını tercih ediyorum. - Jon Skeet
değiştirilemez olan - Aslında değiştirilebilir (ancak sabit boyutlu). - aioobe
@aioobe: Eek - düzeltecek, teşekkürler. - Jon Skeet


Java 9+

Java 9 bir kolaylık yöntemi sunuyor List.of aşağıdaki gibi kullanılır:

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

Java 8 ve üstü

İşte birkaç alternatif:

// 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");
}};


Diziler söz konusu olduğunda, bunu aşağıdaki gibi bir bildirim noktasında başlatabilirsiniz:

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

Yeniden başlatmaya ihtiyaç duyarsanız veya bir değişkende saklamaksızın oluşturursanız,

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

Dize sabitleri olsa bile, gibi görünecek

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

Bunlarda genellikle yazmayı tercih ederim

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

22
2018-06-29 12:12



@ Elit Beyefendi: Arrays.asList'in sonucu değişmez. Yeni bir ArrayList öğesi olduğu gibi oluşturulursa str2 daha sonra listeye eklemek mümkündür. - Mathias Schwarz
@Mathias Schwarz, sabit değil, değişmez. - aioobe
@aioobe: Haklısınız! Mevcut girişlerin üzerine yazmak mümkündür. - Mathias Schwarz
Açıklamalar için +1, cevapları için. - mre
Dikkat etmelisin ki başlatma bloğu varyant, ArrayList sınıfının anonim bir alt sınıfını oluşturur. - Paŭlo Ebermann


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

Tüm bu nesneler JDK'da var.

Not: Gibi aioobe Belirtilen, bu liste sabit boyutlu yapar.


14
2018-06-29 12:10



Sonuçta ortaya çıkan liste, düzeltme boyutunda. - aioobe
@aioobe, teşekkürler ... güncellendi gönderi. - Buhake Sindi


Kullanabilirsiniz Arrays standart Java API'sinde sınıf: http://download.oracle.com/javase/6/docs/api/java/util/Arrays.html#asList(T...)

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

Sonuç listesinin sabit boyutlu olduğunu unutmayın (ekleyemezsiniz).


3
2018-06-29 12:12





İle Eclipse Koleksiyonlar, aşağıdakileri yazabilirsiniz:

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

Ayrıca türler ve bunların Değişken veya Ölümsüz olup olmadığı konusunda daha spesifik olabilirsiniz.

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

Aynı şeyi Takımlar, Çantalar ve Haritalar ile de yapabilirsiniz:

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");

SortedSets, SortedBags ve SortedMaps fabrikaları da var.

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: Eclipse koleksiyonları için bir üyeyim.


2
2018-01-29 03:32





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");

Ayrıca Guava gibi diğer kütüphaneler tarafından sağlanan birçok başka yol var.


1
2018-05-08 09:02





Guava'ya aşina değilim, fakat diğer cevaplarda belirtilen ve JDK'nın acılarını kullanan neredeyse tüm çözümlerin bazı kusurları var:

  1. Arrays.asList yöntem, sabit boyutlu bir liste döndürür.

  2. {{Double-brace initialization}}, classpath karmaşası oluşturduğu ve yavaşlatmak. Ayrıca eleman başına bir satır kod gerektirir.

  3. Java 9: statik fabrika yöntemi List.ofyapısal olarak değişmez bir liste döndürür. Dahası, List.of olduğu değeri tabanlıve dolayısıyla sözleşmesi, her seferinde yeni bir nesne döndüreceğini garanti etmez.


Burada, birden fazla nesneyi bir araya getirmek için bir Java 8 tek katlı ArrayListveya bu konuyla ilgili herhangi bir koleksiyon.

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

Not: aioobe'nun geçici bir koleksiyonun kopyalanması çözümü (new ArrayList<>(Arrays.asList("s1", "s2", "s3"))) ayrıca mükemmel.


0
2018-01-29 01:24