Comment créer une nouvelle liste en Java


762

Nous créons un Setas:

Set myset = new HashSet()

Comment créer un Listen Java?


1
Sur le javadoc pour List. "Toutes les classes d'implémentation connues: AbstractList, AbstractSequentialList, ArrayList, AttributeList, CopyOnWriteArrayList, LinkedList, RoleList, RoleUnresolvedList, Stack, Vector"
KitsuneYMG

121
Cette question est l'un des meilleurs succès de Google pour "java create list" et elle a un ensemble de réponses très utiles, donc cela semble être une question assez raisonnable pour moi :-)
JosephH

52
C'est une bonne question avec de bonnes réponses. L'un des objectifs de Stack Overflow est de créer une sorte de réponse canonique aux questions de programmation, du moins selon les fondateurs du site. Essayez donc d'éviter à l'avenir de voter contre ce type de messages, si vous pouvez résister à la tentation.
eggonlegs

Réponses:


978
List myList = new ArrayList();

ou avec des génériques ( Java 7 ou version ultérieure)

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

ou avec des génériques (anciennes versions java)

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

68
Notez que ArrayList n'est pas le seul type de List - et, en ce qui concerne la question, HashSet n'est pas le seul type de Set.
slim

17
Je suis surpris que personne n'ait mentionné que vous pouvez rechercher l'interface de liste dans la documentation Java pour obtenir une liste définitive de toutes les classes qui implémentent List: docs.oracle.com/javase/7/docs/api/java/util /List.html
David Mason

5
Si vous utilisez un IDE, vous pouvez également généralement y afficher une hiérarchie de types, ce qui peut être plus pratique. Dans Eclipse, le raccourci par défaut est F4 et dans IDEA, c'est Ctrl + H.
David Mason

1
D'après ce que je comprends, vous ne pouvez pas utiliser de génériques avec ArrayList dans C # MSDN
JohnOsborne

5
Le deuxième argument de type explicite <MyType> peut être remplacé par juste <> pour Java 7 et 8.
Jannik

469

De plus, si vous souhaitez créer une liste contenant des éléments (même si sa taille sera fixe):

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

15
La mise en garde est que ce type de liste (celle renvoyée par asList ()) est immuable.
Avrom

70
@Avron - faux: ce n'est qu'une taille fixe: vous ne pouvez pas changer la taille, mais vous pouvez changer le contenu (mise en garde de la mise en garde?)
user85421

Impressionnant. Merci d'être concis.
R Claven

1
s'il n'y a qu'une seule chose dans la liste, j'utilise Collections.singletonList () au lieu de Arrays.asList (). (Mais, je suppose, je ne sais pas pourquoi.)
MikeB

@MikeB si vous ne savez pas pourquoi, restez sur l'arrays.aslist
bharal

183

Permettez-moi de résumer et d'ajouter quelque chose:

JDK

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

Goyave

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

Liste immuable

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

Liste immuable vide

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

Liste des personnages

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

Liste des entiers

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

Ints.asListne crée pas une liste immuable, mais une liste de taille fixe soutenue par un tableau donné d'ints (c'est-à-dire qu'il prend en charge List.set(int, Object)). Le deuxième exemple de "Liste immuable de caractères" n'est pas immuable non plus (je supprimerais cette ligne).
Xaerxess

9
Ne pas utiliser de génériques est un très bon exemple pour tout développeur qui lira ceci.
Natix

60

Dans Java 8

