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 devions utiliser ArrayList et quels temps utiliser HashMap. Quelle est la différence majeure entre les deux?

41
demandé sur Tot Zam 2010-03-07 12:46:25

5 réponses

vous demandez 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, un ArrayList implémente l'interface List et un HashMap implémente L'interface Map. La vraie question est donc de savoir quand vous voulez utiliser une liste et quand vous voulez utiliser une carte. C'est là que la documentation de L'API Java aide beaucoup.

Liste:

une collection ordonnée (aussi appelée séquence.) L'utilisateur de cette interface a un contrôle précis où, dans la liste chaque élément est inséré. Le l'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 établit une correspondance entre les clés et les valeurs. Un la carte ne peut pas contenir des clés en double; chaque clé peut correspondre à au plus une valeur.

ainsi que d'autres réponses ont discuté, 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 (bien dans le cas de ArrayList, comme son nom l'indique, c'est juste un tableau à l'arrière-plan, mais beaucoup de détails relatifs au traitement du tableau sont traités pour vous). Vous utiliserez un ArrayList lorsque vous voulez garder les choses dans l'ordre (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 par contre prend un objet et l'utilise comme une clé (index) à un autre objet (la valeur). Donc disons que vous avez des objets qui ont des id uniques, et vous savez que vous allez vouloir accéder à ces objets par ID à un moment donné, la carte va rendre cela très facile sur vous (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 y a cependant d'autres classes dans L'API Java qui peuvent fournir ceci, 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 à nouveau dans l'ordre où ils ont été ajoutés (si nécessaire).

75
répondu DaveJohnston 2010-03-07 10:47:43

Si vous utilisez un ArrayList, vous devez accéder aux éléments avec un index (int type). Avec un HashMap, vous pouvez y accéder par un indice d'un autre type (par exemple,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. La seule bonne façon d'accéder aux éléments dans un ArrayList est en obtenant les éléments par leur numéro d'index.

Donc, cela signifie qu'avec un HashMap vous pouvez utiliser chaque type de clé vous vouloir.

un Autre exemple est dans un jeu: vous disposez d'un ensemble d'images, et que vous voulez retourner. Ainsi, vous écrivez une méthode image-flip, et stockez ensuite les résultats flippé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 joueur une fois, et puis le stocker. Vous pouvez accéder à un BufferedImage avec un BufferedImage comme type de touche pour le HashMap.

j'espère que vous comprenez mon deuxième exemple.

16
répondu Martijn Courteaux 2017-08-01 06:52:59

pas vraiment une question spécifique à Java. Il semble que vous ayez besoin d'une "introduction" sur les structures de données. Essayer de googler "Quelle structure de données si vous utilisez"

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

le lien :

voici quelques conseils pour apparier les structures de données les plus utilisées avec les besoins particuliers.

  1. quand utiliser un Hashtable?

un hashtable, ou des structures de données similaires, sont de bons candidats si les données stockées est accessible sous la forme de paires clé-valeur. Par exemple, si vous deviez aller chercher le nom d'un employé, le résultat peut être retourné sous la forme d'une table de hachage (nom, valeur) paire. Cependant, si vous devez retourner les noms de plusieurs employés, retourner directement un tableau de hachage ne serait pas une bonne idée. Rappelez-vous que les clés doivent être uniques ou votre valeur précédente(s) sera remplacé.

  1. quand utiliser une liste ou Vecteur?

c'est une bonne option lorsque vous désirez un accès séquentiel ou même aléatoire. Aussi, si la taille des données est inconnue au départ, et/ou se développe 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 le java.util.LinkedList. Par contre, si vous cherchez un tableau redimensionnable, utilisez le java.util.Classe d'ArrayList.

  1. quand utiliser les tableaux?

Jamais sous-estimer les tableaux. La plupart du temps, lorsque nous devons utiliser une liste d'objets, nous avons tendance à penser à l'aide de vecteurs ou de 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, parce que tous vous avez besoin est un indice. Il n'y a pas de frais généraux d'un appel de méthode get supplémentaire.

4.Combinaisons

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

  1. Définir Les Classes

et à partir de JDK 1.2, vous avez aussi défini des classes comme java.util.TreeSet, qui est utile pour les ensembles triés qui n'ont pas de doublons. Une des meilleures choses au sujet de ces cours est qu'ils respectent certaines interface de sorte que vous n'avez pas vraiment à vous soucier des détails. Par exemple, prendre un regardez le code suivant.

  // ...
  List list = new ArrayList();
  list.add(
14
répondu Kannan Ekanath 2014-12-12 03:40:47

Utiliser une liste pour une collection ordonnée de valeurs. Par exemple, vous pourriez avoir une liste de fichiers à traiter.

utilisez une carte pour une mise en correspondance (généralement non ordonnée) de la clé à la valeur. Par exemple, vous pouvez avoir une carte à partir d'un ID utilisateur vers les détails de cet utilisateur, de sorte que vous pouvez trouver efficacement les détails donnés juste L'ID. (Vous mettre en œuvre les Map interface en stockant simplement une liste de clés et une liste de valeurs, mais généralement il y aura un plus efficace mise en œuvre - HashMap utilise une table de hachage interne pour obtenir amorti O(1) clé de recherche, par exemple.)

4
répondu Jon Skeet 2010-03-07 09:53:54

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 qui n'est pas arbitraire. Ils sont liés d'une certaine manière. 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 y a une relation forte.

dans une liste, Tout ce que vous avez sont des valeurs (un nom de personne), et pour accéder on a besoin de connaître sa position dans la liste (index) pour y accéder. Mais il n'y a pas de relation stable entre la position de la valeur dans la liste et son index, c'est arbitraire.

4
répondu maxmcbyte 2012-04-25 07:42:06