Apa perbedaan antara Set dan Daftar?


Jawaban:


504

Listadalah urutan Setelemen yang terurut sedangkan daftar elemen berbeda yang tidak terurut (terima kasih, Quinn Taylor ).

List<E>:

Koleksi yang dipesan (juga dikenal sebagai urutan). Pengguna antarmuka ini memiliki kontrol yang akurat atas di mana dalam daftar setiap elemen dimasukkan. Pengguna dapat mengakses elemen dengan indeks integer mereka (posisi dalam daftar), dan mencari elemen dalam daftar.

Set<E>:

Koleksi yang tidak mengandung elemen duplikat. Lebih formal, set tidak mengandung pasangan elemen e1 dan e2 sehingga e1.equals (e2), dan paling banyak satu elemen nol. Seperti tersirat dari namanya, antarmuka ini memodelkan abstraksi set matematis.


7
Untuk SortedSet, tidak ada dua elemen di mana compareTo () == 0, sama dengan tidak dipanggil.
Peter Lawrey

34
Seperangkat DAPAT dipesan, sehingga pernyataan pertama dari jawaban ini menyesatkan, walaupun tentu saja Daftar harus dipilih untuk menegakkan pesanan Koleksi
Samuel EUSTACHI

24
SALAH! Satu set Java dapat dipesan, tergantung pada implementasinya; misalnya, Java TreeSet dipesan. Dalam konteks Java, satu-satunya perbedaan antara Daftar dan Set adalah bahwa Set berisi item unik. Dalam konteks matematika, item dari himpunan unik dan tidak teratur.
stackoverflowuser2010

44
Ya, Java Set CAN be TAPI tidak TERLALU diperintahkan. Ya, jika Anda memiliki TreeSet, Anda dapat mengandalkan itu dipesan. Tetapi Anda harus TAHU bahwa Anda memiliki TreeSet dan bukan hanya Set. Jika Anda mengembalikan Set, Anda tidak dapat bergantung pada yang dipesan. Daftar di sisi lain diurutkan berdasarkan sifatnya dan setiap implementasi Daftar harus dipesan. Jadi, dalam hal definisi antarmuka, tidak terlalu salah untuk mengatakan bahwa Set adalah unordered, tapi mungkin sedikit lebih teknis benar untuk mengatakan bahwa Set tidak memberikan jaminan urutan elemen.
Spiggy Quigman

14
Jangan mengacaukan "dipesan" dengan "diurutkan." Demikian juga, jangan mengacaukan kontrak antarmuka dan implementasi antarmuka. Juga salah untuk mengatakan bahwa sesuatu yang "tidak berurutan" tidak memiliki pesanan, itu berarti tidak ada jaminan tentang pelaksanaan pesanan (dan bahwa pesanan mungkin tidak stabil antara panggilan, tidak seperti dengan daftar yang dipesan).
lilbyrdie

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

2
Satu hal yang perlu diperhatikan: kinerja akses posisi sangat tergantung pada implementasi yang mendasarinya, susunan vs daftar tertaut stackoverflow.com/questions/322715/…
Christophe Roussy

1
Bagaimana set diindeks jika tidak oleh akses posisional? (+1 untuk tabel ASCII)
tplive

72

Daftar elemen yang dipesan (unik atau tidak)
Sesuai dengan antarmuka Java bernamaList
Dapat diakses oleh indeks

diimplemetasikan menggunakan

  • LinkedList
  • ArrayList

Daftar elemen yang unik:
Sesuai dengan antarmuka Java bernamaSet
Bisa tidak diakses oleh indeks

diimplemetasikan menggunakan

  • HashSet (tidak berurutan)
  • LinkedHashSet (dipesan)
  • TreeSet (diurutkan berdasarkan pesanan alami atau oleh pembanding yang disediakan)

Keduanya antarmuka Setdan Listsesuai dengan antarmuka Java bernamaCollection


28

