¿Cuál es la diferencia entre Set y List?

Respuestas:

504

Listes una secuencia ordenada de elementos, mientras que Setes una lista distinta de elementos que no está ordenada (gracias, Quinn Taylor ).

List<E>:

Una colección ordenada (también conocida como secuencia). El usuario de esta interfaz tiene un control preciso sobre dónde se inserta cada elemento en la lista. El usuario puede acceder a los elementos por su índice entero (posición en la lista) y buscar elementos en la lista.

Set<E>:

Una colección que no contiene elementos duplicados. Más formalmente, los conjuntos no contienen ningún par de elementos e1 y e2, de modo que e1.equals (e2), y como máximo un elemento nulo. Como su nombre lo indica, esta interfaz modela la abstracción del conjunto matemático.

Andrew Hare
fuente
77
Para un SortedSet, no hay dos elementos donde compareTo () == 0, como no se llama a igual.
Peter Lawrey
34
Se puede ordenar un Conjunto, por lo que la primera declaración de esta respuesta es engañosa, incluso si, por supuesto, se debe
elegir
24
¡INCORRECTO! Se puede ordenar un conjunto Java, dependiendo de la implementación; por ejemplo, se ordena un Java TreeSet. En el contexto de Java, la única diferencia entre una Lista y un Conjunto es que el Conjunto contiene elementos únicos. En el contexto de las matemáticas, los elementos de un conjunto son únicos y desordenados.
stackoverflowuser2010
44
Sí, un conjunto Java PUEDE ser PERO no está NECESARIAMENTE ordenado. Sí, si tiene un TreeSet, puede contar con que se ordene. Pero debes SABER que tienes un TreeSet y no solo un Set. Si le devuelven un Set, no puede depender de que se lo ordene. Por otro lado, una Lista está ordenada por su propia naturaleza y cualquier implementación de Lista debe ordenarse. Entonces, en los términos de la definición de interfaz, no es particularmente incorrecto decir que un Conjunto no está ordenado, pero quizás sea un poco más técnicamente correcto decir que un Conjunto no garantiza el orden de los elementos.
Spanky Quigman el
14
No combine "ordenado" con "ordenado". Del mismo modo, no mezcle el contrato de una interfaz y las implementaciones de la interfaz. También es incorrecto decir que algo que está "desordenado" no tiene orden, simplemente significa que no hay garantías sobre la implementación de la orden (y que la orden puede no ser estable entre llamadas, a diferencia de una lista ordenada).
lilbyrdie
223
╔═══════════════════╦══════════════════════╦═════════════════════════════╗
                            List                     Set              
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
     Duplicates              YES                     NO               
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
       Order              ORDERED          DEPENDS ON IMPLEMENTATION  
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
 Positional Access          YES                      NO                
╚═══════════════════╩══════════════════════╩═════════════════════════════╝
Sergii Shevchyk
fuente
2
Una cosa a tener en cuenta: el rendimiento del acceso posicional depende mucho de la implementación subyacente, matriz vs lista vinculada stackoverflow.com/questions/322715/…
Christophe Roussy
1
¿Cómo se indexan los conjuntos si no es por acceso posicional? (+1 para la tabla ASCII)
tplive
72

Listas ordenadas de elementos (únicos o no) Se
ajustan a la interfaz de Java llamadaList
Se puede acceder por índice

implementado usando

  • Lista enlazada
  • Lista de arreglo

Listas de elementos únicos:
conforme a la interfaz de Java llamadaSet
No se puede acceder por índice

implementado usando

  • HashSet (sin ordenar)
  • LinkedHashSet (ordenado)
  • TreeSet (ordenado por orden natural o por comparador proporcionado)

Ambas interfaces Sety se Listajustan a la interfaz de Java llamadaCollection

ivan_ivanovich_ivanoff
fuente
28

Un conjunto no puede contener elementos duplicados mientras que una lista puede. Una lista (en Java) también implica orden.

Peter
fuente
16
  • Una lista es una agrupación ordenada de artículos
  • Un conjunto es una agrupación desordenada de elementos sin duplicados permitidos (generalmente)

