Set ve List arasındaki fark nedir?


Yanıtlar:


504

Listsıralı bir eleman dizisidir, oysa sıralanmamış elemanların Setayrı bir listesidir (teşekkür ederim, Quinn Taylor ).

List<E>:

Sıralı bir koleksiyon (sekans olarak da bilinir). Bu arabirimin kullanıcısı, her öğenin listeye nereye eklendiği konusunda kesin denetime sahiptir. Kullanıcı öğelere tamsayı dizinine (listedeki konum) göre erişebilir ve listedeki öğeleri arayabilir.

Set<E>:

Yinelenen öğe içermeyen bir koleksiyon. Daha resmi olarak, kümeler e1.equals (e2) ve en fazla bir boş eleman olacak şekilde e1 ve e2 elemanlarını içermez. Adından da anlaşılacağı gibi, bu arayüz matematiksel küme soyutlamasını modeller.


7
SortedSet için, equals çağrılmadığından CompareTo () == 0 olduğu iki öğe yoktur.
Peter Lawrey

34
Bir Set sipariş edilebilir, bu yüzden bu cevabın ilk ifadesi yanıltıcıdır, elbette Koleksiyon siparişini uygulamak için bir Liste seçilmelidir
Samuel EUSTACHI

24
YANLIŞ! Uygulamaya bağlı olarak bir Java seti sipariş edilebilir; örneğin, bir Java TreeSet sipariş edilir. Java bağlamında, Liste ve Küme arasındaki tek fark, Kümenin benzersiz öğeler içermesidir. Matematik bağlamında, bir kümenin öğeleri benzersiz ve düzensizdir.
stackoverflowuser2010

44
Evet, bir Java Seti AMA OLABİLİR, GEREKEN sipariş verilmemiştir. Evet, bir TreeSet'iniz varsa, sipariş edilene güvenebilirsiniz. Ama sadece bir Set değil, bir TreeSet'iniz olduğunu da bilmelisiniz. Bir Set döndürülürseniz, sipariş edilecek sete güvenemezsiniz. Öte yandan bir Liste doğası gereği sıralanır ve Listenin herhangi bir uygulaması sipariş edilmelidir. Bu nedenle, arabirim tanımı terimleriyle, bir Kümenin sırasız olduğunu söylemek özellikle yanlış değildir, ancak bir Kümenin öğe sırası garantisi sağlamadığını söylemek biraz daha teknik olarak doğru olabilir.
Spanky Quigman

14
"Sıralı" kelimeyi "sıralı" kelimeyle karıştırmayın. Aynı şekilde, bir arabirimin sözleşmesini ve arabirimin uygulamalarını da karıştırmayın. Ayrıca "sırasız" olan bir şeyin sipariş olmadığını söylemek yanlıştır, sadece siparişin uygulanmasına ilişkin hiçbir garanti olmadığı anlamına gelir (ve sipariş, sıralı bir listeden farklı olarak çağrılar arasında sabit olmayabilir).
lilbyrdie

223
╔═══════════════════╦══════════════════════╦═════════════════════════════╗
                            List                     Set              
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
     Duplicates              YES                     NO               
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
       Order              ORDERED          DEPENDS ON IMPLEMENTATION  
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
 Positional Access          YES                      NO                
╚═══════════════════╩══════════════════════╩═════════════════════════════╝

2
Dikkat edilmesi gereken bir nokta: konumsal erişim performansı, temel uygulama, dizi vs bağlantılı listeye çok bağlıdır stackoverflow.com/questions/322715/…
Christophe Roussy

1
Setler konumsal erişimle değilse nasıl dizine eklenir? (ASCII tablosu için +1)
tplive

72

Sıralı eleman listeleri (benzersiz veya değil)
Java'nın arayüzüne uygun DizineList
erişilebilir

kullanılarak uygulandı

  • Bağlantılı liste
  • ArrayList

Eşsiz elementlerin Listeleri:
adlandırılmış Java'nın arayüzüne ConformSet
Can değil indeksi tarafından erişilebilir

