Y a-t-il un avantage (ou une grande différence) à utiliser Arrays.asList (quelque chose) sur Collections.singletonList (quelque chose) pour créer une liste contenant un élément? Ce dernier rend également la liste retournée immuable.
java
collections
Howard Grimberg
la source
la source
ImmutableList.of()
etLists.newArrayList()
dans le mélange.Réponses:
Collections.singletonList(something)
est immuable alors qu'ilArrays.asList(something)
s'agit d'uneList
représentation de taille fixe d'un tableau où la liste et le tableau sont joints dans le tas.Arrays.asList(something)
autorise les modifications non structurelles qui y sont apportées, qui sont reflétées à la fois dans la liste et dans le tableau joint. Il lanceUnsupportedOperationException
pour ajouter, supprimer des éléments bien que vous puissiez définir un élément pour un index particulier.Toute modification apportée à la liste renvoyée par
Collections.singletonList(something)
entraînera unUnsupportedOperationException
.De plus, la capacité de la liste renvoyée par
Collections.singletonList(something)
sera toujours de 1, contrairement à celleArrays.asList(something)
dont la capacité sera la taille de la baie sauvegardée.la source
J'ajouterais simplement que la liste singleton n'est pas soutenue par un tableau et a juste une référence à cet élément. Vraisemblablement, cela prendrait moins de mémoire et pourrait être important en fonction du nombre de listes que vous souhaitez créer.
la source
La méthode
Arrays.asList
renvoie une liste de taille fixe soutenue par le tableau spécifié. La méthode renvoie une instanceArrayList
dont est une classe statique imbriquée privée s'étendantAbstractList
et nonjava.util.ArrayList
. Cette classe statique fournit la mise en œuvre de quelques méthodes , par exemple ,set, indexOf, forEach, replaceAll
etc. , mais quand nous invoquonsadd
il n'a pas la mise en œuvre de sa propre méthode un peu deAbstractList
est invoquée qui jettejava.lang.UnsupportedOperationException
.Le
Collections.singletonList
renvoie une liste immuable contenant uniquement l'objet spécifié et il est également sérialisable.Par ailleurs, pour les listes immuables, nous utilisons généralement
Collections.unmodifiableList
ce qui renvoie une vue non modifiable de la liste spécifiée.Une collection de vues non modifiable est une collection qui n'est pas modifiable et qui est également une vue sur une collection de support. Notez que des modifications de la collection de sauvegarde peuvent encore être possibles et, si elles se produisent, elles sont visibles via la vue non modifiable.
Nous pouvons avoir une véritable liste immuable dans Java 10 et versions ultérieures. Il existe deux façons d'obtenir une liste vraiment non modifiable :
var unmodifiableList = List.copyOf(srcList);
var unmodifiableList = srcList.stream().collect(Collectors.toUnmodifiableList());
Si l'une de ces deux variables est utilisée, la valeur sera toujours "Apple" et non "Apricot".Selon la doc de Java 10 :
la source