Conceptualmente, generalmente nos referimos a una agrupación desordenada que permite duplicados como una Bolsa y no permite duplicados es un Conjunto.

Hardwareguy
fuente
Un conjunto no puede tener duplicados.
karim79
Algunas implementaciones de conjuntos están ordenadas (como LinkedHashSet, que mantiene una LinkedList detrás de escena). Pero el Set ADT no tiene orden.
Michael Myers
10

Lista

  1. Es una agrupación ordenada de elementos.
  2. Lista se utiliza para recopilar elementos con duplicados.
  3. Los nuevos métodos se definen dentro de la interfaz de la Lista.

Conjunto

  1. Es una agrupación desordenada de elementos.
  2. Set se usa para la colección de elementos sin duplicados.
  3. No se definen nuevos métodos dentro de la interfaz Set, por lo que debemos usar los métodos de la interfaz Collection solo con las subclases Set
Shankar Suligavi
fuente
10

Lista:

Lists generalmente permiten objetos duplicados. Lists deben ordenarse y, por lo tanto, son accesibles por índice.

Clases de implementación incluyen: ArrayList, LinkedList,Vector

Conjunto:

Sets no permiten objetos duplicados. La mayoría de las implementaciones no están ordenadas, pero es específica de la implementación.

Las clases de implementación incluyen: HashSet(sin ordenar), LinkedHashSet(ordenado), TreeSet(ordenado por orden natural o por comparador proporcionado)

csds
fuente
7

Mientras hablamos de las interfaces Java, ¿por qué no mirar el Javadoc?

  • A Listes una colección ordenada (secuencia), que generalmente permite duplicados
  • A Seta es una colección que no contiene elementos duplicados, la implementación puede garantizar el orden de iteración

NO se menciona la falta de orden en relación con los conjuntos: depende de la implementación.

Christophe Roussy
fuente
2
Correcto. LinkedHashSet contiene elementos en orden de inserción.
ggb667
Es una interfaz, TODO depende de la implementación. List.get () podría crear un archivo que contenga los primeros 5 decimales de pi y lanzar una StackOverFlowException en algunas implementaciones, esto no implica que pueda decir "Una lista es algo que puede crear archivos", ya que eso no es parte de contrato definido por la interfaz. Los documentos afirman que Set está modelado según el concepto matemático de un conjunto, que por definición no está ordenado. Dado un conjunto en su código, no puede asumir que está ordenado sin violar los principios de SOLID.
Sara
@kai, generalmente me mantengo LinkedHashSeten el lado izquierdo si el código se basa en el pedido más adelante. Solo lo uso Setsi realmente lo uso como tal, ya que no puede suponer que la implementación subyacente es una LinkedHashSeto tal, puede ser hoy, pero mañana el código cambia y fallará.
Christophe Roussy
Si declaras un LinkedHashSet no estás tratando con un Set, por lo que hacer afirmaciones sobre cómo deberían comportarse los Sets no es relevante. Yo diría que atribuir (posible) orden a conjuntos basados ​​en algunas implementaciones es similar a decir "Las instancias de Runnable tienen un método de ejecución destinado a ejecutarse en algún hilo. También abren una conexión de base de datos y leen los datos del cliente dependiendo de la implementación. " Por supuesto, algunas implementaciones pueden hacer eso, pero eso no es lo que implica la interfaz ejecutable.
sara
5

Puede que esta no sea la respuesta que está buscando, pero el JavaDoc de las clases de colecciones es bastante descriptivo. Copiar / pegar:

Una colección ordenada (también conocida como secuencia). El usuario de esta interfaz tiene un control preciso sobre dónde se inserta cada elemento en la lista. El usuario puede acceder a los elementos por su índice entero (posición en la lista) y buscar elementos en la lista.

A diferencia de los conjuntos, las listas generalmente permiten elementos duplicados. Más formalmente, las listas generalmente permiten pares de elementos e1 y e2 de modo que e1.equals (e2), y generalmente permiten múltiples elementos nulos si permiten elementos nulos. No es inconcebible que alguien desee implementar una lista que prohíba los duplicados, lanzando excepciones de tiempo de ejecución cuando el usuario intenta insertarlos, pero esperamos que este uso sea raro.

