¿Cuál es la diferencia fundamental entre las interfaces Set<E>
y List<E>
?
¿Cuál es la diferencia fundamental entre las interfaces Set<E>
y List<E>
?
Respuestas:
List
es una secuencia ordenada de elementos, mientras que Set
es una lista distinta de elementos que no está ordenada (gracias, Quinn Taylor ).
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.
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.
╔═══════════════════╦══════════════════════╦═════════════════════════════╗
║ ║ List ║ Set ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║ Duplicates ║ YES ║ NO ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║ Order ║ ORDERED ║ DEPENDS ON IMPLEMENTATION ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║ Positional Access ║ YES ║ NO ║
╚═══════════════════╩══════════════════════╩═════════════════════════════╝
Listas ordenadas de elementos (únicos o no) Se
ajustan a la interfaz de Java llamadaList
Se puede acceder por índice
implementado usando
Listas de elementos únicos:
conforme a la interfaz de Java llamadaSet
No se puede acceder por índice
implementado usando
Ambas interfaces Set
y se List
ajustan a la interfaz de Java llamadaCollection
Conceptualmente, generalmente nos referimos a una agrupación desordenada que permite duplicados como una Bolsa y no permite duplicados es un Conjunto.
Lista
Conjunto
List
s generalmente permiten objetos duplicados.
List
s deben ordenarse y, por lo tanto, son accesibles por índice.
Clases de implementación incluyen: ArrayList
, LinkedList
,Vector
Set
s 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)
Mientras hablamos de las interfaces Java, ¿por qué no mirar el Javadoc?
List
es una colección ordenada (secuencia), que generalmente permite duplicadosSet
a es una colección que no contiene elementos duplicados, la implementación puede garantizar el orden de iteraciónNO se menciona la falta de orden en relación con los conjuntos: depende de la implementación.
LinkedHashSet
en el lado izquierdo si el código se basa en el pedido más adelante. Solo lo uso Set
si realmente lo uso como tal, ya que no puede suponer que la implementación subyacente es una LinkedHashSet
o tal, puede ser hoy, pero mañana el código cambia y fallará.
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.
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.
List
no se ordena 😕
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 TreeSet
se 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
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.
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
.
Todas las List
clases mantienen el orden de inserción. Utilizan diferentes implementaciones basadas en el rendimiento y otras características (por ejemplo, ArrayList
para la velocidad de acceso de un índice específico, LinkedList
simplemente para mantener el orden). Como no hay clave, se permiten duplicados.
Las Set
clases 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 Set
se accede a s por clave, no se permiten duplicados.
Ordenando ... una lista tiene un orden, un conjunto no.
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.
Lista:
Conjunto:
Set<E>
y List<E>
ambos se usan para almacenar elementos de tipo E
. La diferencia es que Set
se almacena de forma desordenada y no permite valores duplicados. List
se usa para almacenar elementos de forma ordenada y permite valores duplicados.
Set
No se puede acceder a los elementos mediante una posición de índice, y List
se puede acceder a los elementos con una posición de índice.
Hola, ya se dan muchas respuestas ... Permítanme señalar algunos puntos que no se mencionan hasta ahora:
RandomAccess
interfaz que es una interfaz de marcador para un acceso más rápido. Ninguna de las implementaciones de Set hace eso.ListIterator
que admite la iteración en ambas direcciones . Set usa Iterator que admite solo iteraciones de 1 víaLa 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.
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:
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.
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:
List es una clase de colección que amplía la AbstractList
clase donde, como Set, es una clase de colección que amplía la AbstractSet
clase pero ambas implementan la interfaz de colección.
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.
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
.
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 Set
implementaciones no necesariamente mantienen el orden de inserción. (Aunque lo SortedSet
hace usando TreeSet
, y LinkedHashSet
mantiene el orden de inserción).
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.
La interfaz de lista tiene una clase heredada llamada, Vector
mientras que la interfaz Set no tiene ninguna clase heredada
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.
List
y Set
son 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 Vector
no es heredado, sino que solo está sincronizado y no se prefiere su uso, excepto cuando se necesita sincronización.
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