kullanılarak uygulandı

  • HashSet (sırasız)
  • LinkedHashSet (sıralı)
  • TreeSet (doğal siparişe veya sağlanan karşılaştırıcıya göre sıralanır)

Hem arayüzler Sethem Listde Java'nın adlı arayüzüne uygundurCollection


28

Bir Liste, bir Küme, yinelenen öğeler içeremez. Bir Liste (Java'da) da sipariş anlamına gelir.


16
  • Liste, öğelerin sıralı bir gruplamasıdır
  • Küme, kopyalarına izin verilmeyen öğelerin sırasız bir gruplandırmasıdır (genellikle)

Kavramsal olarak, genellikle kopyaların bir Çanta olarak kullanılmasına izin veren ve kopyalara izin vermeyen sıralı bir gruplamadan bahsediyoruz.


Bir kümenin kopyaları olamaz.
karim79

Bazı set uygulamaları sipariş edilir (sahnelerin arkasında LinkedList'i tutan LinkedHashSet gibi). Ancak Set ADT'nin siparişi yoktur.
Michael Myers

10

Liste

  1. Sıralı elemanlar grubudur.
  2. Liste, kopyaları olan öğelerin toplanmasında kullanılır.
  3. Liste arayüzünde yeni yöntemler tanımlanır.

Ayarlamak

  1. Unsurların sıralanmamış bir gruplandırılmasıdır.
  2. Set, kopyalar olmadan elemanların toplanması için kullanılır.
  3. Set arabirimi içinde yeni bir yöntem tanımlanmadığından, Koleksiyon arabirimi yöntemlerini yalnızca Set alt sınıflarıyla kullanmamız gerekir.

10

Liste:

Lists genellikle yinelenen nesnelere izin verir. Lists sipariş edilmelidir ve bu nedenle dizin tarafından erişilebilir.

Uygulama sınıfları arasında şunlar bulunmaktadır: ArrayList, LinkedList,Vector

Ayarlamak:

Sets do not yinelenen nesneleri tanır. Uygulamaların çoğu sıralanmamıştır, ancak uygulamaya özeldir.

Uygulama sınıfları şunları içerir: HashSet(sırasız), LinkedHashSet(sıralı), TreeSet(doğal sipariş veya sağlanan karşılaştırıcı tarafından sıralanmıştır)


7

Java arayüzlerinden bahsederken, neden Javadoc'a bakmıyorsunuz ?!

  • A List, tipik olarak kopyalara izin veren sıralı bir koleksiyon (sıra)
  • A Seta, yinelenen öğe içermeyen bir koleksiyondur, yineleme sırası uygulama tarafından garanti edilebilir

Setlerle ilgili düzen eksikliğinden bahsedilmiyor: uygulamaya bağlı.


2
Doğru. LinkedHashSet, ekleme sırasında öğeler içerir.
ggb667

Bu bir arayüz, HER ŞEY uygulamaya bağlıdır. List.get (), pi'nin ilk 5 ondalık bölümünü içeren bir dosya oluşturabilir ve bazı uygulamalarda StackOverFlowException oluşturabilir, bu, "Liste, dosya oluşturabilen bir şeydir" diyebileceğiniz anlamına gelmez. arayüz tarafından tanımlanan sözleşme. Dokümanlar, Set'in, tanım gereği sıralanmamış olan bir kümenin matematiksel konseptinden sonra modellenmiştir. Kodunuzda bir set verildiğinde, SOLID ilkelerini ihlal etmeden sipariş edildiğini varsayamazsınız.
sara

@kai, LinkedHashSetkod daha sonra siparişe dayanıyorsa genellikle sol tarafta kalırım . Ben sadece Setbir tane gibi kullanırsanız kullanın, temel uygulama bir LinkedHashSetya da böyle olduğunu varsayamazsınız, bugün olabilir, ama yarın kod değişiklikleri ve başarısız olacaktır.
Christophe Roussy

Bir LinkedHashSet bildirirseniz bir Set ile uğraşmazsınız, bu yüzden Setlerin nasıl davranması gerektiği konusunda iddialarda bulunmak çok ilgili değildir. Bazı uygulamalar dayalı kümeler için öznitelik (olası) düzenliliği söyleyebilirim "Runnable örnekleri bazı iş parçacığı üzerinde çalıştırmak için bir çalışma yöntemi var. Ayrıca bir DB bağlantısı açın ve uygulamaya bağlı olarak müşteri verilerini okuyun. " Tabii ki bazı uygulamalar bunu yapabilir, ancak Çalıştırılabilir Arayüz tarafından ima edilen bu değildir.
sara

5

Aradığınız cevap bu olmayabilir, ancak koleksiyon sınıflarının JavaDoc'u aslında oldukça açıklayıcı. Kopya / yapıştırılan:

Sıralı bir koleksiyon (sekans olarak da bilinir). Bu arabirimin kullanıcısı, her öğenin listeye nereye eklendiği konusunda kesin denetime sahiptir. Kullanıcı öğelere tamsayı dizinine (listedeki konum) göre erişebilir ve listedeki öğeleri arayabilir.

Kümelerin aksine, listeler genellikle yinelenen öğelere izin verir. Daha resmi olarak, listeler tipik olarak e1 ve e2 eleman çiftlerine izin verir, öyle ki e1.equals (e2) ve boş elemanlara izin veriyorlarsa tipik olarak çoklu boş elemanlara izin verirler. Bir kullanıcının, kullanıcı eklemeye çalıştığında çalışma zamanı istisnaları atarak yinelenenleri yasaklayan bir liste uygulamak istemesi düşünülemez, ancak bu kullanımın nadir olmasını bekliyoruz.


5

Küme, farklı nesnelerin sırasız bir grubudur - yinelenen nesnelere izin verilmez. Genellikle eklenen nesnelerin karma kodu kullanılarak uygulanır. (Belirli uygulamalar sipariş ekleyebilir, ancak Set arabiriminin kendisi eklemez.)

Liste, kopya içerebilecek sıralı bir nesne grubudur. Bu bir ile uygulanabilecek ArrayList, LinkedListvb


1
Kafam karıştı 😕! Sıralı / sırasız bu bağlamda ne anlama geliyor? Artan düzen ve azalan düzen ile ilgili mi? Eğer öyleyse, Listsipariş edilmez 😕
malhobayyeb

4
Sipariş giriş verileri düzenlenmiş tam olarak kullanıcı tarafından girilen zaman oysa sıralama giriş verileri (tam sayı değerleri açısından) sözlük sırasında ya da artan / azalan sıralanır zamandır. Sırasız , giriş verilerinin kullanıcının girdiği sırada saklanabileceği veya kaydedilmeyeceği anlamına gelir.
Akhil

5

Liste:
Liste, yinelenen öğelere ve boş değerlere izin verir. Öğelerin karşılık gelen dizinini kullanarak arama yapmak kolaydır ve ayrıca öğeleri ekleme sırasında görüntüler. Örnek: (LinkedList)

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

}

Çıktı:

1
1
555
333
888
555
boş
boş
Değeri: 1
Değeri: 555
Değer: 333
Değer: 888
Değer: 555
Değer: boş
Değeri: boş

Set:
Set, yinelenen öğelere izin vermez ve tek null değere izin verir.Öğeleri görüntülemek için herhangi bir sıra tutmaz.Yalnızca TreeSetartan sırada görüntülenir.

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

 }

}

