J'ai récemment découvert qu'il existe en fait 2 implémentations ArrayList
différentes dans Java (mieux vaut tard que jamais je suppose ...).
Alors je me demandais pourquoi Arrays.asList(T... a)
avait besoin de retourner une liste qui ne peut pas être redimensionnée? S'ils avaient besoin d'une liste non modifiable, pourquoi ajouter la méthode set(int index, E element)
alors?
Donc ma question générale est de savoir pourquoi ne pas retourner le Java.util.ArrayList
De la méthode Arrays.asList(T... a)
?
Que gagnez-vous également avec l'implémentation Java.util.Arrays.ArrayList
?
Tu as demandé:
Que gagnez-vous également avec l'implémentation Java.util.Arrays.ArrayList?
C'est parce que le Arrays $ ArrayList retourné par Arrays.asList est juste une vue sur le tableau d'origine. Ainsi, lorsque le tableau d'origine est modifié, la vue est également modifiée.
Si l'on utilisait une vraie ArrayList, alors les éléments seront copiés, et une modification du tableau orignal n'influencerait pas l'ArrayList.
Les raisons de le faire sont assez simples:
Le javadoc dit que asList
renvoie "une liste de taille fixe soutenue par le tableau spécifié". Si vous souhaitez redimensionner le tableau, vous devez en créer un nouveau et copier les anciennes données. Ensuite, la liste ne sera pas sauvegardée par la même instance de baie. L'objectif déclaré est "Cette méthode fait office de pont entre les API basées sur des tableaux et sur des collections". et donc l'écriture directe dans le tableau sous-jacent est une exigence de conception.
Ce sont deux classes différentes avec des comportements différents.
La liste est retournée lorsque vous avez appelé Arrays.asList
est un wrapper fin sur le tableau, pas une copie. La liste renvoyée est de taille fixe: la tentative d'appeler add
lancera une exception UnsupportedOperationException
.
Le Java.util.ArrayList
d'autre part conserve sa propre copie interne des données et sa taille est variable.
Arrays.asList doit renvoyer une liste qui ne peut pas être redimensionnée - car le tableau sous-jacent ne peut pas être redimensionné - mais qui est modifiable - car l'affectation aux éléments du tableau sous-jacent est autorisée.
en fait, vous pouvez ajouter des éléments à la ArrayList avec add. méthode comme celle-ci:
List<String> l2= new ArrayList<String>(Arrays.asList(array1));
l2.add("blueCheese");
À mon avis, vous l'utilisez pour obtenir les fonctionnalités d'une liste mais en les appliquant à un tableau.
Deux remarques:
1, Tenter de réduire le tableau retourné en appelant la méthode remove () de l'interface List lèvera une UnsupportedOperationException. Cela est dû au fait que la classe ArrayList interne à l'intérieur de la classe Arrays étend AbstractList et que la méthode remove () dans AbstractList lève une exception UnsupportedException.
Ainsi, une fois que la liste est retournée, vous pouvez surstocker les éléments existants SOIT dans le tableau OR dans la liste retournée, MAIS vous n'êtes PAS autorisé à agrandir le tableau ou à réduire le tableau.
en fait, vous pouvez ajouter des éléments à la ArrayList avec add. méthode comme celle-ci: List l2 = new ArrayList (Arrays.asList (array1)); l2.add ("blueCheese");
-dbednar