-
Hashtable Vs HashMap
Bonsoir,
je souhaiterai connaitre les véritables différences entre Hashtable et HashMap (mise à part que ce soit synchronisé).
Pour vous indiquer par où je veux en venir, je vais vous exposer mon problème. Actuellement je travaille sur un calcul d'itinéraire et je dois stocker sous forme de table de hashage mes arêtes qui sont leurs propres clés (deux arêtes sont identiques si elles décrivent le même parcours, j'ai redéfini le equals et le hashcode), ce qui me permet de faire évoluer les propriétés d'une seule arête lorsque cette arrête est défini par des arêtes de catégories différentes (une route est aussi un tunnel).
J'ai eu des soucis de performances, je trouvais les temps de chargement très long. Comme beaucoup d'objet sont utilisés (graphe de 20000 objet par exemple) j'ai optimisé à fond les méthodes equals et hashcode (le hashcode est calculé à la création de l'objet, il ne peut pas évoluer. Cela consomme de la mémoire mais les temps d'accès sont beaucoup plus rapide). J'ai vu des améliorations mais pas si significatif...
Je me suis intéressé au hashmap que j'utilisais pour gérer mes arêtes. Je l'ai remplacé par une hashtable. Je suis passé de, pour 20000 objet, 40 secondes de chargement de données à 5 secondes (avec le même code autour), ce qui fait une énorme différence. J'ai demandé aux développeurs avec qui je travaille mais, mise à part que tout le monde était étonné du résultat, personne n'a su me dire comment ça se faisait.
J'ai lu dans certains forums qu'il était préférable d'utiliser une hashmap qu'une hashtable (et que cette dernière ferait mieux d'être déprécié) mais le résultat est là. Il semblerait que la hashtable soit beaucoup plus performante qu'une hashmap. A moins de n'avoir fait une erreur de conception où d'avoir trouvé une astuce...
-
Salut,
Tout ceci n'a pas de sens... La seule différence entre un hashtable et un hashmap est la synchronisation...
La question est de savoir : les créées tu toutes les deux de la même façon ?
Il est possible que la méthode "rehash" entre le hashmap et le hashtable diffèrent, mais ça m'étonnerai que celle de hashtable soit plus performante...
Cordialement
Fred
-
J'ai l'impression que tout le monde est du même avis, cela n'a pas de sens.
La seule ligne de code que je change est celle-ci :
Map<Edge,Edge> fMapEdge = new Hashtable<Edge,Edge>();
le Hashtable je le transforme en HashMap.
-
HashMap fait partie de l'ancienne api de collections, il vaut donc mieux l'utiliser (Hashtable n'est resté que pour la compatibilité ascendante).
Pour les performances, il doit y avoir un truc, car HashMap est meilleur...
Et même si tu as besoin de synchro, utilise Collections.synchronizedMap(new HashMap<TypeKey,TypeValue>();
-
Salut,
Hashtable vient bien de l'ancienne API et est synchronisé, alors que HashMap est destiné à la remplacer...
Toutefois leurs implémentations ne sont pas strictement identique... il peut donc exister des différences entre les deux qui penchent vers l'une ou l'autre selon les cas d'utilisation...
- Comment sont implémenter les méthodes equals() et hashCode() ? Et comment est calculé ce hashCode ?
- Quel traitement sont exécutés sur la Map (quel est le code qui prend autant de temps) ?
a++
-
Salut tout le monde,
je me suis fait un petit prog pour comparer les deux. Bon elles sont à peu près équivalentes on va dire car il y a des chutes lors du passage du garbage collector et peut-être aussi à cause de certaines optimisations de la mémoire. (pour ceux que cela intéresse, je peux mettre à disposition).
En fait hier j'ai eu un problème avec mon environnement de travail (RSA) et j'ai passé mon projet sous eclipse. Et bien je n'ai plus le problème... Que ce soit hashtable ou hashmap, j'ai des perfs à peu près équivalente (avec une préférence pour hashmap).
Ce qu'il y a, j'ai fait du profiling avant sous RSA, il y avait peut-être un artefact quelque part qui ralentissait le travail de la hashmap et pas le travail de la hashtable alors que j'avais arrêté le profinling.