En java, ArrayList et HashMap sont utilisés dans les collections. Mais je n'ai pas pu comprendre dans quelles situations nous devrions utiliser ArrayList et dans quelles situations utiliser HashMap. Quelle est la principale différence entre les deux ?
Réponses
Trop de publicités?Votre question porte spécifiquement sur ArrayList et HashMap, mais je pense que pour bien comprendre ce qui se passe, vous devez comprendre le cadre des collections. Ainsi, une ArrayList implémente l'interface List et un HashMap implémente l'interface Map. La vraie question est donc de savoir quand utiliser une liste et quand utiliser une carte. C'est là que la documentation de l'API Java est d'une grande aide.
Liste :
Une collection ordonnée (également connue sous le nom de séquence). L'utilisateur de cette interface a un contrôle précis de l'endroit où chaque élément est inséré dans la chaque élément est inséré dans la liste. L'utilisateur de utilisateur peut accéder aux éléments par leur indice entier (position dans la liste), et rechercher des éléments dans la liste.
Carte :
Un objet qui associe des clés à des valeurs. A ne peut pas contenir de clés dupliquées ; chaque clé peut correspondre à au plus une valeur.
Comme d'autres réponses l'ont évoqué, l'interface de liste (ArrayList) est une collection ordonnée d'objets à laquelle vous accédez à l'aide d'un index, un peu comme un tableau (dans le cas d'ArrayList, comme son nom l'indique, il s'agit simplement d'un tableau en arrière-plan, mais de nombreux détails relatifs au traitement du tableau sont gérés pour vous). Vous utiliserez une ArrayList lorsque vous voudrez conserver les objets dans un ordre trié (l'ordre dans lequel ils sont ajoutés, ou bien la position dans la liste que vous spécifiez lorsque vous ajoutez l'objet).
Une carte, quant à elle, prend un objet et l'utilise comme clé (index) pour un autre objet (la valeur). Disons 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 facilitera la tâche (et sera plus rapide/efficace). L'implémentation de HashMap utilise la valeur de hachage de l'objet clé pour localiser l'endroit 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 qui peuvent fournir cela, par exemple LinkedHashMap, qui, en plus d'utiliser une table de hachage pour stocker les paires clé/valeur, maintient également une liste (LinkedList) des clés dans l'ordre où elles ont été ajoutées, de sorte que vous pouvez toujours accéder aux éléments dans l'ordre où 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).
Et avec un HashMap, vous pouvez y accéder par un index d'un autre type (par exemple, une chaîne).
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");
Ceci est impossible (ou beaucoup plus difficile) avec une ArrayList.
La seule bonne façon d'accéder aux éléments d'une liste de tableaux est d'obtenir les éléments par leur numéro d'index.
Cela signifie donc que vous pouvez utiliser tous les types de clés que vous voulez (avec un HashMap).
Un autre exemple utile est celui d'un jeu : Vous avez un ensemble d'images, et vous voulez les retourner. Vous écrivez donc une méthode image-flip, puis vous 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 stocké. 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.
J'espère que cela vous aidera.
Ce n'est pas vraiment une question spécifique à Java. Il semble que vous ayez besoin d'une "introduction" aux 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
Utilisez une liste pour une collection ordonnée de valeurs simples. Par exemple, vous pouvez avoir une liste de fichiers à traiter.
Utilisez une carte pour établir une correspondance (généralement non ordonnée) entre une clé et une valeur. Par exemple, vous pourriez avoir un mappage d'un identifiant d'utilisateur vers les détails de cet utilisateur, afin de pouvoir trouver efficacement les détails à partir de l'identifiant. (Vous podría mettre en œuvre la Map
en stockant simplement une liste de clés et une liste de valeurs, mais en général, il existe une mise en œuvre plus efficace. HashMap
utilise une table de hachage en interne pour obtenir une recherche de clé amortie O(1), par exemple).
Une carte ou une liste.
Dans une Map, 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. Elles sont liées d'une manière ou d'une autre. Exemple : L'ADN d'une personne est unique (la clé) et le nom d'une personne (la valeur) ou le SSN d'une personne (la clé) et le nom d'une personne (la valeur) : il existe une relation forte.
Dans une liste, tout ce que vous avez, ce sont des valeurs (un nom de personne), et pour y accéder, vous devez connaître sa position dans la liste (index). Mais il n'y a pas de relation permanente entre la position de la valeur dans la liste et son index, c'est arbitraire.