Sobes.tech
Middle

Il existe des cartes en Android auxquelles on peut ajouter des types primitifs. Peux-tu en parler plus en détail?

sobes.tech IA

Réponse de l'IA

Oui, pour travailler avec des types primitifs dans le SDK Android, il existe des implémentations spécialisées de Map, optimisées pour la performance et l'économie de mémoire par rapport au HashMap<K, V> standard.

Les plus courantes sont :

  • SparseIntArray : Stocke des paires de clés int et de valeurs int.
  • SparseLongArray : Stocke des paires de clés int et de valeurs long.
  • SparseBooleanArray : Stocke des paires de clés int et de valeurs boolean.
  • LongSparseArray<E> : Stocke des paires de clés long et d'objets de type E.

Avantages de l'utilisation de ces classes :

  • Efficacité mémoire : Elles utilisent des tableaux internes pour stocker les données, évitant les coûts liés à la création d'objets enveloppe pour les types primitifs (Integer, Long, Boolean) et la structure de liste chaînée de HashMap.
  • Performance : Les opérations d'insertion, de récupération et de suppression sont généralement plus rapides, surtout avec un grand nombre d'éléments, grâce à une structure interne plus simple et à l'évitement du hachage pour les clés primitives dans le cas de SparseArray.

Exemple d'utilisation de SparseIntArray :

// Création de SparseIntArray
SparseIntArray sparseArray = new SparseIntArray();

// Ajout d'éléments
sparseArray.put(0, 100);
sparseArray.put(1, 200);
sparseArray.put(10, 300);

// Récupération de la valeur par clé
int value = sparseArray.get(1); // value sera 200

// Récupération de la valeur par clé avec valeur par défaut
int valueWithDefault = sparseArray.get(5, -1); // valueWithDefault sera -1

// Suppression d'un élément par clé
sparseArray.delete(10);

// Itération sur les éléments
for (int i = 0; i < sparseArray.size(); i++) {
    int key = sparseArray.keyAt(i);
    int val = sparseArray.valueAt(i);
    // Logique de traitement de key et val
}

De même, SparseLongArray, SparseBooleanArray et LongSparseArray sont utilisés. LongSparseArray nécessite de spécifier le type d'objet, car ses valeurs sont des objets et non des types primitifs.

Le choix entre HashMap standard et les cartes Sparse spécialisées dépend de vos besoins :

  • Si les clés sont des objets arbitraires ou des types primitifs autres que int ou long, utilisez HashMap.
  • Si les clés sont int ou long, et que les valeurs sont des types primitifs ou des objets dans le cas de LongSparseArray, et que l'efficacité mémoire et la performance sont importantes, il est préférable d'utiliser des cartes Sparse.

Il est important de noter que les cartes Sparse ne sont pas thread-safe. Si vous avez besoin d'une implémentation thread-safe, envisagez d'utiliser ConcurrentHashMap avec des objets enveloppe pour les primitives. Cependant, dans la plupart des cas, dans le thread d'interface utilisateur d'une application Android, où ces structures sont souvent utilisées, la sécurité thread n'est pas un problème.