Java'da yeni bir liste nasıl oluşturulur


762

Şu şekilde bir oluşturuyoruz Set:

Set myset = new HashSet()

ListJava'da nasıl oluştururuz ?


1
Liste için javadoc. "Bilinen Tüm Uygulayıcı Sınıflar: AbstractList, AbstractSequentialList, ArrayList, AttributeList, CopyOnWriteArrayList, LinkedList, RoleList, RoleUnresolvedList, Stack, Vector"
KitsuneYMG

121
Bu soru "java oluşturma listesi" için en iyi google hit biridir ve çok yararlı bir cevap seti vardır, bu yüzden bana makul bir soru gibi görünüyor :-)
JosephH

52
İyi cevapları olan güzel bir soru. Stack Overflow'un amaçlarından biri, en azından sitenin kurucularına göre, programlama soruları için bir tür kanonik cevap oluşturmaktır. Bu yüzden, eğer günaha karşı koyabilirseniz, gelecekte bu tür gönderilerin oylarını düşürmekten kaçının.
eggonlegs

Yanıtlar:


977
List myList = new ArrayList();

veya jeneriklerle ( Java 7 veya üzeri)

List<MyType> myList = new ArrayList<>();

veya jeneriklerle (Eski java sürümleri)

List<MyType> myList = new ArrayList<MyType>();

68
ArrayList'in tek liste türü olmadığını ve soru ile ilgili olarak HashSet'in tek Set türü olmadığını unutmayın.
ince

17
Listeyi uygulayan tüm sınıfların kesin bir listesini almak için Java belgelerinde liste arayüzüne bakabileceğinizden kimsenin bahsetmediğinden şaşırdım
David Mason

5
Bir IDE kullanıyorsanız, genellikle daha uygun olabilecek bir tür hiyerarşisini de görüntüleyebilirsiniz. Eclipse'de varsayılan kısayol F4'tür ve IDEA'da Ctrl + H'dir.
David Mason

1
Anladığım kadarıyla C # MSDN'de
JohnOsborne

5
İkinci açık tür argümanı <MyType>, Java 7 ve 8 için yalnızca <> ile değiştirilebilir
Jannik

469

Ayrıca, içinde bir şeyler olan bir liste oluşturmak istiyorsanız (sabit boyutta olsa da):

List<String> messages = Arrays.asList("Hello", "World!", "How", "Are", "You");

15
Uyarı, bu tür listelerin (asList () tarafından döndürülen listenin) değiştirilemez olmasıdır.
Avrom