Pour créer une liste non vide de taille fixe (les opérations telles que l'ajout, la suppression, etc. ne sont pas prises en charge):

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

Pour créer une liste mutable non vide:

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

Dans Java 9

Utilisation d'une nouvelle List.of(...)méthode d'usine statique:

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

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

Dans Java 10

Utilisation de l' inférence de type variable locale :

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

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

var list3 = new ArrayList<String>();

Et suivez les meilleures pratiques ...

N'utilisez pas de types bruts

Depuis Java 5, les génériques font partie du langage - vous devez les utiliser:

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

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

Programme aux interfaces

Par exemple, programmez l' Listinterface:

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

Au lieu de:

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

1
Bonjour, pourriez-vous s'il vous plaît suggérer où je peux apprendre ces différences et l'évolution de Java? Semble très intéressant!
shiv

31

Lisez d'abord ceci , puis lisez ceci et ceci . 9 fois sur 10, vous utiliserez l'une de ces deux implémentations.

En fait, il suffit de lire le Guide de Sun sur le framework Collections .


11
J'ajouterais même "8 fois sur 10", vous utiliserez ArrayList, juste parce que cela n'a pas d'importance dans 9,9 fois sur 10.
Joachim Sauer

1
LinkedList est sémantiquement approprié lorsque vous ne vous souciez que des fins.
Adam Jaskiewicz

Les LinkedLists sont excellentes si vous voulez simplement les parcourir. Pour moi, il semble que les listes chaînées soient plus élégantes, mais c'est peut-être simplement parce que j'ai appris le lisp avant Java.
KarlP

@Karlp D'accord. Je dirais que c'est environ 50/50 la plupart du temps entre ArrayList et LinkedList, et la réponse n'est pas toujours sur la complexité des opérations; le plus souvent, c'est simplement ce qui convient au problème à résoudre.
Adam Jaskiewicz

1
J'ai presque toujours utilisé ArrayList. Si je ne travaille qu'avec les extrémités d'une liste, c'est un deque (ou une file d'attente) et j'utilise l' ArrayDequeimplémentation. La raison en est que même si les implémentations basées sur les baies peuvent gaspiller de la mémoire sur des emplacements vides (lorsque je ne peux pas prédire la capacité nécessaire), pour les petites collections, cela est comparable à la surcharge de toutes les instances de noeud dans une liste liée ( ou deque). Et en retour, j'obtiens un accès aléatoire. Quel avantage unique LinkedListoffre?
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

Depuis Java 7, vous avez une inférence de type pour la création d'instances génériques , il n'est donc pas nécessaire de dupliquer les paramètres génériques sur le côté droit de l'affectation:

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

Une liste de taille fixe peut être définie comme:

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

Pour des listes immuables, vous pouvez utiliser la bibliothèque Guava :

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

J'ai une question concernant cette déclaration List <String> list = Arrays.asList ("foo", "bar"); Je me demande si la liste dans la déclaration est un objet?

20

La liste n'est qu'une interface comme Set .

Comme HashSet est une implémentation d'un ensemble qui possède certaines propriétés en ce qui concerne les performances d'ajout / recherche / suppression, ArrayList est l'implémentation nue d'une liste.

Si vous jetez un œil à la documentation des interfaces respectives, vous trouverez "Toutes les classes d'implémentation connues" et vous pourrez décider laquelle est la plus adaptée à vos besoins.

Il y a de fortes chances que ce soit ArrayList .


18

Listest une interface comme Setet a ArrayListet LinkedListcomme implémentations à usage général .

Nous pouvons créer une liste comme:

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

Nous pouvons également créer une liste de taille fixe comme:

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

Nous utiliserions presque toujours ArrayListplutôt que la LinkedListmise en œuvre:

  1. LinkedList utilise beaucoup d'espace pour les objets et fonctionne mal lorsque nous avons beaucoup d'éléments.
  2. Toute opération indexée dans LinkedListnécessite O (n) de temps par rapport à O (1) in ArrayList.
  3. Consultez ce lien pour plus d'informations.

La liste créée par Arrays.asListci-dessus ne peut pas être modifiée structurellement mais ses éléments peuvent toujours être modifiés.

Java 8

Selon le document , la méthode Collections.unmodifiableListrenvoie une vue non modifiable de la liste spécifiée. Nous pouvons l'obtenir comme:

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

Java 9

Dans le cas où nous utilisons Java 9, alors:

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

Java 10

Dans le cas où nous en sommes à Java 10, la méthode Collectors.unmodifiableListretournera une instance de liste vraiment non modifiable introduite dans Java 9. Vérifiez cette réponse pour plus d'informations sur la différence entre Collections.unmodifiableList vs Collectors.unmodifiableListet Java 10 .


9

Parfois - mais très rarement - au lieu d'une nouvelle ArrayList, vous pouvez souhaiter une nouvelle LinkedList. Commencez avec ArrayList et si vous avez des problèmes de performances et des preuves que la liste est le problème, et que vous ajoutez et supprimez beaucoup à cette liste - alors - pas avant - passez à une LinkedList et voyez si les choses s'améliorent. Mais dans l'ensemble, restez avec ArrayList et tout ira bien.


9
List list = new ArrayList();

Ou avec des génériques

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

Vous pouvez, bien sûr, remplacer la chaîne par n'importe quel type de variable, comme Integer, également.


7

Un exemple:

List somelist = new ArrayList();

Vous pouvez consulter le javadoc pour List et trouver toutes les classes d'implémentation connues de l' Listinterface qui sont incluses avec l'API Java.


7

À l'aide de Google Collections , vous pouvez utiliser les méthodes suivantes dans la classe Lists

import com.google.common.collect.Lists;

// ...

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

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

Il existe des surcharges pour l'initialisation des varargs et l'initialisation à partir d'un Iterable<T>.

L'avantage de ces méthodes est que vous n'avez pas besoin de spécifier explicitement le paramètre générique comme vous le feriez avec le constructeur - le compilateur le déduira du type de la variable.


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

Vous devez importer Listet ArrayList.


6

Plus d'options pour faire la même chose avec Java 8, pas mieux, pas pire, juste différent et si vous voulez faire un travail supplémentaire avec les listes, Streams vous fournira plus d'alternatives (filtrer, mapper, réduire, etc.)

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

Avec Java 9, vous pouvez effectuer les opérations suivantes pour créer un immuable List :

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

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

6

En option, vous pouvez utiliser l'initialisation à double accolade ici:

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

2
C'est une opération coûteuse. Vous créez ici une sous-classe anonyme d'ArrayList.
Vikram Bodicherla

@VikramBodicherla Je suis d'accord. Il s'agit davantage de sucre syntaxique ici.
angry_gopher


5
List arrList = new ArrayList();

Il vaut mieux utiliser des génériques comme suggéré ci-dessous:

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

arrList.add("one");

Dans le cas où vous utilisez LinkedList.

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

4

À l'aide des collections Eclipse, vous pouvez créer une liste comme celle-ci:

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

Si vous voulez une liste immuable:

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

Vous pouvez éviter la boxe automatique en utilisant des listes primitives. Voici comment créer des listes int:

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

Il existe des variantes pour les 8 primitives.

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

Remarque: je suis un committer pour les collections Eclipse.


4

Voici quelques façons de créer des listes.

  • Cela créera une liste de taille fixe, l' ajout / la suppression d' éléments n'est pas possible, il lancera un java.lang.UnsupportedOperationExceptionsi vous essayez de le faire.

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


  • La version suivante est une liste simple où vous pouvez ajouter / supprimer un nombre illimité d'éléments.

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


  • Voici comment créer un LinkedListen Java, Si vous devez faire l' insertion fréquente / suppression d'éléments sur la liste, vous devez utiliser au LinkedListlieu deArrayList

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

1
Vous pouvez utiliser Arrays.asList("Male", "Female").
Johny

3

Essaye ça:

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

Ou:

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

2

Si vous avez besoin d'une liste sérialisable et immuable avec une seule entité, vous pouvez utiliser:

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

2

Comme la déclaration de la liste des tableaux en Java est comme

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

Il existe de nombreuses façons de créer et d'initialiser une liste de tableaux en Java.

 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();
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.