Jeroen van Bergen
fuente
5

Un conjunto es un grupo desordenado de objetos distintos: no se permiten objetos duplicados. Generalmente se implementa utilizando el código hash de los objetos que se insertan. (Las implementaciones específicas pueden agregar ordenamiento, pero la interfaz Set no lo hace).

Una lista es un grupo ordenado de objetos que pueden contener duplicados. Podría ser implementado con un ArrayList, LinkedList, etc.

Quinn Taylor
fuente
1
Estoy confundido 😕! ¿Qué significa ordenado / no ordenado en este contexto? ¿Está relacionado con el orden ascendente y el orden descendente? Si es así, Listno se ordena 😕
malhobayyeb
44
Ordenado es cuando los datos de entrada se organizan exactamente como los ingresó el usuario, mientras que Ordenado es cuando los datos de entrada se ordenan lexicográficamente o en orden ascendente / descendente (en términos de valores enteros). No ordenado significa que los datos de entrada pueden o no almacenarse en el orden ingresado por el usuario.
Akhil
5

Lista: la
lista permite elementos duplicados y valores nulos. Fácil de buscar utilizando el índice correspondiente de los elementos y también mostrará elementos en orden de inserción. Ejemplo: (lista enlazada)

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);
    }
 }

}

Salida:

1
1
555
333
888
555
nulo
nulo
Valor: 1
Valor: 555
Valor: 333
Valor: 888
Valor: 555
Valor: nulo
Valor: nulo

Set:
Set no permite elementos duplicados y permite un valor nulo único. No mantendrá ningún orden para mostrar elementos. Solo TreeSetse mostrará en orden ascendente.

Ejemplo: (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");
    }

 }

}

Salida:

all
hello
welcome
world
java.lang.NullPointerException
Set no permite valores nulos y valores duplicados

Indhu
fuente
3

1.Lista permite valores duplicados y establecer no permite duplicados

2.Lista mantiene el orden en el que insertó los elementos en la lista El conjunto no mantiene el orden. 3.List es una secuencia ordenada de elementos, mientras que Set es una lista distinta de elementos que no está ordenada.

Rakesh
fuente
3

List Vs Set

1) El conjunto no permite duplicados. La lista permite duplicar. Basado en la implementación de Set, también mantiene el orden de inserción.

por ejemplo: LinkedHashSet. Mantiene el orden de inserción. Consulte haga clic aquí

2) contiene el método. Por naturaleza del conjunto, dará un mejor rendimiento al acceso. El mejor caso es o (1). Pero List tiene problemas de rendimiento para invocar contains.

Siva Kumar
fuente
2

Todas las Listclases mantienen el orden de inserción. Utilizan diferentes implementaciones basadas en el rendimiento y otras características (por ejemplo, ArrayListpara la velocidad de acceso de un índice específico, LinkedListsimplemente para mantener el orden). Como no hay clave, se permiten duplicados.

Las Setclases no mantienen el orden de inserción. Opcionalmente, pueden imponer un orden específico (como con SortedSet), pero generalmente tienen un orden definido por la implementación basado en alguna función hash (como con HashSet). Dado que Setse accede a s por clave, no se permiten duplicados.

lavinio
fuente
Los mapas almacenan objetos por clave, pero establece los objetos de la tienda usando un valor único relacionado con el objeto, generalmente su código hash. (Los mapas también pueden utilizar los códigos hash para comprobar la singularidad clave, pero no están obligados a.)
Quinn Taylor
1

Ordenando ... una lista tiene un orden, un conjunto no.

Ricardo Marimon
fuente
2
Set ADT no especifica el orden, pero algunas implementaciones de Set (como LinkedHashSet) mantienen el orden de inserción.
Michael Myers
3
Sin embargo, la diferencia más importante es que los conjuntos no permiten duplicados. Una bolsa / multiset hace.
Quinn Taylor
Un TreeSet tiene pedidos.
stackoverflowuser2010
1

Pocas diferencias notables entre List y Set en Java se dan de la siguiente manera:

1) La diferencia fundamental entre List y Set en Java es permitir elementos duplicados. La lista en Java permite duplicados, mientras que Set no permite ningún duplicado. Si inserta duplicado en Set, reemplazará el valor anterior. Cualquier implementación de Set en Java solo contendrá elementos únicos.

2) Otra diferencia significativa entre List y Set en Java es el orden. La lista es una colección ordenada mientras que el conjunto es una colección no ordenada. La lista mantiene el orden de inserción de los elementos, significa que cualquier elemento que se inserte antes irá a un índice más bajo que cualquier elemento que se inserte después. Establecer en Java no mantiene ningún orden. Aunque Set proporciona otra alternativa llamada SortedSet que puede almacenar elementos Set en un orden de clasificación específico definido por los métodos Comparable y Comparator de los objetos almacenados en Set.

3) La implementación popular de la interfaz List en Java incluye ArrayList, Vector y LinkedList. Si bien la implementación popular de la interfaz Set incluye HashSet, TreeSet y LinkedHashSet.

Está bastante claro que si necesita mantener el orden de inserción o el objeto y su colección puede contener duplicados, List es un camino a seguir. Por otro lado, si su requisito es mantener una colección única sin duplicados, Set es el camino a seguir.

Vibha Sanskrityayan
fuente
Hola @Vibha, si quiero las dos condiciones? Quiero decir que no quiero que mis datos contengan duplicados, y también quiero que se ordene.
Panadol Chong
1

Lista:

  1. Duplicados permitidos.
  2. Ordenado en elementos de agrupación. (En otras palabras, tiene un orden definido. No es necesario ordenar en orden ascendente)

Conjunto:

  1. No se permiten duplicados.
  2. Desordenado en elementos de agrupación. (En otras palabras, no tiene un orden definido. Podría o no estar organizado en orden ascendente)
vijaybhupathi
fuente
0

Set<E>y List<E>ambos se usan para almacenar elementos de tipo E. La diferencia es que Setse almacena de forma desordenada y no permite valores duplicados. Listse usa para almacenar elementos de forma ordenada y permite valores duplicados.

SetNo se puede acceder a los elementos mediante una posición de índice, y Listse puede acceder a los elementos con una posición de índice.

Saibhushan
fuente
1
@BalusC por favor no comente sin ver la fecha de publicación. Ver la publicación digna en ese momento.
Yash
0

Hola, ya se dan muchas respuestas ... Permítanme señalar algunos puntos que no se mencionan hasta ahora:

  • La mayoría de las implementaciones de la lista (ArrayList, Vector) implementan unaRandomAccess interfaz que es una interfaz de marcador para un acceso más rápido. Ninguna de las implementaciones de Set hace eso.
  • La lista utiliza un iterador especial llamado ListIterator que admite la iteración en ambas direcciones . Set usa Iterator que admite solo iteraciones de 1 vía
  • HashSet toma 5.5 veces más memoria que ArrayList para almacenar el mismo número de elementos.
smruti ranjan
fuente
@smurti esto es un poco tarde, y no estoy seguro de si lo ha notado, pero su primer punto se contradice a sí mismo: "La mayoría de las implementaciones de la Lista (ArrayList, Vector) implementan RandomAccess ..." y "... Ninguna de la Lista implementaciones hacen eso "
Peter M
0

La mayor diferencia es el concepto básico.

Desde la interfaz Set and List . El conjunto es el concepto matemático. El método set extiende la colección, sin embargo, no agrega un método nuevo. size () significa cardinalidad (más es BitSet.cardinality, Contador lineal, Log Log, HyperLogLog ). addAll () significa unión. retieneTodo () significa intersección. removeAll () significa diferencia.

Sin embargo, enumere la falta de estos conceptos. La lista agrega muchos métodos para admitir el concepto de secuencia que la interfaz de la Colección no proporciona. El concepto central es el ÍNDICE . como agregar (index, element), get (index), search (indexOf ()), remove (index) element. La lista también proporciona la sublista " Vista de colección " . El conjunto no tiene vista. no tienen acceso posicional. La lista también proporciona muchos algoritmos en la clase Colecciones . sort (List), binarySearch (List), reverse (List), shuffle (List), fill (List). El método params es la interfaz de la lista . Los elementos duplicados son solo el resultado de conceptos. No es la diferencia esencial.