Set tidak dapat berisi elemen duplikat sementara Daftar bisa. Daftar (di Jawa) juga menyiratkan pesanan.


16
  • Daftar adalah pengelompokan barang yang dipesan
  • Set adalah pengelompokan item tanpa urutan tanpa duplikat diizinkan (biasanya)

Secara konseptual, kami biasanya merujuk pada pengelompokan yang tidak berurutan yang memungkinkan duplikat sebagai suatu Tas dan tidak mengizinkan duplikat sebagai Perangkat.


Satu set tidak dapat memiliki duplikat.
karim79

Beberapa set implementasi diperintahkan (seperti LinkedHashSet, yang memelihara LinkedList di belakang layar). Tetapi Set ADT tidak memiliki pemesanan.
Michael Myers

10

Daftar

  1. Merupakan pengelompokan elemen berurutan.
  2. Daftar digunakan untuk mengumpulkan elemen dengan duplikat.
  3. Metode baru didefinisikan di dalam antarmuka Daftar.

Set

  1. Merupakan pengelompokan elemen yang tidak teratur.
  2. Set digunakan untuk kumpulan elemen tanpa duplikat.
  3. Tidak ada metode baru yang didefinisikan di dalam Set interface, jadi kita harus menggunakan metode Collection interface hanya dengan Set subclass.

10

Daftar:

Lists umumnya memungkinkan objek duplikat. Lists harus dipesan, dan karenanya dapat diakses dengan indeks.

Kelas implementasi meliputi: ArrayList, LinkedList,Vector

Set:

Sets melakukan tidak mengizinkan objek duplikat. Sebagian besar implementasi tidak teratur, tetapi implementasi khusus.

Kelas implementasi meliputi: HashSet(tidak berurutan), LinkedHashSet(dipesan), TreeSet(dipesan berdasarkan pesanan alami atau oleh pembanding yang disediakan)


7

Ketika kita berbicara tentang antarmuka Java, mengapa tidak melihat Javadoc ?!

  • A Listadalah koleksi yang diurutkan (berurutan), yang biasanya memungkinkan duplikat
  • A Setadalah koleksi yang tidak mengandung elemen duplikat, urutan iterasi dapat dijamin oleh implementasi

Tidak ada disebutkan tentang kurangnya ketertiban tentang perangkat: itu tergantung pada implementasi.


2
Benar. LinkedHashSet berisi elemen dalam urutan penyisipan.
ggb667

Ini antarmuka, SEMUA tergantung pada implementasinya. List.get () dapat membuat file yang berisi 5 desimal pertama pi dan melempar StackOverFlowException dalam beberapa implementasi, ini tidak menyiratkan bahwa Anda dapat mengatakan "Daftar adalah sesuatu yang dapat membuat file", karena itu bukan bagian dari kontrak yang ditentukan oleh antarmuka. Set klaim docs dimodelkan setelah konsep matematika dari set, yang menurut definisi tidak dipesan. Diberikan satu set dalam kode Anda, Anda tidak dapat menganggap itu dipesan tanpa melanggar prinsip SOLID.
sara

@ Kai, saya biasanya tetap LinkedHashSetdi sisi kiri jika kode bergantung pada pemesanan nanti. Saya hanya menggunakan Setjika saya benar-benar menggunakannya seperti itu, karena Anda tidak dapat berasumsi bahwa implementasi yang mendasarinya adalah LinkedHashSetseperti itu, mungkin hari ini, tetapi besok kode berubah dan akan gagal.
Christophe Roussy

Jika Anda mendeklarasikan LinkedHashSet Anda tidak berurusan dengan Set, jadi membuat klaim tentang bagaimana Sets seharusnya berperilaku hampir tidak relevan. Saya akan mengatakan keteraturan (mungkin) untuk set berdasarkan beberapa implementasi mirip dengan mengatakan "Instance of Runnable memiliki metode run dimaksudkan untuk dijalankan pada beberapa utas. Juga mereka membuka koneksi DB dan membaca data pelanggan tergantung pada implementasinya. " Tentu saja beberapa implementasi dapat melakukan itu, tetapi bukan itu yang tersirat oleh Runnable Interface.
sara

