Différence entre HashMap et ArrayList en Java?

En Java, ArrayList et HashMap sont utilisés comme collections. Mais je ne pouvais pas comprendre dans quelles situations nous devrions utiliser ArrayList et à quelle heure utiliser HashMap . Quelle est la différence majeure entre les deux?

Vous demandez spécifiquement ArrayList et HashMap, mais je pense que pour bien comprendre ce qui se passe, vous devez comprendre le cadre des Collections. Ainsi, un ArrayList implémente l’interface List et un HashMap implémente l’interface Map. Donc, la vraie question est de savoir quand vous voulez utiliser une liste et quand voulez-vous utiliser une carte. C’est là que la documentation de l’API Java aide beaucoup.

Liste:

Une collection ordonnée (également appelée séquence). L’utilisateur de cette interface a un contrôle précis sur l’emplacement de chaque élément dans la liste. L’utilisateur peut accéder aux éléments par leur index entier (position dans la liste) et rechercher des éléments dans la liste.

Carte:

Un object qui mappe des clés à des valeurs. Une carte ne peut pas contenir de clés en double; chaque touche peut correspondre à au plus une valeur.

Comme d’autres réponses en ont discuté, l’interface de liste (ArrayList) est une collection ordonnée d’objects auxquels vous accédez à l’aide d’un index, un peu comme un tableau (dans le cas de ArrayList, comme son nom l’indique, background, mais beaucoup de détails sur le traitement du tableau sont gérés pour vous). Vous utiliseriez une ArrayList lorsque vous souhaitiez conserver les éléments dans l’ordre de sorting (l’ordre dans lequel ils sont ajoutés ou la position dans la liste que vous spécifiez lorsque vous ajoutez l’object).

Une carte en revanche prend un object et l’utilise comme une clé (index) vers un autre object (la valeur). Alors disons que vous avez des objects qui ont des identifiants uniques, et vous savez que vous allez vouloir accéder à ces objects par identifiant à un moment donné, la carte vous facilitera la tâche (et plus rapide / plus efficace). L’implémentation HashMap utilise la valeur de hachage de l’object clé pour localiser l’endroit où elle est stockée. Il n’y a donc plus de garantie sur l’ordre des valeurs. Il existe cependant d’autres classes dans l’API Java qui peuvent fournir cette fonctionnalité, par exemple LinkedHashMap, qui, tout en utilisant une table de hachage pour stocker les paires clé / valeur, gère également une liste (LinkedList) des clés dans l’ordre où elles ont été ajoutées. Vous pouvez donc toujours accéder aux éléments dans l’ordre dans lequel ils ont été ajoutés (si nécessaire).

Si vous utilisez une ArrayList , vous devez accéder aux éléments avec un index (type int ). Avec un HashMap , vous pouvez y accéder par un index d’un autre type (par exemple, une Ssortingng )

 HashMap books = new HashMap(); // Ssortingng is the type of the index (the key) // and Book is the type of the elements (the values) // Like with an arraylist: ArrayList books = ...; // Now you have to store the elements with a ssortingng key: books.put("Harry Potter III", new Book("JK Rownling", 456, "Harry Potter")); // Now you can access the elements by using a Ssortingng index Book book = books.get("Harry Potter III"); 

C’est impossible (ou beaucoup plus difficile) avec une ArrayList . Le seul bon moyen d’accéder aux éléments d’une ArrayList consiste à obtenir les éléments par leur numéro d’index.

Donc, cela signifie qu’avec un HashMap vous pouvez utiliser tous les types de clés souhaités.

Un autre exemple utile est celui d’un jeu: vous avez un ensemble d’images et vous voulez les retourner. Donc, vous écrivez une méthode image-flip, puis stockez les résultats retournés:

 HashMap flipped = new HashMap(); BufferedImage player = ...; // On this image the player walks to the left. BufferedImage flippedPlayer = flip(player); // On this image the player walks to the right. flipped.put(player, flippedPlayer); // Now you can access the flipped instance by doing this: flipped.get(player); 

Vous avez retourné le joueur une fois, puis vous l’avez stocké. Vous pouvez accéder à BufferedImage avec BufferedImage comme type de clé pour HashMap .

