Qual é a diferença entre Set e List?

Respostas:

504

Listé uma sequência ordenada de elementos, ao passo que Seté uma lista distinta de elementos que não é ordenada (obrigado, Quinn Taylor ).

List<E>:

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.

Set<E>:

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.

Andrew Hare
fonte
7
Para um SortedSet, não há dois elementos em que compareTo () == 0, pois igual não é chamado.
27540 Peter Lawrey
34
Um conjunto pode ser encomendado, então a primeira declaração desta resposta é enganosa, mesmo que, naturalmente, uma lista deve ser escolhido para fazer cumprir a ordem Coleção
Samuel Eustachi
24
ERRADO! Um conjunto Java pode ser encomendado, dependendo da implementação; por exemplo, um Java TreeSet é solicitado. No contexto de Java, a única diferença entre uma Lista e um Conjunto é que o Conjunto contém itens exclusivos. No contexto da matemática, os itens de um conjunto são únicos e não ordenados.
stackoverflowuser2010
44
Sim, um conjunto Java PODE ser, mas NÃO é NECESSARIAMENTE solicitado. Sim, se você tiver um TreeSet, pode contar com a encomenda. Mas você deve SABER que possui um TreeSet e não apenas um conjunto. Se você receber um conjunto, não poderá depender do pedido. Uma lista, por outro lado, é ordenada por sua própria natureza e qualquer implementação da lista deve ser ordenada. Portanto, nos termos da definição da interface, não é particularmente errado dizer que um conjunto é desordenado, mas talvez seja um pouco mais tecnicamente correto dizer que um conjunto não oferece garantia de ordem dos elementos.
Spanky Quigman
14
Não confunda "pedido" com "classificado". Da mesma forma, não confunda o contrato de uma interface e as implementações da interface. Também é errado dizer que algo "não ordenado" não tem ordem, significa simplesmente que não há garantias sobre a implementação da ordem (e que a ordem pode não ser estável entre as chamadas, ao contrário de uma lista ordenada).
lilbyrdie
223
╔═══════════════════╦══════════════════════╦═════════════════════════════╗
                            List                     Set              
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
     Duplicates              YES                     NO               
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
       Order              ORDERED          DEPENDS ON IMPLEMENTATION  
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
 Positional Access          YES                      NO                
╚═══════════════════╩══════════════════════╩═════════════════════════════╝
Sergii Shevchyk
fonte
2
Uma coisa a nota: o desempenho de acesso posicional depende muito da implementação subjacente, array vs lista ligada stackoverflow.com/questions/322715/...
Christophe Roussy
1
Como os conjuntos são indexados, se não por acesso posicional? (+1 para a tabela ASCII)
tplive 13/09/18
72

Listas ordenadas de elemento (exclusivo ou não)
Conformidade com a interface do Java denominadaList
Pode ser acessado por índice

implemetented usando

  • LinkedList
  • ArrayList

Listas de elementos exclusivos:
Estar em conformidade com a interface do Java chamadoSet
pode não ser acessado pelo índice

implemetented usando

  • HashSet (não ordenado)
  • LinkedHashSet (pedido)
  • TreeSet (classificado por ordem natural ou pelo comparador fornecido)

Ambas as interfaces Sete Listestão em conformidade com a interface do Java denominadaCollection

ivan_ivanovich_ivanoff
fonte
28

Um conjunto não pode conter elementos duplicados enquanto uma lista pode. Uma lista (em Java) também implica ordem.

Pedro
fonte
16
  • Uma lista é um agrupamento ordenado de itens
  • Um conjunto é um agrupamento desordenado de itens sem duplicatas permitidas (geralmente)

Conceitualmente, geralmente nos referimos a um agrupamento não ordenado que permite duplicatas como um saco e não permite duplicatas como um conjunto.

Hardwareguy
fonte
Um conjunto não pode ter duplicatas.
karim79
Algumas implementações definidas são ordenadas (como o LinkedHashSet, que mantém um LinkedList nos bastidores). Mas o Set ADT não tem pedidos.
Michael Myers
10