5

Ini mungkin bukan jawaban yang Anda cari, tetapi JavaDoc dari kelas koleksi sebenarnya cukup deskriptif. Salin / tempel:

Koleksi yang dipesan (juga dikenal sebagai urutan). Pengguna antarmuka ini memiliki kontrol yang akurat atas di mana dalam daftar setiap elemen dimasukkan. Pengguna dapat mengakses elemen dengan indeks integer mereka (posisi dalam daftar), dan mencari elemen dalam daftar.

Tidak seperti set, daftar biasanya memungkinkan elemen duplikat. Secara lebih formal, daftar biasanya memungkinkan pasangan elemen e1 dan e2 sedemikian rupa sehingga e1.equals (e2), dan mereka biasanya memungkinkan beberapa elemen null jika memungkinkan elemen nol sama sekali. Tidak dapat dibayangkan bahwa seseorang mungkin ingin menerapkan daftar yang melarang duplikat, dengan melemparkan pengecualian runtime ketika pengguna mencoba memasukkannya, tetapi kami berharap penggunaan ini jarang terjadi.


5

Satu set adalah kelompok objek yang tidak berurutan - tidak ada objek duplikat yang diizinkan. Biasanya diimplementasikan menggunakan kode hash dari objek yang dimasukkan. (Implementasi spesifik dapat menambahkan pemesanan, tetapi antarmuka Set sendiri tidak.)

Daftar adalah sekelompok objek yang diurutkan yang mungkin berisi duplikat. Hal ini dapat dilaksanakan dengan ArrayList, LinkedList, dll


1
Saya bingung 😕! Apa yang diperintahkan / tidak dipesan dalam konteks ini? Apakah ini terkait dengan urutan naik dan turun? Jika demikian, Listtidak dipesan 😕
malhobayyeb

4
Diurutkan adalah ketika data input diatur persis seperti yang diinput oleh pengguna sedangkan Diurutkan adalah ketika data input diurutkan secara leksikografis atau urutan naik / turun (dalam hal nilai integer). Tidak berurutan berarti bahwa data input mungkin atau mungkin tidak disimpan dalam urutan yang dimasukkan pengguna.
Akhil

5

Daftar:
Daftar memungkinkan elemen duplikat dan nilai nol. Mudah mencari menggunakan indeks elemen yang sesuai dan juga akan menampilkan elemen dalam urutan penyisipan. Contoh: (daftar tertaut)

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

}

Keluaran:

1
1
555
333
888
555
null
null
Nilai: 1
Nilai: 555
Nilai: 333
Nilai: 888
Nilai: 555
Nilai: nol
Nilai: nol

Set:
Set tidak membolehkan elemen duplikat dan itu memungkinkan nilai nol tunggal. Ini tidak akan mempertahankan urutan untuk menampilkan elemen. HanyaTreeSet akan ditampilkan dalam urutan naik.

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

 }

}

Keluaran:

semua
hello
welcome
world
java.lang.NullPointerException
Set tidak mengizinkan nilai nol dan nilai duplikat


3

1.List memungkinkan nilai duplikat dan mengatur tidak mengizinkan duplikat

2.List mempertahankan urutan di mana Anda memasukkan elemen ke dalam daftar Set tidak akan mempertahankan pesanan. 3.List adalah urutan elemen yang terurut sedangkan Set adalah daftar elemen yang tidak berurutan.


3

Daftar Vs Set

1) Set tidak memungkinkan duplikat. Daftar memungkinkan duplikat. Berdasarkan implementasi Set, Ia juga mempertahankan Order penyisipan.

misalnya: LinkedHashSet. Itu mempertahankan urutan penyisipan. Silakan lihat klik di sini

