Qual é a diferença fundamental entre as interfaces Set<E>
e List<E>
?
Qual é a diferença fundamental entre as interfaces Set<E>
e List<E>
?
Respostas:
List
é uma sequência ordenada de elementos, ao passo que Set
é uma lista distinta de elementos que não é ordenada (obrigado, Quinn Taylor ).
Uma coleção ordenada (também conhecida como sequência). O usuário desta interface tem controle preciso sobre onde na lista cada elemento é inserido. O usuário pode acessar elementos por seu índice inteiro (posição na lista) e procurar elementos na lista.
Uma coleção que não contém elementos duplicados. Mais formalmente, os conjuntos não contêm par de elementos e1 e e2, de modo que e1.equals (e2) e, no máximo, um elemento nulo. Como está implícito no nome, essa interface modela a abstração do conjunto matemático.
╔═══════════════════╦══════════════════════╦═════════════════════════════╗
║ ║ List ║ Set ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║ Duplicates ║ YES ║ NO ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║ Order ║ ORDERED ║ DEPENDS ON IMPLEMENTATION ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║ Positional Access ║ YES ║ NO ║
╚═══════════════════╩══════════════════════╩═════════════════════════════╝
Listas ordenadas de elemento (exclusivo ou não)
Conformidade com a interface do Java denominadaList
Pode ser acessado por índice
implemetented usando
Listas de elementos exclusivos:
Estar em conformidade com a interface do Java chamadoSet
pode não ser acessado pelo índice
implemetented usando
Ambas as interfaces Set
e List
estão em conformidade com a interface do Java denominadaCollection
Conceitualmente, geralmente nos referimos a um agrupamento não ordenado que permite duplicatas como um saco e não permite duplicatas como um conjunto.
Lista
Conjunto
List
s geralmente permitem objetos duplicados.
List
s devem ser ordenados e, portanto, acessíveis pelo índice.
Classes de implementação incluem: ArrayList
, LinkedList
,Vector
Set
s não permitem objetos duplicados. A maioria das implementações não é ordenada, mas é específica.
As classes de implementação incluem:
HashSet
(não ordenado),
LinkedHashSet
(ordenado),
TreeSet
(ordenado por ordem natural ou pelo comparador fornecido)
Como estamos falando das interfaces Java, por que não olhar para o Javadoc ?!
List
é uma coleção ordenada (sequência), que normalmente permite duplicatasSet
coleção a é que não contém elementos duplicados, a ordem da iteração pode ser garantida pela implementaçãoNão há menção à falta de ordem em relação aos conjuntos: depende da implementação.
LinkedHashSet
do lado esquerdo se o código depender da ordem mais tarde. Eu só uso Set
se realmente usá-lo como um, pois você não pode assumir que a implementação subjacente é uma coisa LinkedHashSet
ou outra , pode ser hoje, mas amanhã o código será alterado e falhará.
Pode não ser a resposta que você está procurando, mas o JavaDoc das classes de coleções é realmente bastante descritivo. Copiar / colado:
Uma coleção ordenada (também conhecida como sequência). O usuário desta interface tem controle preciso sobre onde na lista cada elemento é inserido. O usuário pode acessar elementos por seu índice inteiro (posição na lista) e procurar elementos na lista.
Diferentemente dos conjuntos, as listas normalmente permitem elementos duplicados. Mais formalmente, as listas normalmente permitem pares de elementos e1 e e2, como e1.equals (e2), e geralmente permitem vários elementos nulos, se permitirem elementos nulos. Não é inconcebível que alguém queira implementar uma lista que proíba duplicatas, lançando exceções de tempo de execução quando o usuário tenta inseri-las, mas esperamos que esse uso seja raro.
Um conjunto é um grupo não ordenado de objetos distintos - nenhum objeto duplicado é permitido. Geralmente é implementado usando o código de hash dos objetos que estão sendo inseridos. (Implementações específicas podem adicionar pedidos, mas a própria interface Set não.)
Uma lista é um grupo ordenado de objetos que podem conter duplicatas. Pode ser implementado com um ArrayList
, LinkedList
, etc.
List
não está ordenado mal
Lista:
Lista permite elementos duplicados e valores nulos. Fácil de pesquisar usando o índice correspondente dos elementos e também exibirá elementos em ordem de inserção. Exemplo: (lista vinculada)
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);
}
}
}
Resultado:
1
1
555
333
888
555
nulo
nulo
Valor: 1
Valor: 555
Valor: 333
Valor: 888
Valor: 555
Valor: null
Valor: null
Set:
Set não permite nenhum elemento duplicado e permite um valor nulo único. Não manterá nenhuma ordem para exibir elementos. Somente TreeSet
será exibido em ordem crescente.
Exemplo: (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");
}
}
}
Resultado:
all
hello
welcome
world
java.lang.NullPointerException
Set não permite valor nulo e valor duplicado
Lista versus conjunto
1) O conjunto não permite duplicatas. Lista permite duplicar. Com base na implementação do conjunto, também mantém a ordem de inserção.
por exemplo: LinkedHashSet
. Mantém a ordem de inserção.Por favor, consulte aqui
2) contém o método Por natureza do Conjunto, ele oferece melhor desempenho para acessar. O melhor caso é o (1). Mas a Lista tem um problema de desempenho para chamar contains
.
Todas as List
classes mantêm a ordem de inserção. Eles usam implementações diferentes com base no desempenho e outras características (por exemplo, ArrayList
para velocidade de acesso a um índice específico, LinkedList
simplesmente para manter a ordem). Como não há chave, duplicatas são permitidas.
As Set
classes não mantêm a ordem de inserção. Opcionalmente, eles podem impor uma ordem específica (como em SortedSet
), mas geralmente têm uma ordem definida por implementação com base em alguma função de hash (como em HashSet
). Como Set
s são acessados por chave, duplicatas não são permitidas.
Ordenando ... uma lista tem um pedido, um conjunto não.
Poucas diferenças dignas de nota entre Lista e Conjunto em Java são fornecidas da seguinte maneira:
1) A diferença fundamental entre List e Set em Java está permitindo elementos duplicados. A lista em Java permite duplicados, enquanto o Set não permite duplicados. Se você inserir duplicado em Definir, substituirá o valor mais antigo. Qualquer implementação do conjunto em Java conterá apenas elementos exclusivos.
2) Outra diferença significativa entre List e Set em Java é a ordem. Lista é uma coleção ordenada, enquanto Set é uma coleção não ordenada. A lista mantém a ordem de inserção dos elementos, significa que qualquer elemento que foi inserido antes terá um índice mais baixo do que qualquer elemento que foi inserido depois. Definido em Java não mantém nenhuma ordem. Embora o Set forneça outra alternativa chamada SortedSet, que pode armazenar elementos Set em uma ordem de classificação específica definida pelos métodos Comparable e Comparator dos Objetos armazenados no Set.
3) A implementação popular da interface List em Java inclui ArrayList, Vector e LinkedList. Enquanto a implementação popular da interface Set inclui HashSet, TreeSet e LinkedHashSet.
É bastante claro que, se você precisar manter um pedido ou objeto de inserção e sua coleção puder conter duplicatas, a Lista é um caminho a percorrer. Por outro lado, se o seu requisito é manter uma coleção exclusiva sem duplicatas, o conjunto é o caminho a seguir.
Lista:
Conjunto:
Set<E>
e List<E>
são utilizados tanto para armazenar elementos do tipo E
. A diferença é que Set
é armazenada de maneira desordenada e não permite valores duplicados. List
é usado para armazenar elementos de maneira ordenada e permite valores duplicados.
Set
elementos não podem ser acessados por uma posição de índice e List
elementos podem ser acessados com uma posição de índice.
Oi Tantas respostas já são dadas ... Deixe-me apontar alguns pontos que não são mencionados até agora:
RandomAccess
interface, que é uma interface de marcador para acesso mais rápido. Nenhuma das implementações do conjunto faz isso.ListIterator
que suporta a iteração nas duas direções . O conjunto usa o Iterator que suporta apenas iteração de 1 viaO maior diferente é o conceito básico.
Na interface Set and List . Conjunto é o conceito de matemática. Método Set estende collection.however não adicionar novo método. size () significa cardinalidade (mais é BitSet.cardinality, contador linear , Log Log , HyperLogLog ). addAll () significa união. retainAll () significa interseção. removeAll () significa diferença.
No entanto, liste a falta desses conceitos. A lista adiciona muitos métodos para suportar o conceito de sequência que a interface Collection não fornece. conceito central é o índice . como adicionar (índice, elemento), obter (índice), pesquisar (indexOf ()), remover (index) o elemento. A lista também fornece a subLista " Exibição de coleção " . Conjunto não tem vista. não tem acesso posicional. A lista também fornece muitos algoritmos na classe Coleções . classificação (Lista), Pesquisa binária (Lista), reversão (Lista), reprodução aleatória (Lista), preenchimento (Lista). o método params é a interface List . elementos duplicados são apenas o resultado de conceitos. não é a diferença essencial.
Portanto, a diferença essencial é o conceito. Conjunto é o conceito de conjunto de matemática. Lista é o conceito de sequência.
Aqui está um exemplo claro com o groovy. eu crio um conjunto e uma lista. então eu tento armazenar 20 valor gerado aleatoriamente dentro de cada lista. o valor gerado pode estar no intervalo 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
O resultado :
Números aleatórios: 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]
Você pode ver que a diferença é que:
Conjunto: um conjunto não pode ter elementos duplicados em suas coleções. também é uma coleção não ordenada. Para acessar os dados de Set, é necessário usar apenas o Iterator e a recuperação baseada em índice não é possível. É usado principalmente sempre que necessário, coleção de exclusividade.
Lista: uma lista pode ter elementos duplicados, com o natural ordenado à medida que é inserido. Assim, eles podem ser recuperados com base no índice ou no iterador. É amplamente usado para armazenar coleções que precisam ser acessadas com base no índice.
TÓPICO Nome: Lista VS Conjunto
Acabei de abordar o tópico mais importante do Java chamado Collections Framework. Pensei em compartilhar meu pouco conhecimento sobre coleções com você. Lista, Conjunto, Mapa são o tópico mais importante. Então, vamos começar com List e Set.
Diferença entre Lista e Conjunto:
List é uma classe de coleção que estende a AbstractList
classe, enquanto Set é uma classe de coleção que estende a AbstractSet
classe, mas ambas implementam a interface Collection.
A interface de lista permite valores duplicados (elementos), enquanto a interface de conjunto não permite valores duplicados. No caso de elementos duplicados no conjunto, ele substitui os valores mais antigos.
A interface de lista permite valores NULL onde a interface Set não permite valores nulos. No caso de usar valores nulos em Set, ele fornece NullPointerException
.
A interface de lista mantém o pedido de inserção. Isso significa a maneira como adicionamos os elementos na lista da mesma maneira que os obtemos usando o iterador ou para cada estilo. Enquanto as Set
implementações não mantêm necessariamente a ordem de inserção. (Embora SortedSet
use TreeSet
e LinkedHashSet
mantenha a ordem de inserção).
A interface de lista possui seus próprios métodos definidos, enquanto a interface Set não possui seu próprio método, portanto, o Set usa apenas os métodos da interface Collection.
A interface de lista possui uma classe herdada chamada, Vector
enquanto a interface Set não possui nenhuma classe herdada
Por último, mas não menos importante ... O listIterator()
método pode ser usado apenas para percorrer os elementos em List Classes, enquanto podemos usar o método iterator () para acessar os elementos da classe Set
Mais alguma coisa podemos adicionar? Por favor deixe-me saber.
Obrigado.
List
e Set
são interfaces que também têm implementações "base" na forma de uma classe abstrata (que você mencionou). Além disso, o nº 3 é completamente impreciso , pois a maioria dos conjuntos permite valores nulos (mas dependentes da implementação). Não entendo os números 5 e 7, e o número 6 Vector
não é legado, mas é apenas sincronizado e não é preferido para uso, exceto quando a sincronização é necessária.
Conjunto:
Não pode ter valores duplicados O pedido depende da implementação. Por padrão, não é solicitado. Não pode ter acesso por índice
Lista:
Pode ter valores duplicados Ordenado por padrão Pode ter acesso por índice