Çıktı:

tüm
merhaba
karşılama
dünyası
java.lang.NullPointerException
Set null değerine ve yinelenen değere izin vermiyor


3

1.List yinelenen değerlere izin verir ve yinelenenlere izin vermez

2.List, Set'in siparişi korumadıkları listesine öğeleri eklediğiniz sırayı korur. 3.List sıralı bir eleman dizisidir, Set ise sıralanmamış elemanların ayrı bir listesidir.


3

Liste Vs Kümesi

1) Set, kopyalara izin vermez. Liste kopyalamaya izin verir. Set'in uygulanmasına dayanarak, ekleme talimatını da korur.

örneğin: LinkedHashSet. Ekleme sırasını korur.Lütfen buraya tıklayın

2) yöntem içerir . Setin doğası gereği erişim için daha iyi performans verecektir. En iyi durumda o (1). Ancak List'in başlatacak performans sorunu var contains.


2

Tüm Listsınıflar yerleştirme sırasını korur. Performans ve diğer özelliklere dayanan farklı uygulamalar kullanırlar (örneğin ArrayList, belirli bir endekse erişim hızı LinkedListiçin, sadece düzeni korumak için). Anahtar olmadığı için kopyalara izin verilir.

SetSınıfları yerleştirme düzeni sağlamak yoktur. İsteğe bağlı olarak (olduğu gibi SortedSet) belirli bir düzen uygulayabilirler , ancak tipik olarak bazı hash işlevine (olduğu gibi HashSet) dayalı olarak uygulama tanımlı bir sıraya sahiptirler . Yana Sets anahtar tarafından erişilebilir, çoğaltmaları izin verilmez.