J’espère que vous comprenez mon deuxième exemple.

Pas vraiment une question spécifique à Java. Il semble que vous ayez besoin d’une “introduction” sur les structures de données. Essayez de googler “Quelle structure de données devriez-vous utiliser”

Essayez ce lien http://www.devx.com/tips/Tip/14639

À partir du lien:

Vous trouverez ci-après quelques astuces pour faire correspondre les structures de données les plus couramment utilisées à des besoins particuliers.

  1. Quand utiliser une table de hachage?

Une table de hachage ou des structures de données similaires sont de bons candidats si les données stockées doivent être accessibles sous la forme de paires clé-valeur. Par exemple, si vous récupérez le nom d’un employé, le résultat peut être renvoyé sous la forme d’une table de hachage en tant que paire (nom, valeur). Toutefois, si vous deviez renvoyer des noms de plusieurs employés, retourner directement une table de hachage ne serait pas une bonne idée. Rappelez-vous que les clés doivent être uniques ou que vos précédentes valeurs seront écrasées.

  1. Quand utiliser une liste ou un vecteur?

C’est une bonne option lorsque vous souhaitez un access séquentiel ou même aléatoire. De plus, si la taille des données est inconnue initialement et / ou va augmenter dynamicment, il serait approprié d’utiliser une liste ou un vecteur. Par exemple, pour stocker les résultats d’un ResultDet JDBC, vous pouvez utiliser la liste java.util.LinkedList. Si vous recherchez un tableau redimensionnable, utilisez la classe java.util.ArrayList.

  1. Quand utiliser les tableaux?

Ne jamais sous-estimer les tableaux. La plupart du temps, lorsque nous devons utiliser une liste d’objects, nous avons tendance à penser à utiliser des vecteurs ou des listes. Cependant, si la taille de la collection est déjà connue et ne va pas changer, un tableau peut être considéré comme la structure de données potentielle. Il est plus rapide d’accéder aux éléments d’un tableau qu’un vecteur ou une liste. C’est évident, car tout ce dont vous avez besoin est un index. Il n’y a pas de surcharge pour un appel de méthode get supplémentaire.

4. Combinaisons

Parfois, il peut être préférable d’utiliser une combinaison des approches ci-dessus. Par exemple, vous pouvez utiliser une liste de hashtables pour répondre à un besoin particulier.

  1. Set Classes

Et à partir de JDK 1.2, vous avez également défini des classes comme java.util.TreeSet, ce qui est utile pour les ensembles sortingés sans doublons. Une des meilleures choses à propos de ces classes est qu’elles respectent toutes certaines interfaces, de sorte que vous n’avez pas à vous soucier des détails. Par exemple, regardez le code suivant.

  // ... List list = new ArrayList(); list.add( 

Utilisez une liste pour une collection ordonnée de valeurs justes. Par exemple, vous pouvez avoir une liste de fichiers à traiter.

Utilisez une carte pour un mappage (généralement non ordonné) de la clé à la valeur. Par exemple, vous pouvez avoir une carte d’un ID utilisateur aux détails de cet utilisateur, de sorte que vous pouvez trouver efficacement les détails uniquement avec l’ID. (Vous pouvez implémenter l’interface Map en stockant simplement une liste de clés et une liste de valeurs, mais en général, une implémentation plus efficace: HashMap utilise une table de hachage en interne pour obtenir une recherche de clé O (1) amortie, par exemple. )

Une carte vs une liste.

Dans une carte, vous avez des paires clé / valeur. Pour accéder à une valeur, vous devez connaître la clé. Il existe une relation entre la clé et la valeur qui persiste et n’est pas arbitraire. Ils sont liés en quelque sorte. Exemple: Un ADN de personnes est unique (la clé) et un nom de personne (la valeur) ou un SSN de personne (la clé) et un nom de personne (la valeur) il y a une relation forte.

Dans une liste, vous n’avez que des valeurs (un nom de personne) et pour y accéder, vous devez connaître sa position dans la liste (index) pour y accéder. Mais il n’y a pas de relation permanente entre la position de la valeur dans la liste et son index, elle est arbitraire.