427 votes

Java - HashMap vs les objets de la Carte

Quelle est la différence entre les cartes que j'ai créer (dans une autre question, les gens ont répondu à l'aide de leur apparence, de façon interchangeable, et je me demandais si/comment ils sont différents):

HashMap<String, Object> map = new HashMap<String, Object>();
Map<String, Object> map = new HashMap<String, Object>();

561voto

T.J. Crowder Points 285826

Il n'y a pas de différence entre les objets. Il y a une différence dans l' interface que vous avez à l'objet. Dans le premier cas, l'interface est - HashMap<String, Object>, tandis que dans le second il est Map<String, Object>. L'objet sous-jacent, cependant, est le même.

L'avantage de l'utilisation d' Map<String, Object> , c'est que vous pouvez changer l'objet sous-jacent à un autre type de carte sans rupture de votre contrat avec tout le code qui l'utilise. Si vous déclarez en tant que HashMap<String, Object>, vous devez modifier votre contrat, si vous souhaitez modifier l'implémentation sous-jacente.

63voto

Graphics Noob Points 4004

La carte est une interface qui HashMap met en œuvre. La différence est que dans la deuxième mise en œuvre de votre référence à la table de hachage ne permettre l'utilisation des fonctions définies dans l'interface de la Carte, alors que le premier va permettre l'utilisation de toutes les fonctions publiques dans la HashMap (qui comprend l'interface de la Carte).

Il sera probablement plus de sens si vous lisez Soleil interface du tutoriel

18voto

Bill K Points 32115

Je voulais juste faire un commentaire sur la accepté de répondre, mais elle a eu trop funky (je déteste ne pas avoir des sauts de ligne)

ah, si la différence est que dans général, la Carte dispose de certaines méthodes associé avec elle. mais il y a différentes façons ou la création d'une carte, par exemple comme une table de hachage, et ces différentes manières fournir des méthodes uniques que tous les les cartes ont.

Exactement, et vous voulez toujours utiliser la plus générale de l'interface, vous pouvez éventuellement. Envisager ArrayList vs LinkedList. Énorme différence dans la façon dont vous les utilisez, mais si vous utilisez "Liste", vous pouvez basculer entre eux facilement.

En fait, vous pouvez remplacer le côté droit de l'initialiseur, avec une dynamique d'instruction. comment quelque chose comme cela:

List collection;
if(keepSorted)
    collection=new LinkedList();
else
    collection=new ArrayList();

De cette façon, si vous allez remplir la collection avec un tri d'insertion, vous devez utiliser une liste chaînée (le tri par insertion dans un tableau la liste est criminel.) Mais si vous n'avez pas besoin de garder triés et sont juste à la précédente, vous utiliser une ArrayList (Plus efficace pour d'autres opérations).

C'est un assez gros stretch ici parce que les collections ne sont pas le meilleur exemple, mais dans OO conception de l'un des concepts les plus importants est l'aide de l'interface de façade pour accéder à des objets différents, avec exactement le même code.

Edit de répondre à un commentaire:

Comme pour votre carte commentaire ci-dessous, Oui à l'aide de la "Carte" de l'interface restreint aux seuls méthodes, à moins que vous lancez la collection retour de la Carte de HashMap (ce qui va à l'encontre de l'objectif).

Souvent, ce que vous allez faire est de créer un objet et de le remplir à l'aide de ce type spécifique (HashMap), dans une sorte de "créer" ou "initialiser" la méthode, mais la méthode renverra une "Carte" qui n'a pas besoin d'être manipulé comme une table de hachage.

Si jamais vous avez à jeter par la manière, vous utilisez probablement une mauvaise interface ou votre code n'est pas structuré assez bien. Notez qu'il est acceptable d'avoir une partie de votre code de le traiter comme une "table de hachage", tandis que l'autre considère comme une "Carte", mais cela devrait couler "vers le bas". de sorte que vous ne sont jamais de casting.

Notez également la semi-aspect propre de rôles indiqué par les interfaces. Une LinkedList fait une bonne pile ou file d'attente, une ArrayList qui fait un bon stack, mais une horrible file d'attente (encore une fois, une suppression entraînerait un déplacement de l'ensemble de la liste), de sorte LinkedList implémente l'interface d'Attente, ArrayList ne le fait pas.

13voto

aperkins Points 4959

Comme l'a noté TJ Crowder et Adamski, une référence à une interface, l'autre à une mise en œuvre spécifique de l'interface. Selon Joshua Bloc, vous devriez toujours essayer de coder des interfaces, pour vous permettre de mieux gérer les changements sous-jacents de la mise en œuvre - c'est à dire si HashMap soudain n'était pas idéal pour votre solution et vous avez besoin de modifier le plan de mise en œuvre, vous pouvez toujours utiliser l'interface de la Carte, et de changer l'instanciation de type.

9voto

Adamski Points 29884

Dans ton deuxième exemple, la "carte" de référence est de type Map, ce qui est une interface implémentée par HashMap (et autres types d' Map). Cette interface est un contrat en disant que l'objet des cartes clés à des valeurs et prend en charge diverses activités (par exemple, put, get). Il dit rien au sujet de la mise en œuvre de l' Map (dans ce cas, un HashMap).

La deuxième approche est généralement préférable, en général, vous ne voulez pas exposer la carte spécifique de mise en œuvre de méthodes à l'aide de l' Map ou par l'intermédiaire d'une définition de l'API.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X