Quelle est la différence entre Set et List?

Réponses:

504

Listest une séquence ordonnée d'éléments alors Setqu'une liste distincte d'éléments n'est pas ordonnée (merci, Quinn Taylor ).

List<E>:

Une collection ordonnée (également connue sous le nom de séquence). L'utilisateur de cette interface a un contrôle précis sur l'endroit où dans la liste chaque élément est inséré. L'utilisateur peut accéder aux éléments par leur index entier (position dans la liste), et rechercher des éléments dans la liste.

Set<E>:

Une collection qui ne contient aucun élément en double. Plus formellement, les ensembles ne contiennent aucune paire d'éléments e1 et e2 tels que e1.equals (e2), et au plus un élément nul. Comme son nom l'indique, cette interface modélise l'abstraction de l'ensemble mathématique.

Andrew Hare
la source
7
Pour un SortedSet, il n'y a pas deux éléments où compareTo () == 0, comme égal n'est pas appelé.
Peter Lawrey
34
Un ensemble PEUT être commandé, donc la première déclaration de cette réponse est trompeuse, même si bien sûr une liste doit être choisie pour faire respecter l'ordre de collecte
Samuel EUSTACHI
24
FAUX! Un ensemble Java peut être commandé, selon l'implémentation; par exemple, un Java TreeSet est commandé. Dans le contexte de Java, la seule différence entre une liste et un ensemble est que l'ensemble contient des éléments uniques. Dans le contexte des mathématiques, les éléments d'un ensemble sont uniques et non ordonnés.
stackoverflowuser2010
45
Oui, un ensemble Java PEUT être MAIS n'est PAS NÉCESSAIREMENT commandé. Oui, si vous avez un TreeSet, vous pouvez compter sur sa commande. Mais vous devez SAVOIR que vous avez un TreeSet et pas seulement un Set. Si on vous retourne un ensemble, vous ne pouvez pas dépendre de celui à commander. En revanche, une liste est ordonnée par sa nature même et toute mise en œuvre de la liste doit être ordonnée. Donc, sur les termes de la définition de l'interface, il n'est pas particulièrement faux de dire qu'un Set n'est pas ordonné, mais il est peut-être un peu plus techniquement correct de dire qu'un Set ne fournit aucune garantie d'ordre des éléments.
Spanky Quigman
15
Ne confondez pas "ordonné" avec "trié". De même, ne confondez pas le contrat d'une interface et les implémentations de l'interface. Il est également faux de dire que quelque chose de "non ordonné" n'a pas d'ordre, cela signifie simplement qu'il n'y a aucune garantie quant à la mise en œuvre de l'ordre (et que l'ordre peut ne pas être stable entre les appels, contrairement à une liste ordonnée).
lilbyrdie
223
╔═══════════════════╦══════════════════════╦═════════════════════════════╗
                            List                     Set              
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
     Duplicates              YES                     NO               
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
       Order              ORDERED          DEPENDS ON IMPLEMENTATION  
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
 Positional Access          YES                      NO                
╚═══════════════════╩══════════════════════╩═════════════════════════════╝
Sergii Shevchyk
la source
2
Une chose à noter: les performances d'accès positionnel dépendent beaucoup de l'implémentation sous-jacente, tableau vs liste liée stackoverflow.com/questions/322715/…
Christophe Roussy
1
Comment les ensembles sont-ils indexés sinon par accès positionnel? (+1 pour la table ASCII)
tplive
72

Listes ordonnées d'éléments (uniques ou non)
Conforme à l'interface Java nomméeList
Accessible par index

implémenté à l'aide

  • LinkedList
  • Liste des tableaux

Listes d'éléments uniques:
Conformes à l'interface Java nomméeSet
peut pas être consulté par index

implémenté à l'aide

  • HashSet (non ordonné)
  • LinkedHashSet (commandé)
  • TreeSet (trié par ordre naturel ou par comparateur fourni)

