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 :

Différence entre TreeSet et HashSet


Sujet :

Collection et Stream Java

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2009
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 70
    Points : 10
    Points
    10
    Par défaut Différence entre TreeSet et HashSet
    Bonjour,
    Quel est la difference entre TreeSet et HashSet ?

    Merci

  2. #2
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    TreeSet<T> implémente SortedSet<T>, alors que HashSet<T> n'implémente "que" Set<T>.

    Dit autrement, ça veut dire que TreeSet implémente un ensemble ordonné : si tu itères sur les éléments du TreeSet, tu les obtiendras en ordre croissant (selon la méthode compareTo() de Comparable).

    Par ailleurs, TreeSet repose sur la méthode compareTo() pour fonctionner. HashSet repose sur la méthode hashCode().

    Si tu as besoin d'avoir un ensemble trié -> TreeSet
    Sinon -> HashSet (car plus rapide)
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  3. #3
    Membre confirmé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Points : 645
    Points
    645
    Par défaut
    Citation Envoyé par sjrd Voir le message
    tu les obtiendras en ordre croissant (selon la méthode compareTo() de Comparable)
    Ou selon la méthode compare() du Comparator qu'on lui donne si les objets qu'on veut trier possèdent déjà un ordre "naturel" (ex : trier des String par nombre de caractères)
    Je sais que désormais vivre est un calembour,
    La mort est devenue un état permanent,
    Le monde est aux fantômes, aux hyènes et aux vautours.
    Moi je vous dis bravo et vive la mort.

  4. #4
    Inscrit

    Profil pro
    Inscrit en
    Février 2008
    Messages
    658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 658
    Points : 892
    Points
    892
    Par défaut
    Citation Envoyé par bestcasaoui Voir le message
    Bonjour,
    Quel est la difference entre TreeSet et HashSet ?

    Merci
    D'abord, un Set est un ensemble sans doublons.

    Un TreeSet est un ensemble ordonné soit selon l'odre naturel, soit selon l'ordre indiqué dans le comparateur de l'object en generic.

    Set<Personne> tree= new TreeSet<Personne>(new Personne()) ;

    ici la classe Personne implemente l'interface Comparator.

    L'ajout et la suppresion de TreeSet se fait en log(n) ou n est sa taille.

    HashSet est un Set sans tri. L'ajout et la suppresion sont tres rapide . L'ajout et la suppresion se fait en temps constant.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Décembre 2010
    Messages : 20
    Points : 26
    Points
    26
    Par défaut
    J'aurai quelques questions supplémentaires sur le même sujet :

    Pourquoi utiliser un TreeSet plutôt qu'un LinkedHashSet qui permet également un ordonnancement de ses élements ? Après tout le TreeSet est construit au fur et à mesure qu'on y rentre des élements, et au cours de sa construction il peut devenir très désequilibré réduisant grandement ses performances (l'accès se fait alors en o(n) plutôt qu'en o(log(n))) et nécessitant de rééquilibrer l'arbre, ce qui est couteux en temps CPU.
    En comparaison, les accès dans un LinkedHashSet se font toujours en temps constant : o(1) (bien qu'un temps constant plus élevé que pour les HashSet standard).

    Un de mes collègues m'a dit que les TreeSet était ThreadSafe contrairement aux HashSet, est-ce vrai ? Dans ce cas pourquoi ne pas implémenter les classes ThreadSafeHashSet et ThreadSafeLinkedHashSet (ou tout autre nom un peu plus court ) qui serait également threadsafe, juste en synchronisant les méthodes d'accès ? On conserverait ainsi les performances temps constant des hashSet tout en étant ThreadSafe...

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 608
    Points
    21 608
    Par défaut
    Citation Envoyé par Roman_Adamski Voir le message
    Pourquoi utiliser un TreeSet plutôt qu'un LinkedHashSet qui permet également un ordonnancement de ses élements ? Après tout le TreeSet est construit au fur et à mesure qu'on y rentre des élements, et au cours de sa construction il peut devenir très désequilibré réduisant grandement ses performances (l'accès se fait alors en o(n) plutôt qu'en o(log(n))) et nécessitant de rééquilibrer l'arbre, ce qui est couteux en temps CPU.
    En comparaison, les accès dans un LinkedHashSet se font toujours en temps constant : o(1) (bien qu'un temps constant plus élevé que pour les HashSet standard).
    LinkedHashSet n'implémente pas SortedSet. Puisqu'il n'est pas trié. Il se contente de conserver l'ordre d'insertion des éléments, il ne les trie pas.

    Citation Envoyé par Roman_Adamski Voir le message
    Un de mes collègues m'a dit que les TreeSet était ThreadSafe contrairement aux HashSet, est-ce vrai ?
    Non. Dis-lui qu'un dénommé thelvin lui file une torgnole virtuelle.

    Citation Envoyé par Roman_Adamski Voir le message
    Dans ce cas pourquoi ne pas implémenter les classes ThreadSafeHashSet et ThreadSafeLinkedHashSet (ou tout autre nom un peu plus court ) qui serait également threadsafe, juste en synchronisant les méthodes d'accès ? On conserverait ainsi les performances temps constant des hashSet tout en étant ThreadSafe...
    Jette un œil à Collections.synchronizedSet() et Collections.synchronizedSortedSet()
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Débutant  
    Inscrit en
    Mai 2006
    Messages
    705
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 705
    Points : 117
    Points
    117
    Par défaut
    Citation Envoyé par sjrd Voir le message

    Par ailleurs, TreeSet repose sur la méthode compareTo() pour fonctionner.

    Si tu as besoin d'avoir un ensemble trié -> TreeSet
    Sinon -> HashSet (car plus rapide)
    J'ai crée ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    TreeSet<Pays> mySet3 = new TreeSet<>(new copmarator());
            mySet3.add(new Pays(5,"italie"));
            mySet3.add(new Pays(12,"Canada"));
            mySet3.add(new Pays(30,"UAE"));
            mySet3.add(new Pays(30,"UAE"));
            for(Pays p : mySet3){
                System.out.println(p);
            }
            System.out.println(mySet3);
    Avec la classe copmarator
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class copmarator implements Comparator<Pays>{
     
        @Override
        public int compare(Pays o1, Pays o2) {
    return o1.id-o2.id;    }
    et ça a marché! sans pour autant définir la méthode compareTo() de l'interface Comparable.

  8. #8
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 608
    Points
    21 608
    Par défaut
    Oui, bon. TreeSet repose sur un système de comparaison de ses éléments deux à deux.

    Ou bien c'est le fait que les éléments du TreeSet implémentent Comparable et se comparent à l'aide de leur méthode compareTo(),

    ou bien c'est en fournissant un Comparator au TreeSet qui se charge de comparer les éléments avec sa méthode compare().

    Les deux sont utilisables, et c'est ma foi bien pratique, certes.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Débutant  
    Inscrit en
    Mai 2006
    Messages
    705
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 705
    Points : 117
    Points
    117
    Par défaut
    Logique!

    Juste une question, pourquoi les TreeSet n'acceptent pas les doublons (sans avoir redéfinir la méthode equals() et hashcode() comme dans le cas du hashSet)?

  10. #10
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 608
    Points
    21 608
    Par défaut
    Parce que ce sont des Set, et que le principe d'un Set est qu'il n'y a pas de doublon.

    C'est vrai qu'on peut trouver une utilité à une Collection qui trie ses éléments dans un arbre binaire de recherche tout en acceptant les doublons. Ce qui n'est pas le cas de TreeSet.
    Mais on peut trouver ça avec un simple TreeMap<TaClasse, Integer> dont les valeurs sont le nombre de fois qu'on a l'élément.

    TreeSet précise bien que sa méthode de comparaison, inférieur, supérieur ou égal, est basée uniquement sur le résultat de compareTo() ou compare() en fonction de celui qui est utilisé. hashcode() et equals() ne sont pas utilisées, car elles ne permettent pas de déterminer en cas d'inégalité, si c'est inférieur ou supérieur.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Différence entre un "bidouilleur" et un Pro ?
    Par christ_mallet dans le forum Débats sur le développement - Le Best Of
    Réponses: 290
    Dernier message: 28/11/2011, 10h53
  2. Réponses: 5
    Dernier message: 11/12/2002, 12h31
  3. Différence entre TCP, UDP, ICMP
    Par GliGli dans le forum Développement
    Réponses: 1
    Dernier message: 13/09/2002, 08h25
  4. Différences entre jmp, jz, jnz, etc
    Par christbilale dans le forum Assembleur
    Réponses: 3
    Dernier message: 05/07/2002, 15h09
  5. Réponses: 3
    Dernier message: 07/05/2002, 16h06

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