En Java, ArrayList
et HashMap
sont utilisés comme collections. Mais je ne pouvais pas comprendre dans quelles situations nous devions utiliser ArrayList
et à quel moment utiliser HashMap
. Quelle est la principale différence entre les deux?
Vous posez des questions spécifiques sur ArrayList et HashMap, mais je pense que pour bien comprendre ce qui se passe, vous devez comprendre le cadre des collections. Un ArrayList implémente donc l'interface List et un HashMap implémente l'interface Map. La vraie question est donc de savoir quand voulez-vous utiliser une liste et quand voulez-vous utiliser une carte. C'est là que la documentation de l'API Java API aide beaucoup.
Liste:
Une collection ordonnée (également connue sous le nom de séquence). L'utilisateur de cette interface a un contrôle précis sur l'endroit où dans la liste chaque élément est inséré. 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 objet qui mappe les clés aux valeurs. Une carte ne peut pas contenir de clés en double; chaque clé peut correspondre à au plus une valeur.
Ainsi, comme d'autres réponses ont été discutées, l'interface de liste (ArrayList) est une collection ordonnée d'objets auxquels vous accédez à l'aide d'un index, un peu comme un tableau (enfin dans le cas d'ArrayList, comme son nom l'indique, c'est juste un tableau dans le arrière-plan, mais la plupart des détails de la gestion du tableau sont traités pour vous). Vous utiliseriez une ArrayList lorsque vous souhaitez conserver les choses dans l'ordre trié (l'ordre dans lequel elles sont ajoutées, ou bien la position dans la liste que vous spécifiez lorsque vous ajoutez l'objet).
Une carte d'autre part prend un objet et l'utilise comme clé (index) d'un autre objet (la valeur). Disons donc que vous avez des objets qui ont des ID uniques, et que vous savez que vous allez vouloir accéder à ces objets par ID à un moment donné, la carte vous rendra la tâche très facile (et plus rapide/plus efficace). L'implémentation HashMap utilise la valeur de hachage de l'objet clé pour localiser où il est stocké, il n'y a donc plus de garantie de l'ordre des valeurs. Il existe cependant d'autres classes dans l'API Java Java qui peuvent fournir cela, par exemple LinkedHashMap, qui, en plus d'utiliser une table de hachage pour stocker les paires clé/valeur, conserve également une liste (LinkedList) de les clés dans l'ordre dans lequel elles ont été ajoutées, de sorte que vous pouvez toujours accéder à nouveau aux éléments dans l'ordre dans lequel elles ont été ajoutées (si nécessaire).
Si vous utilisez un 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, un String
)
HashMap<String, Book> books = new HashMap<String, Book>();
// String is the type of the index (the key)
// and Book is the type of the elements (the values)
// Like with an arraylist: ArrayList<Book> books = ...;
// Now you have to store the elements with a string key:
books.put("Harry Potter III", new Book("JK Rownling", 456, "Harry Potter"));
// Now you can access the elements by using a String index
Book book = books.get("Harry Potter III");
C'est impossible (ou beaucoup plus difficile) avec un ArrayList
. Le seul bon moyen d'accéder aux éléments dans un ArrayList
est d'obtenir les éléments par leur numéro d'index.
Cela signifie donc qu'avec un HashMap
, vous pouvez utiliser tous les types de clés que vous souhaitez.
Un autre exemple utile est dans un jeu: vous avez un ensemble d'images et vous voulez les retourner. Ainsi, vous écrivez une méthode de retournement d'image, puis stockez les résultats retournés:
HashMap<BufferedImage, BufferedImage> flipped = new HashMap<BufferedImage, BufferedImage>();
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 lecteur une fois, puis vous l'avez enregistré. Vous pouvez accéder à un BufferedImage
avec un BufferedImage
comme type de clé pour le HashMap
.
J'espère que vous comprenez mon deuxième exemple.
Pas vraiment une Java question spécifique. Il semble que vous ayez besoin d'une "introduction" sur les structures de données. Essayez de googler "Quelle structure de données devez-vous utiliser"
Essayez ce lien http://www.devx.com/tips/Tip/14639
Depuis le lien:
Voici quelques conseils pour faire correspondre les structures de données les plus couramment utilisées à des besoins particuliers.
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ériez le nom d'un employé, le résultat peut être renvoyé sous la forme d'une table de hachage sous la forme d'une paire (nom, valeur). Cependant, si vous deviez retourner les noms de plusieurs employés, renvoyer directement une table de hachage ne serait pas une bonne idée. N'oubliez pas que les clés doivent être uniques, sinon vos valeurs précédentes seront écrasées.
C'est une bonne option lorsque vous désirez un accès séquentiel ou même aléatoire. De plus, si la taille des données est inconnue au départ et/ou va croître dynamiquement, il serait approprié d'utiliser une liste ou un vecteur. Par exemple, pour stocker les résultats d'un jeu de résultats JDBC, vous pouvez utiliser Java.util.LinkedList. Alors que si vous recherchez un tableau redimensionnable, utilisez la classe Java.util.ArrayList.
Ne sous-estimez jamais les tableaux. La plupart du temps, lorsque nous devons utiliser une liste d'objets, 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 d'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 tables de hachage pour répondre à un besoin particulier.
Et à partir de JDK 1.2, vous avez également des classes de set comme Java.util.TreeSet, ce qui est utile pour les sets triés qui n'ont pas de doublons. L'une des meilleures choses à propos de ces classes est qu'elles respectent toutes une certaine interface afin que vous n'ayez pas vraiment à vous soucier des détails. Par exemple, jetez un œil au 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 une correspondance (généralement non ordonnée) de la clé à la valeur. Par exemple, vous pouvez avoir une carte d'un ID utilisateur aux détails de cet utilisateur, afin que vous puissiez trouver efficacement les détails donnés uniquement l'ID. (Vous pourriez implémenter l'interface Map
en stockant simplement une liste de clés et une liste de valeurs, mais généralement il y aura une implémentation plus efficace - HashMap
utilise une table de hachage en interne pour obtenir l'amortissement O(1), par exemple.)
Une carte contre 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 d'une manière ou d'une autre. Exemple: Un ADN de personne 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 existe une relation forte.
Dans une liste, tout ce que vous avez sont 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, c'est arbitraire.