Les deux interfaces Setet Listconformes à l'interface de Java nomméeCollection

ivan_ivanovich_ivanoff
la source
28

Un ensemble ne peut pas contenir d'éléments en double alors qu'une liste le peut. Une liste (en Java) implique également l'ordre.

Peter
la source
16
  • Une liste est un regroupement ordonné d'articles
  • Un ensemble est un regroupement non ordonné d'articles sans doublons autorisés (généralement)

Conceptuellement, nous nous référons généralement à un regroupement non ordonné qui autorise les doublons en tant que sac et ne permet pas les doublons est un ensemble.

Hardwareguy
la source
Un ensemble ne peut pas avoir de doublons.
karim79
Certaines implémentations d'ensemble sont ordonnées (comme LinkedHashSet, qui maintient une LinkedList en arrière-plan). Mais le Set ADT n'a pas de commande.
Michael Myers
10

liste

  1. Est un regroupement ordonné d'éléments.
  2. La liste est utilisée pour la collecte d'éléments avec des doublons.
  3. De nouvelles méthodes sont définies dans l'interface List.

Ensemble

  1. Est un regroupement non ordonné d'éléments.
  2. Set est utilisé pour collecter des éléments sans doublons.
  3. Aucune nouvelle méthode n'est définie dans l'interface Set, nous devons donc utiliser les méthodes d'interface Collection uniquement avec les sous-classes Set.
Shankar Suligavi
la source
10

Liste:

Lists autorisent généralement les objets en double. Lists doivent être commandés, et sont donc accessibles par index.

Cours de mise en œuvre: ArrayList, LinkedList,Vector

Ensemble:

Sets ne permettent pas les objets en double. La plupart des implémentations ne sont pas ordonnées, mais elles sont spécifiques à l'implémentation.

Les classes d'implémentation incluent: HashSet(non ordonnées), LinkedHashSet(ordonnées), TreeSet(ordonnées par ordre naturel ou par comparateur fourni)

csds
la source
7

Comme nous parlons des interfaces Java, pourquoi ne pas regarder le Javadoc?!

  • A Listest une collection ordonnée (séquence), qui permet généralement des doublons
  • Une Setcollection a is ne contenant aucun élément en double, l'ordre d'itération peut être garanti par l'implémentation

Il n'y a AUCUNE mention de manque d'ordre concernant les Sets: cela dépend de l'implémentation.

Christophe Roussy
la source
2
Correct. LinkedHashSet contient des éléments dans l'ordre d'insertion.
ggb667
C'est une interface, TOUT dépend de l'implémentation. List.get () pourrait créer un fichier contenant les 5 premières décimales de pi et lever une StackOverFlowException dans certaines implémentations, cela n'implique pas que vous puissiez dire "Une liste est quelque chose qui peut créer des fichiers", car cela ne fait pas partie de la contrat défini par l'interface. Les documents affirment que Set est modélisé d'après le concept mathématique d'un ensemble, qui par définition n'est pas ordonné. Étant donné un ensemble dans votre code, vous ne pouvez pas supposer qu'il est commandé sans violer les principes SOLID.
sara
@kai, je reste généralement LinkedHashSetsur le côté gauche si le code repose sur la commande plus tard. Je l'utilise uniquement Setsi je l'utilise vraiment comme un, car vous ne pouvez pas supposer que l'implémentation sous-jacente est un LinkedHashSetou tel, cela peut être aujourd'hui, mais demain le code change et il échouera.
Christophe Roussy
Si vous déclarez un LinkedHashSet, vous ne traitez pas avec un ensemble, donc faire des réclamations sur la façon dont les ensembles doivent se comporter n'est guère pertinent. Je dirais qu'attribuer un ordre (possible) à des ensembles basés sur certaines implémentations revient à dire "Les instances de Runnable ont une méthode d'exécution destinée à être exécutée sur un thread. Elles ouvrent également une connexion DB et lisent les données client en fonction de l'implémentation. " Bien sûr, certaines implémentations peuvent le faire, mais ce n'est pas ce que sous-entend l'interface exécutable.
sara
5