2) berisi metode. Dengan sifat dari Set itu akan memberikan kinerja yang lebih baik untuk diakses. Kasus terbaiknya adalah o (1). Tetapi List memiliki masalah kinerja untuk dipanggil contains.


2

Semua Listkelas mempertahankan urutan penyisipan. Mereka menggunakan implementasi yang berbeda berdasarkan kinerja dan karakteristik lainnya (misalnya ArrayListuntuk kecepatan akses indeks tertentu, LinkedListhanya untuk menjaga ketertiban). Karena tidak ada kunci, duplikat diperbolehkan.

The Setkelas tidak menjaga ketertiban penyisipan. Mereka secara opsional dapat memaksakan urutan tertentu (seperti dengan SortedSet), tetapi biasanya memiliki urutan yang ditentukan implementasi berdasarkan pada beberapa fungsi hash (seperti dengan HashSet). Karena Sets diakses dengan kunci, duplikat tidak diperbolehkan.


Peta menyimpan objek dengan kunci, tetapi menetapkan objek menyimpan menggunakan nilai unik yang terkait dengan objek, biasanya kode hash-nya. (Peta juga dapat menggunakan kode hash untuk memeriksa keunikan kunci, tetapi mereka tidak diharuskan.)
Quinn Taylor

1

Memesan ... daftar memiliki pesanan, satu set tidak.


2
Set ADT tidak menentukan urutan, tetapi beberapa implementasi Set (seperti LinkedHashSet) menjaga urutan penyisipan.
Michael Myers

3
Namun, perbedaan yang lebih penting adalah set tidak memungkinkan duplikat. Tas / multiset tidak.
Quinn Taylor

TreeSet telah memesan.
stackoverflowuser2010

1

Beberapa perbedaan yang layak dicatat antara List dan Set di Java diberikan sebagai berikut:

1) Perbedaan mendasar antara List dan Set di Java adalah memungkinkan elemen duplikat. Daftar di Java memungkinkan duplikat sementara Set tidak mengizinkan duplikat apa pun. Jika Anda memasukkan duplikat di Atur itu akan menggantikan nilai yang lebih lama. Setiap implementasi Set in Java hanya akan mengandung elemen unik.

2) Perbedaan signifikan lainnya antara Daftar dan Set di Jawa adalah urutan. Daftar adalah Koleksi yang Dipesan, sedangkan Set adalah Koleksi yang tidak dipesan. Daftar mempertahankan urutan penyisipan elemen, berarti setiap elemen yang dimasukkan sebelumnya akan memiliki indeks yang lebih rendah daripada elemen yang dimasukkan setelahnya. Diatur di Jawa tidak mempertahankan urutan apa pun. Meskipun Set menyediakan alternatif lain yang disebut SortedSet yang dapat menyimpan elemen Set dalam urutan penyortiran tertentu yang ditentukan oleh metode Comparable dan Comparator dari Objects yang disimpan di Set.

3) Implementasi populer antarmuka Daftar di Jawa termasuk ArrayList, Vector dan LinkedList. Sementara implementasi antarmuka Set yang populer termasuk HashSet, TreeSet dan LinkedHashSet.

Cukup jelas bahwa jika Anda perlu mempertahankan urutan penyisipan atau objek dan koleksi Anda dapat berisi duplikat daripada Daftar adalah cara untuk pergi. Di sisi lain, jika kebutuhan Anda adalah untuk mempertahankan koleksi unik tanpa duplikat daripada Set adalah cara untuk pergi.


Hai @ Vibha, Jika saya ingin kedua kondisi? Maksud saya, saya tidak ingin data saya mengandung duplikat, dan saya juga ingin itu dipesan.
Panadol Chong

1

Daftar:

  1. Duplikat yang diizinkan.
  2. Dipesan dalam elemen pengelompokan (Dengan kata lain memiliki pesanan pasti. Tidak perlu disortir dalam urutan menaik)