Entonces la diferencia esencial es el concepto. El conjunto es el concepto de conjunto de matemáticas. La lista es el concepto de secuencia.

LiLi
fuente
-1

Aquí hay un claro ejemplo con groovy. creo un conjunto y una lista. entonces trato de almacenar 20 valores generados aleatoriamente dentro de cada lista. el valor generado puede estar en el rango de 0 a 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

El resultado :

números al azar: 4, 1, 4, 0, 1, 2, 4, 0, 0, 3, 4, 3, 2, 0, 4, 0, 1, 3, 1, 3

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

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

Puedes ver que la diferencia es que:

  • El conjunto no permite valores duplicados.
  • La lista permite valores duplicados.
justicia
fuente
1
Las listas también mantienen el orden.
glen3b
-1

Al igual que la respuesta ya que SET no tiene un valor duplicado y List puede. Por supuesto, el orden es otra cosa para diferenciarlos.

Hongtao
fuente
-1

Conjunto: un conjunto no puede tener elementos duplicados en sus colecciones. También es una colección desordenada. Para acceder a los datos de Set, es necesario usar solo Iterator y no es posible la recuperación basada en índices. Se utiliza principalmente cuando se requiere una colección de unicidad.

Lista: una lista puede tener elementos duplicados, con el orden natural a medida que se inserta. Por lo tanto, se pueden recuperar datos basados ​​en índice o iterador. Se usa ampliamente para almacenar colecciones a las que se necesita acceder según el índice.

Arvind Chavhan
fuente
-2

Nombre del tema: List VS Set

Acabo de leer el tema más importante de Java llamado Collections Framework. Pensé compartir mi pequeño conocimiento sobre Colecciones contigo. Lista, conjunto, mapa son el tema más importante de la misma. Entonces, comencemos con List and Set.

Diferencia entre Lista y Conjunto:

  1. List es una clase de colección que amplía la AbstractListclase donde, como Set, es una clase de colección que amplía la AbstractSetclase pero ambas implementan la interfaz de colección.

  2. La interfaz de lista permite valores duplicados (elementos) mientras que la interfaz Set no permite valores duplicados. En caso de elementos duplicados en Set, reemplaza los valores más antiguos.

  3. La interfaz de lista permite valores NULL, mientras que la interfaz Set no permite valores NULL. En caso de usar valores nulos en Set, da NullPointerException.

  4. La interfaz de la lista mantiene el orden de inserción. Eso significa la forma en que agregamos los elementos en la Lista de la misma manera que lo obtenemos usando iterador o para cada estilo. Mientras que las Setimplementaciones no necesariamente mantienen el orden de inserción. (Aunque lo SortedSethace usando TreeSet, y LinkedHashSetmantiene el orden de inserción).

  5. La interfaz de lista tiene sus propios métodos definidos, mientras que la interfaz de Set no tiene su propio método, por lo que Set solo usa métodos de interfaz de colección.

  6. La interfaz de lista tiene una clase heredada llamada, Vectormientras que la interfaz Set no tiene ninguna clase heredada

  7. Por último, pero no menos importante ... El listIterator()método solo se puede usar para recorrer los elementos dentro de las clases de lista, mientras que podemos usar el método iterator () para acceder a los elementos de la clase Set

¿Algo más que podamos agregar? Por favor hagamelo saber.

Gracias.

usuario3542872
fuente
Por un lado, Listy Setson interfaces que también tienen implementaciones "base" en forma de una clase abstracta (que usted mencionó). Además, el # 3 es completamente inexacto , ya que la mayoría de los conjuntos permiten valores nulos (pero dependen de la implementación). No entiendo el n. ° 5 y el n. ° 7, y para el n. ° 6 Vectorno es heredado, sino que solo está sincronizado y no se prefiere su uso, excepto cuando se necesita sincronización.
glen3b
-3

Conjunto:

No puede tener valores duplicados. El pedido depende de la implementación. Por defecto no está ordenado No puede tener acceso por índice

Lista:

Puede tener valores duplicados Ordenado por defecto Puede tener acceso por índice

usuario2142109
fuente