Ce n'est peut-être pas la réponse que vous cherchez, mais le JavaDoc des classes de collections est en fait assez descriptif. Copier / coller:

Une collection ordonnée (également connue sous le nom de séquence). L'utilisateur de cette interface a un contrôle précis sur l'endroit où dans la liste chaque élément est inséré. L'utilisateur peut accéder aux éléments par leur index entier (position dans la liste), et rechercher des éléments dans la liste.

Contrairement aux ensembles, les listes autorisent généralement les éléments en double. Plus formellement, les listes autorisent généralement des paires d'éléments e1 et e2 telles que e1.equals (e2), et elles autorisent généralement plusieurs éléments nuls si elles autorisent des éléments nuls. Il n'est pas inconcevable que quelqu'un souhaite implémenter une liste qui interdit les doublons, en lançant des exceptions d'exécution lorsque l'utilisateur tente de les insérer, mais nous nous attendons à ce que cette utilisation soit rare.

Jeroen van Bergen
la source
5

Un ensemble est un groupe non ordonné d'objets distincts - aucun objet en double n'est autorisé. Il est généralement implémenté à l'aide du code de hachage des objets insérés. (Des implémentations spécifiques peuvent ajouter un ordre, mais pas l'interface elle-même.)

Une liste est un groupe ordonné d'objets qui peut contenir des doublons. Il pourrait être mis en œuvre avec un ArrayList, LinkedListetc.

Quinn Taylor
la source
1
Je suis confus 😕! Que signifie ordonné / non ordonné dans ce contexte? Est-ce lié à l'ordre croissant et à l'ordre décroissant? Si oui, Listn'est pas commandé ordered
malhobayyeb
4
Ordonné est lorsque les données d'entrée sont organisées exactement comme entrées par l'utilisateur, tandis que Trié est lorsque les données d'entrée sont triées lexicographiquement ou par ordre croissant / décroissant (en termes de valeurs entières). Non ordonné signifie que les données d'entrée peuvent ou non être stockées dans l'ordre saisi par l'utilisateur.
Akhil
5

Liste: la
liste autorise les éléments en double et les valeurs nulles. Facile à rechercher en utilisant l'index correspondant des éléments et il affichera également les éléments dans l'ordre d'insertion. Exemple: (liste liée)

import java.util.*;

public class ListExample {

 public static void main(String[] args) {
    // TODO Auto-generated method stub

    List<Integer> l=new LinkedList<Integer>();
    l.add(001);
    l.add(555);
    l.add(333);
    l.add(888);
    l.add(555);
    l.add(null);
    l.add(null);

    Iterator<Integer> il=l.iterator();

    System.out.println(l.get(0));

    while(il.hasNext()){
        System.out.println(il.next());
    }

    for(Integer str : l){
        System.out.println("Value:"+str);
    }
 }

}

Production:

1
1
555
333
888
555
null
null
Valeur: 1
Valeur: 555
Valeur: 333
Valeur: 888
Valeur: 555
Valeur: null
Valeur: null

Set:
Set n'autorise aucun élément en double et autorise une valeur nulle unique. Il ne conservera aucun ordre pour afficher les éléments. Seul TreeSetsera affiché dans l'ordre croissant.

Exemple: (TreeSet)

import java.util.TreeSet;

public class SetExample {

 public static void main(String[] args) {
    // TODO Auto-generated method stub

    TreeSet<String> set = new TreeSet<String>();
    try {
        set.add("hello");
        set.add("world");
        set.add("welcome");
        set.add("all");

        for (String num : set) {
            System.out.println( num);

        }
        set.add(null);
    } catch (NullPointerException e) {
        System.out.println(e);
        System.out.println("Set doesn't allow null value and duplicate value");
    }

 }

}

Production:


Bonjour tout le monde
Bienvenue java.lang.NullPointerException Set ne permet pas la valeur nulle et la valeur en double


Indhu
la source
3

1.La liste autorise les valeurs en double et l'ensemble ne permet pas les doublons

2.List conserve l'ordre dans lequel vous avez inséré des éléments dans la liste Set ne maintient pas l'ordre. 3.List est une séquence ordonnée d'éléments tandis que Set est une liste distincte d'éléments qui n'est pas ordonnée.

Rakesh
la source
3

List Vs Set

1) L'ensemble ne permet pas les doublons. La liste permet la duplication. Basé sur l'implémentation de Set, il conserve également l'ordre d'insertion.

par exemple: LinkedHashSet. Il maintient l'ordre d'insertion.Veuillez vous référer, cliquez ici

2) contient la méthode. Par nature de l'ensemble, il donnera de meilleures performances d'accès. Meilleur cas, c'est o (1). Mais List a un problème de performances à invoquer contains.

Siva Kumar
la source
2

Toutes les Listclasses conservent l'ordre d'insertion. Ils utilisent différentes implémentations basées sur les performances et d'autres caractéristiques (par exemple ArrayListpour la vitesse d'accès d'un index spécifique, LinkedListpour simplement maintenir l'ordre). Puisqu'il n'y a pas de clé, les doublons sont autorisés.

Les Setclasses ne conservent pas l'ordre d'insertion. Ils peuvent éventuellement imposer un ordre spécifique (comme avec SortedSet), mais ont généralement un ordre défini par l'implémentation basé sur une fonction de hachage (comme avec HashSet). Comme les Sets sont accessibles par clé, les doublons ne sont pas autorisés.

lavinio
la source
Les cartes stockent les objets par clé, mais définissent les objets de magasin à l'aide d'une valeur unique liée à l'objet, généralement son code de hachage. (Les cartes peuvent également utiliser des codes de hachage pour vérifier l'unicité des clés, mais elles ne sont pas tenues de le faire.)
Quinn Taylor
1

Commande ... une liste a une commande, pas un ensemble.

Ricardo Marimon
la source
2
Set ADT ne spécifie pas l'ordre, mais certaines implémentations Set (telles que LinkedHashSet) conservent l'ordre d'insertion.
Michael Myers
3
Cependant, la différence la plus importante est que les ensembles n'autorisent pas les doublons. Un sac / multiset fait.
Quinn Taylor
Un TreeSet a une commande.
stackoverflowuser2010
1

Peu de différences notables entre List et Set en Java sont données comme suit:

1) La différence fondamentale entre List et Set en Java autorise les éléments en double. List en Java autorise les doublons tandis que Set n'autorise aucun doublon. Si vous insérez un doublon dans Set, il remplacera l'ancienne valeur. Toute implémentation de Set in Java ne contiendra que des éléments uniques.

2) Une autre différence significative entre List et Set en Java est l'ordre. La liste est une collection ordonnée tandis que l'ensemble est une collection non ordonnée. La liste maintient l'ordre d'insertion des éléments, signifie que tout élément qui est inséré avant ira sur un index inférieur à tout élément qui est inséré après. Définir en Java ne maintient aucun ordre. Bien que Set fournisse une autre alternative appelée SortedSet qui peut stocker les éléments Set dans un ordre de tri spécifique défini par les méthodes Comparable et Comparator des objets stockés dans Set.

3) L'implémentation populaire de l'interface List en Java inclut ArrayList, Vector et LinkedList. Alors que l'implémentation populaire de l'interface Set comprend HashSet, TreeSet et LinkedHashSet.

Il est assez clair que si vous devez maintenir l'ordre d'insertion ou l'objet et que votre collection peut contenir des doublons, List est une solution. D'un autre côté, si votre exigence est de maintenir une collection unique sans doublons, Set est la solution.

Vibha Sanskrityayan
la source
Salut @Vibha, si je veux les deux conditions? Je veux dire que je ne veux pas que mes données contiennent des doublons, et je veux aussi qu'elles soient commandées.
Panadol Chong
1

Liste:

  1. Doublons autorisés.
  2. Ordonné en regroupant les éléments (en d'autres termes, ayant un ordre défini, pas besoin de trier par ordre croissant)

Ensemble:

  1. Pas de doublons autorisés.
  2. Non ordonné en regroupant les éléments (en d'autres termes, n'ayant pas d'ordre défini, il peut ou non être classé par ordre croissant)
vijaybhupathi
la source
0

Set<E>et List<E>sont tous deux utilisés pour stocker des éléments de type E. La différence est qu'il Setest stocké de manière non ordonnée et ne permet pas de valeurs en double. Listest utilisé pour stocker des éléments de manière ordonnée et permet des valeurs en double.

Setles éléments ne sont pas accessibles par une position d'index et les Listéléments sont accessibles par une position d'index.

saibhushan
la source
1
@BalusC veuillez ne pas commenter sans voir la date de publication. Voir le poste digne à ce moment-là.
Yash
0

Salut Tant de réponses sont déjà données .. Permettez-moi de souligner quelques points qui ne sont pas mentionnés jusqu'à présent:

  • La plupart des implémentations de List (ArrayList, Vector) implémentent uneRandomAccess interface qui est une interface marqueur pour un accès plus rapide. Aucune des implémentations Set ne fait cela.
  • La liste utilise un itérateur spécial appelé ListIterator qui prend en charge l'itération dans les deux sens . L'ensemble utilise Iterator qui ne prend en charge que l'itération à 1 sens
  • HashSet prend 5,5 fois plus de mémoire qu'ArrayList pour stocker le même nombre d'éléments.
smruti ranjan
la source
@smurti c'est un peu tard, et je ne sais pas si vous l'avez noté, mais votre premier point se contredit: "La plupart des implémentations de la liste (ArrayList, Vector) implémentent RandomAccess ..." et "... aucune de la liste les implémentations font ça "
Peter M
0

Le plus grand différent est le concept de base.

Depuis l' interface Set and List . L'ensemble est un concept mathématique. La méthode Set étend la collection, mais n'ajoute pas de nouvelle méthode. size () signifie cardinalité (plus est BitSet.cardinality, compteur linéaire Log Journal Log , HyperLogLog ). addAll () signifie union. retenueAll () signifie intersection. removeAll () signifie différence.

Cependant, indiquez le manque de ces concepts. La liste ajoute beaucoup de méthode pour prendre en charge le concept de séquence que l' interface de collection ne fournit pas. le concept de base est INDEX . comme add (index, element), get (index), search (indexOf ()), remove (index) element. Liste fournir également « Voir Collection » de subList . L'ensemble n'a pas de vue. n'ont pas d'accès positionnel. La liste fournit également de nombreux algorithmes dans la classe Collections . sort (List), binarySearch (List), reverse (List), shuffle (List), fill (List). la méthode params est l' interface List . les éléments en double ne sont que le résultat de concepts. pas la différence essentielle.

La différence essentielle est donc le concept. L'ensemble est le concept de jeu de mathématiques. La liste est un concept de séquence.

LiLi
la source
-1

Voici un exemple clair avec groovy. je crée un ensemble et une liste. alors j'essaye de stocker 20 valeurs générées aléatoirement dans chaque liste. la valeur générée peut être comprise entre 0 et 5

s = [] as Set
l = []

max = 5
print "random Numbers :"
20.times{
e = (int)Math.random()*max
s << e
l << e
print "$e, "
}


println "\n"
println "Set : $s "
println "list : $l

Le résultat :

nombres aléatoires: 4, 1, 4, 0, 1, 2, 4, 0, 0, 3, 4, 3, 2, 0, 4, 0, 1, 3, 1, 3

Ensemble : [4, 1, 0, 2, 3]

liste : [4, 1, 4, 0, 1, 2, 4, 0, 0, 3, 4, 3, 2, 0, 4, 0, 1, 3, 1, 3]

Vous pouvez voir que la différence est que:

  • L'ensemble n'autorise pas les valeurs en double.
  • La liste autorise les valeurs en double.
Justice
la source
1
Les listes conservent également l'ordre.
glen3b
-1

Comme la réponse, SET n'a pas de valeur en double et List peut. Bien sûr, l'ordre est une autre chose pour les différencier.

Hongtao
la source
-1

Ensemble: un ensemble ne peut pas contenir d'éléments en double dans ses collections. c'est aussi une collection non ordonnée. Pour accéder aux données de Set, il est nécessaire d'utiliser uniquement Iterator et la récupération basée sur l'index n'est pas possible pour cela. Il est principalement utilisé chaque fois que la collecte d'unicité requise.

Liste: Une liste peut avoir des éléments en double, avec le naturel ordonné lors de son insertion. Ainsi, il peut être récupéré des données basées sur un index ou un itérateur. Il est largement utilisé pour stocker la collection qui doit accéder en fonction de l'index.

Arvind Chavhan
la source
-2

Nom du sujet: List VS Set

Je viens de parcourir le sujet le plus important de Java appelé Collections Framework. J'ai pensé partager avec vous ma petite connaissance des collections. List, Set, Map en sont le sujet le plus important. Commençons donc par List et Set.

Différence entre la liste et l'ensemble:

  1. List est une classe de collection qui étend la AbstractListclasse alors que Set est une classe de collection qui étend la AbstractSetclasse mais les deux implémentent l'interface Collection.

  2. L'interface de liste autorise les valeurs en double (éléments) tandis que l'interface de définition n'autorise pas les valeurs en double. En cas d'éléments en double dans Set, il remplace les anciennes valeurs.

  3. L'interface de liste autorise les valeurs NULL alors que l'interface Set n'autorise pas les valeurs Null. En cas d'utilisation de valeurs nulles dans Set, cela donne NullPointerException.

  4. L'interface de liste maintient l'ordre d'insertion. Cela signifie que la façon dont nous ajoutons les éléments dans la liste de la même manière que nous l'obtenons en utilisant l'itérateur ou pour chaque style. Alors que les Setimplémentations ne maintiennent pas nécessairement l'ordre d'insertion. (Bien SortedSetqu'il utilise TreeSetet LinkedHashSetconserve l'ordre d'insertion).

  5. L'interface de liste a ses propres méthodes définies tandis que l'interface Set n'a pas sa propre méthode, donc Set utilise uniquement les méthodes d'interface Collection.

  6. L'interface de liste a une classe héritée appelée Vectortandis que l'interface Set n'a pas de classe héritée

  7. Dernier point mais non le moindre ... La listIterator()méthode ne peut être utilisée que pour parcourir les éléments dans les classes de liste alors que nous pouvons utiliser la méthode iterator () pour accéder aux éléments de la classe Set

Pouvons-nous ajouter autre chose? S'il vous plaît, faites-moi savoir.

Merci.

user3542872
la source
D'une part, Listet Setsont des interfaces qui ont également des implémentations "de base" sous la forme d'une classe abstraite (que vous avez mentionnée). En outre, # 3 est complètement inexact , car la plupart des ensembles autorisent des valeurs nulles (mais dépendent de l'implémentation). Je ne comprends pas # 5 et # 7, et pour # 6 Vectorn'est pas hérité, mais est juste synchronisé et n'est pas préféré pour une utilisation sauf lorsque la synchronisation est nécessaire.
glen3b
-3

Ensemble:

Ne peut pas avoir de valeurs en double L'ordre dépend de l'implémentation. Par défaut, il n'est pas commandé Impossible d'accéder par index

Liste:

Peut avoir des valeurs en double Ordonné par défaut Peut avoir accès par index

user2142109
la source