Set:

  1. Duplikat tidak diizinkan.
  2. Tidak berurutan dalam elemen pengelompokan. (Dengan kata lain tidak memiliki urutan tertentu. Mungkin diatur atau tidak diatur dalam urutan naik)

0

Set<E>dan List<E>keduanya digunakan untuk menyimpan elemen tipe E. Perbedaannya adalah bahwa Setdisimpan dalam cara yang tidak teratur dan tidak memungkinkan nilai duplikat. Listdigunakan untuk menyimpan elemen dengan cara yang terurut dan memungkinkan nilai duplikat.

Setelemen tidak dapat diakses oleh posisi indeks, dan Listelemen dapat diakses dengan posisi indeks.


1
@BalusC tolong jangan berkomentar tanpa melihat tanggal posting. Lihat pos layak pada saat itu.
Yash

0

Hai Begitu banyak jawaban yang sudah diberikan .. Mari saya tunjukkan beberapa poin yang tidak disebutkan sejauh ini:

  • Sebagian besar implementasi Daftar (ArrayList, Vector) mengimplementasikanRandomAccess antarmuka yang merupakan antarmuka penanda untuk akses yang lebih cepat. Tidak ada implementasi Set yang melakukan itu.
  • Daftar menggunakan satu Iterator khusus yang disebut ListIterator yang mendukung iterasi di kedua arah . Set menggunakan Iterator yang hanya mendukung iterasi 1 arah
  • HashSet membutuhkan memori 5,5 kali lebih banyak daripada ArrayList untuk menyimpan jumlah elemen yang sama.

@smurti ini agak terlambat, dan saya tidak yakin apakah Anda telah mencatat, tetapi poin pertama Anda bertentangan dengan dirinya sendiri: "Sebagian besar implementasi Daftar (ArrayList, Vektor) menerapkan RandomAccess ..." dan "... Tidak ada Daftar implementasi melakukan itu "
Peter M

0

Perbedaan terbesar adalah konsep dasarnya.

Dari antarmuka Set and List . Set adalah konsep matematika. Setel metode, perpanjang koleksi. Namun, jangan menambahkan metode baru. size () berarti kardinalitas (lebih banyak adalah BitSet.cardinality, penghitung Linear , Log Log, HyperLogLog ). addAll () berarti penyatuan. retainAll () berarti persimpangan. removeAll () berarti perbedaan.

Namun Daftar kekurangan konsep-konsep ini. Daftar menambahkan banyak metode untuk mendukung konsep urutan yang tidak disediakan antarmuka Koleksi . konsep inti adalah INDEX . seperti menambahkan (indeks, elemen), dapatkan (indeks), pencarian (indexOf ()), hapus elemen (indeks). Daftar juga menyediakan subList " Tampilan Koleksi " . Set tidak memiliki tampilan. tidak memiliki akses posisional. Daftar juga menyediakan banyak algoritma di kelas Koleksi . sortir (Daftar), pencarian biner (Daftar), mundur (Daftar), acak (Daftar), isi (Daftar). params metode adalah Daftar antarmuka. elemen duplikat hanyalah hasil dari konsep. bukan perbedaan esensial.

Jadi perbedaan mendasar adalah konsep. Set adalah konsep himpunan matematika. Daftar adalah konsep urutan.


-1

Berikut adalah contoh yang jelas dengan asyik. saya membuat satu set dan daftar. maka saya mencoba untuk menyimpan 20 nilai yang dihasilkan secara acak dalam setiap daftar. nilai yang dihasilkan bisa dalam kisaran 0 hingga 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

Hasil :

angka acak: 4, 1, 4, 0, 1, 2, 4, 0, 0, 3, 4, 3, 2, 0, 4, 0, 1, 3, 1, 3

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

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

Anda dapat melihat bahwa perbedaannya adalah:

  • Set tidak memungkinkan nilai duplikat.
  • Daftar memungkinkan nilai duplikat.

