[Java] Points à noter avec Arrays.asList ()

introduction

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.

Qu'est-ce que Arrays.asList ()

String[] words = {"abc","def","ghi"};
List<String> list = Arrays.asList(words);

Remarques sur Arrays.asList ()

1. Liste fixe des valeurs de retour

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

2. Comportement inattendu lorsqu'un tableau de type primitif est spécifié comme argument

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

Résumé

  1. La liste obtenue par Arrays.asList () est une liste de longueur fixe.
  2. Si un tableau de type primitif est spécifié dans l'argument de Arrays.asList (), les éléments du tableau ne sont pas développés et le tableau lui-même devient un élément de la liste des valeurs de retour.

Recommended Posts

[Java] Points à noter avec Arrays.asList ()
Java pour jouer avec Function
Connectez-vous à DB avec Java
Connectez-vous à MySQL 8 avec Java
Étudier Java avec Progate Note 1
Java pour apprendre avec les ramen [Partie 1]
Osez défier Kaggle avec Java (1)
J'ai essayé d'interagir avec Java
Ma note de profit: Présentation de Java à Ubuntu
Java, des tableaux pour débuter avec les débutants
Comment compiler Java avec VsCode & Ant
[Java] Résumez comment comparer avec la méthode equals
[Note] Comment démarrer avec Rspec
Introduction aux algorithmes avec java-Search (recherche prioritaire en profondeur)
3 points difficiles à gérer Java Realm
Comment utiliser la classe Java Scanner (Remarque)
Facile à parcourir avec les expressions régulières Java
Introduction aux algorithmes avec java --Search (recherche de priorité de largeur)
[Java] Introduction à Java
Introduction à Java
Java8 / 9 Beginners: Streaming API addiction points et comment les gérer
Défi pour gérer les caractères déformés avec Java AudioSystem.getMixerInfo ()
[Java] Comment tester s'il est nul dans JUnit
J'ai essayé de faire une authentification de base avec Java
Introduction aux algorithmes avec java --Search (bit full search)
Déployez des applications Web Java sur Azure avec maven
Essayez d'intégrer Ruby et Java avec Dapr
Comment utiliser le framework Java avec AWS Lambda! ??
Je veux utiliser java8 forEach avec index
Comment utiliser le contrôle segmenté et les points à noter
Comment utiliser l'API Java avec des expressions lambda
Premiers pas avec Kotlin à envoyer aux développeurs Java
Essayez d'implémenter TCP / IP + NIO avec JAVA
[Java] Article pour ajouter une validation avec Spring Boot 2.3.1.
Facile à créer LINE BOT avec Java Servlet
J'ai essayé de casser le bloc avec java (1)
[Débutant] Points à surveiller après les exercices Java / Héritage / Méthode abstraite [Note 26]
Installez java avec Homebrew
Modificateur abstrait Java [Note]
Comment appeler des fonctions en bloc avec la réflexion Java
Traitement des listes à comprendre avec des images - java8 stream / javaslang-
Soumettre une tâche à AWS Batch avec Java (Eclipse)
Changements de Java 8 à Java 11
Somme de Java_1 à 100
[Note] Appliquer la protection par mot de passe aux feuilles Excel avec NPOI
Installez Java avec Ansible
[Java 11] J'ai essayé d'exécuter Java sans compiler avec javac
[Java] Comment omettre l'injection de constructeur de ressort avec Lombok
Comment déployer Java sur AWS Lambda avec Serverless Framework
[Java Silver] Résumé des points liés aux expressions lambda
java: Comment écrire une liste de types génériques [Note]
[Java] Connectez-vous à MySQL
# 2 [Note] J'ai essayé de calculer quatre-vingt-dix-neuf avec Java.
[Java] Comment chiffrer avec le chiffrement AES avec une bibliothèque standard
Téléchargement confortable avec JAVA
Mémo simple de JUnit de java
[java] Java SE 8 Silver Note
[Java] Se référer et définir des variables privées avec réflexion
Changer java avec direnv
Améliorations de Kotlin à Java