Lista

  1. É um agrupamento ordenado de elementos.
  2. Lista é usada para coleção de elementos com duplicatas.
  3. Novos métodos são definidos dentro da interface List.

Conjunto

  1. É um agrupamento não ordenado de elementos.
  2. Conjunto é usado para coleção de elementos sem duplicatas.
  3. Nenhum novo método é definido dentro da interface Set, portanto, precisamos usar os métodos da interface Collection apenas com as subclasses Set.
Shankar Suligavi
fonte
10

Lista:

Lists geralmente permitem objetos duplicados. Lists devem ser ordenados e, portanto, acessíveis pelo índice.

Classes de implementação incluem: ArrayList, LinkedList,Vector

Conjunto:

Sets 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)

csds
fonte
7

Como estamos falando das interfaces Java, por que não olhar para o Javadoc ?!

  • A Listé uma coleção ordenada (sequência), que normalmente permite duplicatas
  • Uma Setcoleção a é que não contém elementos duplicados, a ordem da iteração pode ser garantida pela implementação

Não há menção à falta de ordem em relação aos conjuntos: depende da implementação.

Christophe Roussy
fonte
2
Corrigir. LinkedHashSet contém elementos na ordem de inserção.
precisa saber é o seguinte
É uma interface, TUDO depende da implementação. List.get () pode criar um arquivo contendo as 5 primeiras casas decimais de pi e lançar uma StackOverFlowException em algumas implementações, isso não implica que você possa dizer "Uma lista é algo que pode criar arquivos", pois isso não faz parte do contrato definido pela interface. Os documentos afirmam que Set é modelado com base no conceito matemático de um conjunto, que por definição não é ordenado. Dado um conjunto no seu código, você não pode assumir que ele é ordenado sem violar os princípios do SOLID.
Sara
@kai, eu costumo continuar LinkedHashSetdo lado esquerdo se o código depender da ordem mais tarde. Eu só uso Setse realmente usá-lo como um, pois você não pode assumir que a implementação subjacente é uma coisa LinkedHashSetou outra , pode ser hoje, mas amanhã o código será alterado e falhará.
Christophe Roussy
Se você declarar um LinkedHashSet, não está lidando com um conjunto, portanto, fazer declarações sobre como os conjuntos devem se comportar é pouco relevante. Eu diria que atribuir ordem (possível) a conjuntos com base em algumas implementações é semelhante a dizer "Instâncias de Runnable têm um método run que deve ser executado em algum encadeamento. Também abrem uma conexão com o banco de dados e leem os dados do cliente, dependendo da implementação. " É claro que algumas implementações podem fazer isso, mas não é isso que está implícito na Interface Runnable.
Sara
5

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.

Jeroen van Bergen
fonte
5

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.

Quinn Taylor
fonte
1
Estou confuso 😕! O que significa ordenado / não ordenado neste contexto? Está relacionado à ordem crescente e decrescente? Em caso afirmativo, Listnão está ordenado mal
malhobayyeb 11/01
4
Ordenado é quando os dados de entrada são organizados exatamente como inseridos pelo usuário, enquanto Ordenado é quando os dados de entrada são classificados lexicograficamente ou em ordem crescente / decrescente (em termos de valores inteiros). Não ordenado significa que os dados de entrada podem ou não ser armazenados na ordem de entrada do usuário.
Akhil
5

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 TreeSetserá 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

Indhu
fonte
3

1.List permite valores duplicados e o conjunto não permite duplicados

2.List mantém a ordem em que você inseriu elementos na lista O conjunto não mantém a ordem. 3.List é uma sequência ordenada de elementos, enquanto Set é uma lista distinta de elementos que não é ordenada.

Rakesh
fonte
3

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.

Siva Kumar
fonte
2

Todas as Listclasses mantêm a ordem de inserção. Eles usam implementações diferentes com base no desempenho e outras características (por exemplo, ArrayListpara velocidade de acesso a um índice específico, LinkedListsimplesmente para manter a ordem). Como não há chave, duplicatas são permitidas.

