IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

Hashtable Vs HashMap


Sujet :

Collection et Stream Java

  1. #1
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 50
    Par défaut 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...

  2. #2
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut
    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

  3. #3
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 50
    Par défaut
    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.

  4. #4
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    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>();

  5. #5
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    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++

  6. #6
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 50
    Par défaut
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. HashTable ou HashMap avec plusieurs indexes ?
    Par Esil2008 dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 19/05/2008, 09h45
  2. [VBA] HashMap ou HashTable
    Par VitamineC dans le forum Général VBA
    Réponses: 1
    Dernier message: 26/06/2007, 11h20
  3. Problème HashMap, HashTable (get)
    Par rune93 dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 15/03/2007, 17h20
  4. Remplacer une Hashtable par une HashMap
    Par scolyo dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 19/06/2006, 17h30
  5. [HashMap] Modification d'objet d'une Hashtable
    Par viena dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 29/07/2004, 09h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo