Java Language Piège - L'utilisation de size () pour tester si une collection est vide est inefficace.


Exemple

Java Collections Framework fournit deux méthodes connexes pour tous les objets Collection :

  • size() renvoie le nombre d'entrées dans une Collection et
  • isEmpty() méthode isEmpty() renvoie true si (et seulement si) la Collection est vide.

Les deux méthodes peuvent être utilisées pour tester la vacuité de la collecte. Par exemple:

Collection<String> strings = new ArrayList<>();
boolean isEmpty_wrong = strings.size() == 0; // Avoid this
boolean isEmpty = strings.isEmpty();         // Best

Bien que ces approches se ressemblent, certaines implémentations de collections ne stockent pas la taille. Pour une telle collection, l'implémentation de size() doit calculer la taille à chaque appel. Par exemple:

  • Une simple classe de liste liée (mais pas java.util.LinkedList ) peut avoir besoin de parcourir la liste pour compter les éléments.
  • La classe ConcurrentHashMap doit additionner les entrées de tous les "segments" de la carte.
  • Une implémentation paresseuse d'une collection peut nécessiter de réaliser toute la collection en mémoire afin de compter les éléments.

En revanche, une méthode isEmpty() doit uniquement tester s'il existe au moins un élément dans la collection. Cela ne nécessite pas de compter les éléments.

Alors que size() == 0 n'est pas toujours moins efficace que isEmpty() , il est inconcevable qu'un isEmpty() correctement implémenté soit moins efficace que size() == 0 . Par conséquent, isEmpty() est préféré.