70
@Avron - yanlış: sadece sabit boyut: boyutu değiştiremezsiniz, ancak içeriği değiştirebilirsiniz (
uyarının

Muhteşem. Kısa ve öz olduğun için teşekkürler.
R Claven

1
listede tek bir şey varsa, Arrays.asList () yerine Collections.singletonList () kullanın. (Ama sanırım neden bilmiyorum.)
MikeB

@MikeB, neden bilmiyorsanız arrays.aslist'e sadık kalın
bharal

183

Özetleyeyim ve bir şeyler ekleyeyim:

JDK

1. new ArrayList<String>();
2. Arrays.asList("A", "B", "C")

Guava

1. Lists.newArrayList("Mike", "John", "Lesly");
2. Lists.asList("A","B", new String [] {"C", "D"});

Değişmez Liste

1. Collections.unmodifiableList(new ArrayList<String>(Arrays.asList("A","B")));
2. ImmutableList.builder()                                      // Guava
            .add("A")
            .add("B").build();
3. ImmutableList.of("A", "B");                                  // Guava
4. ImmutableList.copyOf(Lists.newArrayList("A", "B", "C"));     // Guava

Boş değişmez liste

1. Collections.emptyList();
2. Collections.EMPTY_LIST;

Karakter Listesi

1. Lists.charactersOf("String")                                 // Guava
2. Lists.newArrayList(Splitter.fixedLength(1).split("String"))  // Guava

Tamsayıların Listesi

Ints.asList(1,2,3);                                             // Guava

Ints.asListdeğişmez bir liste oluşturmaz, ancak verilen veri dizisi tarafından desteklenen sabit boyutlu bir liste oluşturur (yani destekler List.set(int, Object)). "Değişmez Karakterler Listesi" nin ikinci örneği de değiştirilemez (bu satırı kaldıracağım).
Xaerxess

9
Jenerik kullanmamak bunu okuyacak herhangi bir geliştirici için gerçekten "iyi" bir örnek oluşturur.
Natix

60

Java 8'de

Boş olmayan sabit boyutlu bir liste oluşturmak için (toplama, kaldırma vb. İşlemler desteklenmez):

List<Integer> list = Arrays.asList(1, 2); // but, list.set(...) is supported

Boş olmayan değiştirilebilir bir liste oluşturmak için:

List<Integer> list = new ArrayList<>(Arrays.asList(3, 4));

Java 9'da

Yeni bir List.of(...)statik fabrika yöntemleri kullanarak :

List<Integer> immutableList = List.of(1, 2);

List<Integer> mutableList = new ArrayList<>(List.of(3, 4));

Java 10'da

Yerel Değişken Türü Çıkarımını Kullanma :

var list1 = List.of(1, 2);

var list2 = new ArrayList<>(List.of(3, 4));

var list3 = new ArrayList<String>();

Ve en iyi uygulamaları takip edin ...

Ham türleri kullanma

Java 5'ten beri, jenerikler dilin bir parçası olmuştur - bunları kullanmalısınız:

List<String> list = new ArrayList<>(); // Good, List of String

List list = new ArrayList(); // Bad, don't do that!

Arayüzlere program

Örneğin, Listarabirime programlayın :

List<Double> list = new ArrayList<>();

Onun yerine:

ArrayList<Double> list = new ArrayList<>(); // This is a bad idea!

1
Merhaba, lütfen bu farklılıkları ve Java'nın evrimini nereden öğrenebileceğimi önerebilir misiniz? Çok ilginç görünüyor!
shiv

31

İlk okuma bu , o zaman okumak bu ve bu . 10 üzerinden 9 kez bu iki uygulamadan birini kullanacaksınız.

Aslında, Sun'ın Koleksiyonlar Çerçevesi Kılavuzunu okuyun .


11
Hatta 10 üzerinden 9,9 kez önemli olmadığı için ArrayList kullanacaksınız "10 üzerinden 8 kez" ekleyeceğim.
Joachim Sauer

1
LinkedList semantik olarak sadece sonları gerçekten önemsediğinizde uygundur.
Adam Jaskiewicz

LinkedLists, sadece bunları yineleyecekseniz mükemmeldir. Bana göre, bağlantılı listeler daha zarif gibi görünüyor, ama belki sadece Java önce lisp öğrendim çünkü.
KarlP

@Karlp Kabul etti. Ben ArrayList ve LinkedList arasında çoğu zaman yaklaşık 50/50 olduğunu söyleyebilirim ve cevap her zaman operasyonların karmaşıklığı ile ilgili değildir; daha sıklıkla eldeki problem için doğru olan şey budur.
Adam Jaskiewicz

1
Neredeyse hep kullandım ArrayList. Sadece bir listenin uçları ile çalışıyorsanız, bu bir deque (veya kuyruk) ve ben ArrayDequeuygulamayı kullanın . Nedeni dizi tabanlı uygulamalar olsa olmasıdır olabilir ((ben gerekli kapasiteyi tahmin edemez iken) boş yuvalara bazı bellek atık, küçük koleksiyonları için bu bir bağlantılı listedeki tüm düğüm örneklerinin yükü ile karşılaştırılabilir olduğunu veya deque). Ve karşılığında rastgele erişim elde ediyorum. Hangi eşsiz fayda LinkedListsağlar?
erickson

21
//simple example creating a list form a string array

String[] myStrings = new String[] {"Elem1","Elem2","Elem3","Elem4","Elem5"};

List mylist = Arrays.asList(myStrings );

//getting an iterator object to browse list items

Iterator itr= mylist.iterator();

System.out.println("Displaying List Elements,");

while(itr.hasNext())

  System.out.println(itr.next());

21

Java 7'den , genel örnek oluşturma için yazım çıkarımınız olduğundan, atamanın sağ tarafında genel parametreleri çoğaltmaya gerek yoktur:

List<String> list = new ArrayList<>();

Sabit boyutlu bir liste şu şekilde tanımlanabilir:

List<String> list = Arrays.asList("foo", "bar");

Değişmez listeler için Guava kütüphanesini kullanabilirsiniz :

List<String> list = ImmutableList.of("foo", "bar");

Bu bildirim listesi ile ilgili bir sorum var <String> list = Arrays.asList ("foo", "bar"); Açıklamadaki listenin bir nesne olup olmadığını merak ediyorum.

20

Liste sadece Set gibi bir arayüzdür .

HashSet, performans eklemek / aramak / kaldırmak için belirli özelliklere sahip bir Set uygulaması gibi, ArrayList bir Listenin çıplak uygulamasıdır.

İlgili arayüzlerin belgelerine bir göz attıysanız "Bilinen Tüm Uygulayıcı Sınıflar" ı bulacaksınız ve hangisinin ihtiyaçlarınız için daha uygun olduğuna karar verebilirsiniz.

Muhtemelen ArrayList olmasıdır .


18

Listgibi bir arayüz Setvardır ve ArrayListve LinkedListşekilde genel amaçlı uygulamaları .

Listeyi şu şekilde oluşturabiliriz:

 List<String> arrayList = new ArrayList<>();
 List<String> linkedList = new LinkedList<>(); 

Ayrıca sabit boyutlu bir liste de oluşturabiliriz:

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

Neredeyse her zaman uygulamaya ArrayListkarşı LinkedListçıkardık:

  1. LinkedList nesneler için çok fazla alan kullanır ve çok sayıda öğemiz olduğunda kötü performans gösterir.
  2. Endekslenen herhangi bir işlem, LinkedListO (1)ArrayList .
  3. Daha fazla bilgi için bu bağlantıyı kontrol edin .

Tarafından oluşturulan liste Arrays.asListYukarıda yapısal olarak değiştirilemez, ancak elemanları yine de değiştirilebilir.

Java 8

Doc başına , yöntemCollections.unmodifiableList , belirtilen liste degistiremeyeceginiz görünüm verir. Gibi alabiliriz:

Collections.unmodifiableList(Arrays.asList("A", "B", "C"));

Java 9

Java 9 kullanmamız durumunda :

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

Java 10

Java 10'da olmamız durumunda, yöntem Collectors.unmodifiableListJava 9'da tanıtılan gerçekten değiştirilemez listenin bir örneğini döndürür . Java 10'daki vs arasındaki fark hakkında daha fazla bilgi için bu yanıtı kontrol edin .Collections.unmodifiableListCollectors.unmodifiableList


9

Bazen - ancak çok nadiren - yeni bir ArrayList yerine yeni bir LinkedList isteyebilirsiniz. ArrayList ile başlayın ve performans sorunları ve listenin sorun olduğuna dair kanıtlarınız varsa ve o listeye çok fazla ekleme ve silme - o zaman - daha önce değil - bir LinkedList'e geçin ve işlerin iyileşip iyileşmediğine bakın. Ama anada, ArrayList ile sopa ve her şey iyi olacak.


9
List list = new ArrayList();

Veya jeneriklerle

List<String> list = new ArrayList<String>();

Elbette, dizeyi Integer gibi herhangi bir değişkenle de değiştirebilirsiniz.


7

Bir örnek:

List somelist = new ArrayList();

Javadoc for List'e bakabilir Listve java api ile birlikte gelen arabirimin bilinen tüm uygulama sınıflarını bulabilirsiniz .


7

Google Koleksiyonlarını kullanarak Listeler sınıfında aşağıdaki yöntemleri kullanabilirsiniz

import com.google.common.collect.Lists;

// ...

List<String> strings = Lists.newArrayList();

List<Integer> integers = Lists.newLinkedList();

Varargs başlatma ve başlatma için aşırı yükler vardır. Iterable<T> .

Bu yöntemlerin avantajı, genel parametreyi yapıcıda yaptığınız gibi açıkça belirtmenize gerek olmamasıdır - derleyici bunu değişkenin türünden çıkarır.


6
List<Object> nameOfList = new ArrayList<Object>();

İçe aktarmanız Listve ArrayList.


6

Java 8 ile aynı şeyi yapmak için daha fazla seçenek, daha iyi değil, daha kötü değil, sadece farklı ve listelerle ekstra iş yapmak istiyorsanız, Akışlar size daha fazla alternatif sağlayacaktır (filtre, harita, azaltma vb.)

List<String> listA = Stream.of("a", "B", "C").collect(Collectors.toList());
List<Integer> listB = IntStream.range(10, 20).boxed().collect(Collectors.toList());
List<Double> listC = DoubleStream.generate(() -> { return new Random().nextDouble(); }).limit(10).boxed().collect(Collectors.toList());
LinkedList<Integer> listD = Stream.iterate(0, x -> x++).limit(10).collect(Collectors.toCollection(LinkedList::new));

6

Java 9 ile, değişmez bir şey oluşturmak için aşağıdakileri yapabilirsiniz List:

List<Integer> immutableList = List.of(1, 2, 3, 4, 5);

List<Integer> mutableList = new ArrayList<>(immutableList);

6

Bir seçenek olarak, burada çift ayraç başlatmayı kullanabilirsiniz:

List<String> list = new ArrayList<String>(){
  {
   add("a");
   add("b");
  }
};

2
Bu pahalı bir işlem. Burada ArrayList'in anonim bir alt sınıfını oluşturuyorsunuz.
Vikram Bodicherla

@VikramBodicherla katılıyorum. Burada daha çok sözdizimi şekeri ile ilgili.
angry_gopher


5
List arrList = new ArrayList();

Jenerikleri aşağıda önerildiği gibi kullanmanız daha iyi olur:

List<String> arrList = new ArrayList<String>();

arrList.add("one");

LinkedList kullanmanız durumunda.

List<String> lnkList = new LinkedList<String>();

4

Eclipse Koleksiyonlarını kullanarak şöyle bir Liste oluşturabilirsiniz:

List<String> list1 = Lists.mutable.empty();
List<String> list2 = Lists.mutable.of("One", "Two", "Three");

Değişmez bir liste istiyorsanız:

ImmutableList<String> list3 = Lists.immutable.empty();
ImmutableList<String> list4 = Lists.immutable.of("One", "Two", "Three");

İlkel listeler kullanarak otomatik boksu önleyebilirsiniz. İnt listelerini nasıl oluşturacağınız aşağıda açıklanmıştır:

MutableIntList list5 = IntLists.mutable.empty();
MutableIntList list6 = IntLists.mutable.of(1, 2, 3);

ImmutableIntList list7 = IntLists.immutable.empty();
ImmutableIntList list8 = IntLists.immutable.of(1, 2, 3);

8 ilkel için de varyantlar vardır.

MutableLongList longList       = LongLists.mutable.of(1L, 2L, 3L);
MutableCharList charList       = CharLists.mutable.of('a', 'b', 'c');
MutableShortList shortList     = ShortLists.mutable.of((short) 1, (short) 2, (short) 3);
MutableByteList byteList       = ByteLists.mutable.of((byte) 1, (byte) 2, (byte) 3);
MutableBooleanList booleanList = BooleanLists.mutable.of(true, false);
MutableFloatList floatList     = FloatLists.mutable.of(1.0f, 2.0f, 3.0f);
MutableDoubleList doubleList   = DoubleLists.mutable.of(1.0, 2.0, 3.0);

Not: Eclipse Collections için bir komisyoncuyum.


4

Listeler oluşturmanın bazı yolları aşağıdadır.

  • Bu, sabit boyutlu bir liste oluşturur, öğe eklemek / kaldırmak mümkün değildir, bunu yapmaya java.lang.UnsupportedOperationExceptionçalışırsanız bir atar .

    List<String> fixedSizeList = Arrays.asList(new String[] {"Male", "Female"});


  • Aşağıdaki sürüm, istediğiniz sayıda öğe ekleyebileceğiniz / kaldırabileceğiniz basit bir listedir.

    List<String> list = new ArrayList<>();


  • Java'da nasıl oluşturulacağı LinkedList, Listeye öğelerin sık sık eklenmesi / silinmesi gerekiyorsa, LinkedListbunun yerineArrayList

    List<String> linkedList = new LinkedList<>();

1
Kullanabilirsiniz Arrays.asList("Male", "Female").
Johny

3

Bunu dene:

List<String> messages = Arrays.asList("bla1", "bla2", "bla3");

Veya:

List<String> list1 = Lists.mutable.empty(); // Empty
List<String> list2 = Lists.mutable.of("One", "Two", "Three");

2

Tek bir varlık ile serileştirilebilir, değiştirilemez bir listeye ihtiyacınız varsa kullanabilirsiniz:

List<String> singList = Collections.singletonList("stackoverlow");

2

Java'da dizi listesinin bildirimi gibi

public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable  

Java'da dizi listesi oluşturmanın ve başlatmanın birçok yolu vardır.

 1) List list = new ArrayList();

 2) List<type> myList = new ArrayList<>();

 3) List<type> myList = new ArrayList<type>();

 4) Using Utility class

    List<Integer> list = Arrays.asList(8, 4);
    Collections.unmodifiableList(Arrays.asList("a", "b", "c"));

 5) Using static factory method

    List<Integer> immutableList = List.of(1, 2);


 6) Creation and initializing at a time

    List<String> fixedSizeList = Arrays.asList(new String[] {"Male", "Female"});



 Again you can create different types of list. All has their own characteristics

 List a = new ArrayList();
 List b = new LinkedList();
 List c = new Vector(); 
 List d = new Stack(); 
 List e = new CopyOnWriteArrayList();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.