Cabinet de curiosité du JDK n°1 : Arrays.asList

N'avez-vous jamais utilisé la classe ArrayList ? Certainement, et à foison je dirais même. Néanmoins, il existe une curiosité dans le JDK. Cette classe est en double ! ou plutôt le nom ArrayList est utilisé deux fois dans le jdk.
En effet, la classe utilitaire java.util.Arrays possède une classe interne ArrayList.

Cette classe est utilisée lors de l'appel à la méthode :

Arrays.asList(Object[])

La définition de cette méthode est la suivante  :

public static <T> List<T> asList(T... a) {
    return new ArrayList<T>(a);
}

avec ArrayList une classe interne définie dans cette même classe :

private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, Serializable {
    ...
}

Cela peut poser un gros problème dans le cas où vous voulez parcourir la liste retournée par Arrays.asList et supprimer certains éléments. En effet l'objet retourné est un tableau non modifiable ; vous obtiendrez alors une UnsupportedOperationException dont la source peut être relativement difficile à débugger.

Pour éviter ce comportement fâcheux, il vous faudra utiliser quelque chose comme suit :

Object[] objectArray ...;
java.util.List result = new java.util.ArraysList(Arrays.asList(objectArray));

Ce qui est pour le moins un peu plus compliqué et plus couteux en temps d'exécution : une itération supplémentaire sur la collection est nécessaire pour constituer l'instance de java.util.ArrayList.

En conclusion : quand vous utilisez la méthode Arrays.asList assurez-vous que vous n'aurez pas à supprimer des éléments dans la liste résultante.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.