Haritalar nesneleri anahtar ile depolar, ancak nesne nesnesini genellikle hash kodu olan benzersiz bir değer kullanarak depolar. (Haritalar anahtar benzersizliğini kontrol etmek için karma kodları da kullanabilir, ancak zorunlu değildir.)
Quinn Taylor

1

Sıralama ... bir liste bir sıraya sahiptir, bir küme yoktur.


2
Set ADT sıralamayı belirtmez, ancak bazı Set uygulamaları (LinkedHashSet gibi) ekleme sırasını korur.
Michael Myers

3
Bununla birlikte, daha önemli fark, kümelerin kopyalara izin vermemesidir. Bir çanta / çoklu set yapar.
Quinn Taylor

Bir TreeSet'in siparişi var.
stackoverflowuser2010

1

Java'da List ve Set arasındaki birkaç nota layık farklar aşağıdaki gibi verilir:

1) Java'da List ve Set arasındaki temel fark yinelenen öğelere izin vermektir. Java'daki liste yinelemelere izin verirken Set yinelemeye izin vermez. Set içine kopya eklerseniz eski değerin yerini alacaktır. Java'da Set uygulamasının tüm uygulamaları yalnızca benzersiz öğeler içerir.

2) Java'da Liste ve Küme arasındaki bir diğer önemli fark düzendir. Set sıralı bir koleksiyonken Set sıralanmamış bir koleksiyon. Liste, öğelerin ekleme sırasını korur, daha önce eklenen herhangi bir öğenin, daha sonra eklenen herhangi bir öğeden daha düşük bir dizine geçeceği anlamına gelir. Java'da ayarlanmış herhangi bir düzen yoktur. Set, Sette saklanan Nesnelerin Karşılaştırılabilir ve Karşılaştırıcı yöntemleri ile tanımlanan belirli Sıralama düzeninde Set öğelerini saklayabilen SortedSet adlı başka bir alternatif sağlar.

3) Java'da List arabiriminin popüler uygulaması ArrayList, Vector ve LinkedList'i içerir. Set arabiriminin popüler uygulaması HashSet, TreeSet ve LinkedHashSet'i içerir.

Ekleme sırasını veya nesneyi korumanız gerekiyorsa ve koleksiyonunuz Liste'den daha fazla kopya içerebiliyorsa, Liste gitmenin bir yoludur. Öte yandan, gereksiniminiz Set'ten başka herhangi bir kopya olmadan benzersiz koleksiyonu korumaksa, gitmenin yolu budur.


Merhaba @Vibha, Ben her iki durumu da istersem? Demek istediğim verilerimin kopyalar içermesini istemiyorum ve aynı zamanda sipariş olmasını da istiyorum.
Panadol Chong

