Quand j'ai utilisé Java pendant longtemps, je suis resté un peu coincé avec Arrays.asList (), donc je vais écrire les notes de Arrays.asList () sous forme de mémorandum.
String[] words = {"abc","def","ghi"};
List<String> list = Arrays.asList(words);
Renvoie une liste de taille fixe qui fonctionne avec le tableau spécifié.
Dans [API Java](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Arrays.html#asList-T ...-), écrivez comme ci-dessus. C'est fait. Cela signifie que la longueur de la liste est fixe, même si la valeur de retour de la méthode asList est une liste.
Par exemple, si vous essayez de modifier le nombre d'éléments avec la méthode add ou remove pour la valeur de retour de la méthode asList, aucune erreur de compilation ne se produira, mais à l'exécution [java.lang.UnsupportedOperationException](https://docs.oracle. com / javase / jp / 8 / docs / api / java / lang / UnsupportedOperationException.html) se produira.
Ce point est également écrit dans l'API, donc si vous vérifiez correctement l'API, vous pouvez l'effacer sans aucun problème.
//Ajout d'éléments à une liste de longueur fixe
static void add() {
List<Integer> fixedSizeList = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
//UnsupportedOperationException se produit au moment de l'exécution.
fixedSizeList.add(11);
}
//Suppression d'éléments pour les listes de longueur fixe
static void remove() {
List<Integer> fixedSizeList = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
//UnsupportedOperationException se produit au moment de l'exécution.
fixedSizeList.remove(5);
}
Le problème de "la longueur de la liste est fixe" peut être évité en définissant "Spécifier la liste générée par la méthode asList dans le constructeur de ArrayList" comme indiqué ci-dessous.
Vous pouvez convertir une liste en tableau en une seule fois en utilisant List # toArray (), mais il semble que la conversion d'un tableau en une liste de longueur variable se fasse inévitablement en deux étapes.
// Arrays.asList()Convertissez la liste créée à l'étape 1 en une liste de longueur variable (mutable).
static void add2() {
List<Integer> fixedSizeList = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
List<Integer> list = new ArrayList<>(fixedSizeList);
//Aucune erreur ne se produit au moment de l'exécution.
list.add(11);
}
Si vous spécifiez un tableau de type primitif dans l'argument de Arrays.asList (), la valeur de retour ne sera pas List <type de classe wrapper>
.
Par exemple, si vous spécifiez int [] comme argument de Arrays.asList (), la valeur de retour sera List <int []>
.
Ce n'était pas du tout écrit dans l'API, donc je craignais qu'il ne se compile pas au début, mais en conséquence, j'étais soulagé de constater que cela fonctionnait comme spécifié.
Il semble qu'il existe une méthode telle que "spécifier un tableau de type de classe wrapper comme argument" pour éviter ce problème, mais il semble étrange de prendre la peine de le convertir en un type de classe wrapper.
static void create1() {
//S'il s'agit d'un tableau de type référence, le type de référence List sera renvoyé comme prévu....
String[] words = {"abc","def","ghi"};
List<String> list1 = Arrays.asList(words);
}
static void create2() {
//AsList un tableau de types primitifs()S'il est utilisé comme argument de, une liste avec 1 élément est renvoyée car "le tableau devient un élément de la liste".
// list2.size()Est 1.
int[] numbers = {1,2,3,4,5,6,7,8,9,10};
List<int[]> list2 = Arrays.asList(numbers);
System.out.println("longueur de la liste2:" + list2.size());
}
static void create3() {
//Argument de longueur variable asList()Si vous le transmettez à, la liste sera générée comme prévu même si l'argument est une valeur entière (= int).
// list3.size()Est 10.
List<Integer> list3 = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
System.out.println("list3 longueur:" + list3.size());
}
Recommended Posts