As Setclasses 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 Sets são acessados ​​por chave, duplicatas não são permitidas.

lavinio
fonte
Os mapas armazenam objetos por chave, mas define os objetos de armazenamento usando um valor exclusivo relacionado ao objeto, geralmente seu código de hash. (Maps também pode usar códigos de hash para verificar se há singularidade chave, mas eles não são obrigados a.)
Quinn Taylor
1

Ordenando ... uma lista tem um pedido, um conjunto não.

Ricardo Marimon
fonte
2
O Set ADT não especifica a ordem, mas algumas implementações do Set (como o LinkedHashSet) mantêm a ordem de inserção.
Michael Myers
3
No entanto, a diferença mais importante é que os conjuntos não permitem duplicatas. Um saco / multiset faz.
Quinn Taylor
Um TreeSet tem pedidos.
stackoverflowuser2010
1

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.

Vibha Sanskrityayan
fonte
Oi @Vibha, se eu quiser as duas condições? Quero dizer que não quero que meus dados contenham duplicatas, e também quero que eles estejam em ordem.
Panadol Chong
1

Lista:

  1. Duplicatas permitidas.
  2. Ordenados em elementos de agrupamento. (Em outras palavras, com ordem definida. Não é necessário classificar em ordem crescente)

Conjunto:

  1. Duplicatas não permitidas.
  2. Não ordenado em elementos de agrupamento. (Em outras palavras, sem ordem definida. Pode ou não ser organizado em ordem crescente)
vijaybhupathi
fonte
0

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.

Setelementos não podem ser acessados ​​por uma posição de índice e Listelementos podem ser acessados ​​com uma posição de índice.

saibhushan
fonte
1
@ BalusC, por favor, não comente sem ver a data da postagem. Veja o post digno naquele momento.
Yash
0

Oi Tantas respostas já são dadas ... Deixe-me apontar alguns pontos que não são mencionados até agora:

  • A maioria das implementações da lista (ArrayList, Vector) implementaRandomAccess interface, que é uma interface de marcador para acesso mais rápido. Nenhuma das implementações do conjunto faz isso.
  • Lista usa um iterador especial chamado ListIterator que suporta a iteração nas duas direções . O conjunto usa o Iterator que suporta apenas iteração de 1 via
  • O HashSet ocupa 5,5 vezes mais memória que o ArrayList para armazenar o mesmo número de elementos.
smruti ranjan
fonte
@smurti, é um pouco tarde, e não tenho certeza se você notou, mas seu primeiro ponto se contradiz: "A maioria das implementações da lista (ArrayList, Vector) implementa RandomAccess ..." e "... Nenhuma da lista implementações fazem isso "
Peter M
0

O 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.

LiLi
fonte
-1

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:

  • O conjunto não permite valores duplicados.
  • A lista permite valores duplicados.
justiça
fonte
1
As listas também mantêm os pedidos.
glen3b
-1

Assim como a resposta, SET não tem valor duplicado e a Lista pode. Obviamente, ordem é outra coisa para diferenciá-los.

Hongtao
fonte
-1

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.

Arvind Chavhan
fonte
-2

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:

  1. List é uma classe de coleção que estende a AbstractListclasse, enquanto Set é uma classe de coleção que estende a AbstractSetclasse, mas ambas implementam a interface Collection.

  2. 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.

  3. 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.

  4. 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 Setimplementações não mantêm necessariamente a ordem de inserção. (Embora SortedSetuse TreeSete LinkedHashSetmantenha a ordem de inserção).

  5. 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.

  6. A interface de lista possui uma classe herdada chamada, Vectorenquanto a interface Set não possui nenhuma classe herdada

  7. 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.

user3542872
fonte
Por um lado, Liste Setsã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 Vectornão é legado, mas é apenas sincronizado e não é preferido para uso, exceto quando a sincronização é necessária.
glen3b
-3

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

user2142109
fonte