1

Liste:

  1. İzin verilen kopyalar.
  2. Gruplama elemanlarına göre sıralanır. (Başka bir deyişle, kesin sıraya sahiptir. Artan sıraya göre sıralanmasına gerek yoktur)

Ayarlamak:

  1. Kopyalara izin verilmiyor.
  2. Gruplama öğelerinde sıralanmamıştır. (Başka bir deyişle, kesin bir sıraya sahip değildir. Artan düzende olabilir veya olmayabilir)

0

Set<E>ve List<E>her ikisi de türdeki öğeleri depolamak için kullanılır E. Fark, Setsırasız bir şekilde saklanması ve yinelenen değerlere izin vermemesidir. Listöğeleri sıralı bir şekilde saklamak için kullanılır ve yinelenen değerlere izin verir.

Setöğelere bir dizin konumu Listile erişilemez ve öğelere bir dizin konumu ile erişilebilir.


1
@BalusC gönderi tarihini görmeden yorum yapmayın. O zaman layık göreve bakın.
Yash

0

Merhaba Bu kadar çok cevap verilmiş .. Şimdiye kadar bahsedilmeyen bazı noktalara işaret edeyim:

  • Liste uygulamalarının çoğu (ArrayList, Vector) daha hızlı erişim için bir işaretleyici arabirimi olan arabirimi uygularRandomAccess . Set uygulamalarının hiçbiri bunu yapmaz.
  • Liste, ListIterator her iki yönde yinelemeyi destekleyen bir özel Yineleyici kullanır . Set, yalnızca 1 yönlü yinelemeyi destekleyen Iterator kullanır
  • HashSet, aynı sayıda öğeyi depolamak için ArrayList'ten 5.5 kat daha fazla bellek alır .

@smurti bu biraz geç ve not edip etmediğinizden emin değilim, ancak ilk noktanız kendisiyle çelişiyor: "Liste uygulamalarının çoğu (ArrayList, Vector) RandomAccess uyguluyor ..." ve "... Listenin Hiçbiri uygulamalar bunu "
Peter M

0

En büyük fark temel kavramdır.

Gönderen Seti ve Liste arayüzünün. Set matematik kavramdır. Set yöntemi koleksiyonu genişletir. Ancak yeni yöntem eklemeyin. size () kardinalite anlamına gelir (daha fazlası BitSet.cardinality, Linear counter , Log Log , HyperLogLog ). addAll () birleşim anlamına gelir. retainAll () kesişim anlamına gelir. removeAll () fark anlamına gelir.

Ancak bu kavramların eksikliğini listeleyin . Liste , Koleksiyon arabiriminin sağlamadığı dizi kavramını desteklemek için birçok yöntem ekler . temel kavram INDEX . add (index, element), get (index), search (indexOf ()), remove (index) öğelerini içerir. Liste ayrıca " Koleksiyon Görünümü " alt listesini de sağlar . Setin görünümü yok. konumsal erişim yok. List ayrıca Koleksiyonlar sınıfında birçok algoritma sağlar . sort (Liste), binarySearch (Liste), (List) karıştırmak, (List) dolguyu (List) ters. yöntem parametreler olduğunu Liste arayüzü. yinelenen öğeler sadece kavramların sonucudur. temel fark değil.

Temel fark kavram. Set matematik kavramdır. Liste dizi kavramdır.


-1

İşte harika ile açık bir örnek. bir küme ve bir liste oluşturuyorum. sonra her liste içinde 20 rastgele oluşturulan değeri depolamaya çalışın. üretilen değer 0 ila 5 aralığında olabilir

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

Sonuç :

rastgele sayılar: 4, 1, 4, 0, 1, 2, 4, 0, 0, 3, 4, 3, 2, 0, 4, 0, 1, 3, 1, 3

Ayarlamak : [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]