1
Daftar juga mempertahankan pemesanan.
glen3b

-1

Sukai jawabannya karena SET tidak memiliki nilai rangkap dan Daftar dapat. Tentu saja, ketertiban adalah satu hal lagi yang membedakan mereka.


-1

Set: Set tidak dapat memiliki elemen Gandakan dalam koleksi. itu juga koleksi yang tidak terurut. Untuk mengakses data dari Set, diperlukan untuk menggunakan Iterator saja dan pengambilan berbasis indeks tidak dimungkinkan untuk itu. Ini terutama digunakan setiap kali diperlukan koleksi keunikan.

Daftar: Daftar dapat memiliki elemen duplikat, dengan urutan alami saat dimasukkan. Dengan demikian, dapat diambil data berdasarkan indeks atau iterator. Ini banyak digunakan untuk menyimpan koleksi yang perlu diakses berdasarkan indeks.


-2

Nama TOPIK: Daftar VS Set

Saya baru saja membahas topik terpenting Jawa yang disebut Collections Framework. Saya pikir untuk membagikan sedikit pengetahuan saya tentang Koleksi dengan Anda. Daftar, Atur, Peta adalah topik terpenting. Jadi mari kita mulai dengan List dan Set.

Perbedaan antara Daftar dan Set:

  1. Daftar adalah kelas koleksi yang memperluas AbstractListkelas sedangkan Set adalah kelas koleksi yang memperluas AbstractSetkelas tetapi keduanya mengimplementasikan antarmuka Koleksi.

  2. Daftar antarmuka memungkinkan nilai duplikat (elemen) sedangkan Atur antarmuka tidak memungkinkan nilai duplikat. Dalam hal elemen duplikat di Set, itu menggantikan nilai yang lebih lama.

  3. Daftar antarmuka memungkinkan nilai NULL sedangkan Set antarmuka tidak memungkinkan nilai Null. Dalam hal menggunakan nilai Null di Set itu memberi NullPointerException.

  4. Antarmuka daftar mempertahankan urutan penyisipan. Itu berarti cara kita menambahkan elemen dalam Daftar dengan cara yang sama kita mendapatkannya menggunakan iterator atau untuk-masing-masing gaya. Sedangkan Setimplementasi tidak selalu mempertahankan urutan penyisipan. (Meskipun SortedSettidak menggunakan TreeSet, dan LinkedHashSetmempertahankan urutan penyisipan).

  5. Daftar antarmuka memiliki metode sendiri yang ditentukan sedangkan Set antarmuka tidak memiliki metode sendiri sehingga Set menggunakan metode antarmuka Koleksi saja.

  6. Daftar antarmuka memiliki satu kelas lama yang disebut Vectorsedangkan Set antarmuka tidak memiliki kelas lama

  7. Last but not least ... listIterator()Metode ini hanya dapat digunakan untuk menggilir elemen-elemen dalam Daftar Kelas sedangkan kita dapat menggunakan metode iterator () untuk mengakses Setel elemen kelas

Ada lagi yang bisa kita tambahkan? Tolong beritahu saya.

Terima kasih.


Pertama, Listdan Setmerupakan antarmuka yang juga memiliki implementasi "basis" dalam bentuk kelas abstrak (yang Anda sebutkan). Selain itu, # 3 sepenuhnya tidak akurat , karena sebagian besar set memungkinkan nilai nol (tetapi tergantung pada implementasi). Saya tidak mengerti # 5 dan # 7, dan untuk # 6 Vectorbukan warisan, tetapi hanya disinkronkan dan tidak disukai untuk digunakan kecuali ketika sinkronisasi diperlukan.
glen3b

-3

Set:

Tidak dapat memiliki nilai duplikat Pemesanan tergantung pada implementasi. Secara default tidak dipesan Tidak dapat mengakses menurut indeks

Daftar:

Dapat memiliki nilai duplikat Dipesan secara default Dapat memiliki akses berdasarkan indeks

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.