Farkın şu olduğunu görebilirsiniz:

  • Set yinelenen değerlere izin vermiyor.
  • Liste yinelenen değerlere izin verir.

1
Listeler de sıralamayı korur.
glen3b

-1

SET gibi yinelenen bir değere sahip değil ve List olabilir gibi cevap. Elbette düzen, onları birbirinden ayıran başka bir şeydir.


-1

Küme: Bir Küme koleksiyonlarında Yinelenen öğeler içeremez. aynı zamanda sıralanmamış bir koleksiyon. Set'teki verilere erişmek için yalnızca Yineleyici kullanmak gerekir ve dizin için geri alma mümkün değildir. Çoğunlukla benzersizlik toplama gerektiğinde kullanılır.

Liste: Liste, eklendikçe doğal sırada olacak şekilde yinelenen öğelere sahip olabilir. Böylece indeks veya yineleyici bazında veri alınabilir. İndekse göre erişmesi gereken koleksiyonu depolamak için yaygın olarak kullanılır.


-2

BAŞLIK: List VS Set

Java'nın Koleksiyon Çerçevesi adlı en önemli konusunu inceledim. Koleksiyonlar hakkındaki küçük bilgilerimi sizinle paylaşmayı düşündüm. Liste, Küme, Harita bunun en önemli konusudur. Şimdi List and Set ile başlayalım.

Liste ve Küme arasındaki fark:

  1. List, sınıfı genişleten bir koleksiyon sınıfıdır; AbstractListburada Set, sınıfı genişleten AbstractSetancak her ikisi de Koleksiyon arabirimini uygulayan bir koleksiyon sınıfıdır .

  2. Liste arabirimi yinelenen değerlere (öğeler) izin verirken, Set arabirimi yinelenen değerlere izin vermez. Set'te yinelenen öğeler olması durumunda, eski değerlerin yerini alır.

  3. Liste arabirimi NULL değerlere izin verir, burada Set arabirimi Null değerlere izin vermez. Set içinde Null değerlerin kullanılması durumunda verir NullPointerException.

  4. Liste arayüzü ekleme sırasını korur. Bu, Listedeki öğeleri, yineleyici veya her bir stil için elde ettiğimiz şekilde eklediğimiz anlamına gelir. Ancak, Setuygulamaların ekleme talimatını sürdürmesi gerekmez. ( Ekleme sırasını SortedSetkullanıyor TreeSetve kullanıyor olsa da LinkedHashSet).

  5. List arabiriminin kendi yöntemleri tanımlanırken Set arabiriminin kendi yöntemi yoktur, bu nedenle Set yalnızca Koleksiyon arabirimi yöntemlerini kullanır.

  6. Liste arabirimi adlı bir eski sınıfa Vectorsahipken, Set arabirimi herhangi bir eski sınıfa sahip değildir

  7. Son fakat en az değil ... Bu listIterator()yöntem yalnızca Liste Sınıfları içindeki öğeler arasında geçiş yapmak için kullanılabilirken, Set sınıfı öğelerine erişmek için iterator () yöntemini kullanabiliriz

Başka bir şey ekleyebilir miyiz? Lütfen bana haber ver.

Teşekkürler.


Birincisi Listve Setsoyut bir sınıf (bahsettiğiniz) biçiminde "temel" uygulamaları olan arabirimlerdir. Ayrıca, çoğu küme null değerlere izin verdiğinden (ancak uygulamaya bağlı) # 3 tamamen yanlıştır . # 5 ve # 7'yi anlamıyorum ve # 6 Vectoriçin eski değil, sadece senkronize edildi ve senkronizasyon gerektiğinde kullanılması tercih edilmiyor.
glen3b

-3

Ayarlamak:

Yinelenen değerler olamaz Sipariş, uygulamaya bağlıdır. Varsayılan olarak sıralanmamıştır Dizine göre erişilemiyor

Liste:

Yinelenen değerlere sahip olabilir Varsayılan olarak sıralanmıştır Dizine göre erişebilir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.