ความแตกต่างระหว่างชุดและรายการคืออะไร?


416

อะไรคือความแตกต่างพื้นฐานระหว่างSet<E>และList<E>อินเตอร์เฟส?



5
และถ้าคุณต้องการค้นหาในแง่ของประสิทธิภาพลองดูที่คำถามนี้stackoverflow.com/questions/10799417/…
vsingh

คำตอบ:


504

Listเป็นลำดับที่เรียงลำดับขององค์ประกอบในขณะที่Setเป็นรายการที่แตกต่างขององค์ประกอบที่ไม่ได้สั่ง (ขอบคุณQuinn Taylor )

List<E>:

คอลเลกชันที่ได้รับคำสั่ง (หรือเรียกว่าลำดับ) ผู้ใช้ของอินเทอร์เฟซนี้มีการควบคุมที่ถูกต้องแม่นยำว่าส่วนใดของรายการที่แทรกอยู่ในรายการ ผู้ใช้สามารถเข้าถึงองค์ประกอบตามดัชนีจำนวนเต็ม (ตำแหน่งในรายการ) และค้นหาองค์ประกอบในรายการ

Set<E>:

คอลเล็กชันที่ไม่มีองค์ประกอบที่ซ้ำกัน อย่างเป็นทางการยิ่งขึ้นชุดไม่มีองค์ประกอบของคู่ e1 และ e2 เช่นนั้น e1.equals (e2) และองค์ประกอบโมฆะหนึ่งรายการ ตามนัยโดยชื่อของมันอินเตอร์เฟสนี้จำลองโมเดลนามธรรมทางคณิตศาสตร์


7
สำหรับ SortedSet ไม่มีองค์ประกอบสองอย่างที่ comparTo () == 0 เนื่องจากไม่มีการเรียกเท่ากับ
Peter Lawrey

34
สามารถสั่งชุดได้ดังนั้นคำสั่งแรกของคำตอบนี้จะทำให้เข้าใจผิดแม้ว่าแน่นอนว่ารายการจะต้องเลือกที่จะบังคับใช้คำสั่งเก็บ
ซามูเอล EUSTACHI

24
ไม่ถูกต้อง! สามารถสั่งซื้อชุด Java ขึ้นอยู่กับการใช้งาน; ตัวอย่างเช่นสั่ง Java TreeSet ในบริบทของ Java ความแตกต่างเพียงอย่างเดียวระหว่างรายการและชุดคือชุดประกอบด้วยรายการที่ไม่ซ้ำกัน ในบริบทของคณิตศาสตร์สิ่งของในเซตนั้นมีเอกลักษณ์และไม่มีการเรียงลำดับ
stackoverflowuser2010

44
ใช่ชุด Java สามารถเป็นได้ แต่ไม่ได้รับคำสั่งจาก NECESSARILY ใช่ถ้าคุณมี TreeSet คุณสามารถนับได้ว่ากำลังสั่งซื้ออยู่ แต่คุณต้องรู้ว่าคุณมีชุดต้นไม้และไม่ใช่แค่ชุด หากคุณส่งคืนชุดคุณจะไม่สามารถพึ่งพาได้ว่าจะสั่งซื้อชุดใด รายการในอีกทางหนึ่งถูกจัดเรียงตามลักษณะของรายการและต้องดำเนินการสั่งซื้อรายการใด ๆ ดังนั้นในแง่ของคำจำกัดความอินเทอร์เฟซมันไม่ผิดโดยเฉพาะที่จะบอกว่า Set ไม่มีการเรียงลำดับ แต่อาจมีความถูกต้องทางเทคนิคมากกว่าเล็กน้อยที่จะบอกว่า Set ไม่รับประกันการสั่งซื้อองค์ประกอบ
Spanky Quigman

14
ไม่ต้อง "เรียง" กับ "เรียงลำดับ" ในทำนองเดียวกันอย่าทำให้สัญญาของอินเทอร์เฟซและการใช้งานของอินเทอร์เฟซ นอกจากนี้ยังเป็นสิ่งที่ผิดที่จะบอกว่าบางสิ่งบางอย่างที่ "ไม่ได้สั่ง" ไม่มีคำสั่งมันก็หมายความว่าไม่มีการรับประกันเกี่ยวกับการดำเนินการตามคำสั่ง (และคำสั่งนั้นอาจไม่มั่นคงระหว่างการโทร
lilbyrdie

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

2
สิ่งหนึ่งที่ควรทราบ: ประสิทธิภาพการเข้าถึงตำแหน่งขึ้นอยู่กับการใช้งานพื้นฐาน, vs array ที่เชื่อมโยงรายการstackoverflow.com/questions/322715/…
Christophe Roussy

1
ตั้งค่าการจัดทำดัชนีอย่างไรถ้าไม่ได้โดยการเข้าถึงตำแหน่ง? (+1 สำหรับตาราง ASCII)
tplive

72

รายการสั่งซื้อองค์ประกอบ (ไม่ซ้ำกันหรือไม่)
สอดคล้องกับอินเทอร์เฟซของ Java ชื่อList
สามารถเข้าถึงได้โดยดัชนี

การใช้งานที่ไม่สมบูรณ์

  • LinkedList
  • ArrayList

รายการขององค์ประกอบที่ไม่ซ้ำกัน:
สอดคล้องกับอินเตอร์เฟซของ Java ชื่อSet
อาจไม่สามารถเข้าถึงได้โดยดัชนี

การใช้งานที่ไม่สมบูรณ์

  • HashSet (ไม่ได้เรียงลำดับ)
  • LinkedHashSet (สั่งซื้อ)
  • TreeSet (เรียงตามลำดับธรรมชาติหรือโดยตัวเปรียบเทียบที่ให้มา)

ทั้งอินเตอร์เฟสSetและListสอดคล้องกับอินเตอร์เฟสของ Java ที่ชื่อCollection


28

ชุดไม่สามารถมีองค์ประกอบที่ซ้ำกันในขณะที่รายการสามารถ รายการ (ใน Java) ยังหมายถึงการสั่งซื้อ


16
  • รายการคือการจัดกลุ่มรายการ
  • ชุดคือการจัดกลุ่มรายการที่ไม่เรียงลำดับโดยไม่อนุญาตให้ทำซ้ำ (โดยปกติ)

โดยทั่วไปเรามักจะอ้างถึงกลุ่มที่ไม่ได้เรียงลำดับซึ่งอนุญาตให้มีการทำสำเนาเป็นกระเป๋าและไม่อนุญาตให้มีการทำซ้ำเป็นชุด


ชุดไม่สามารถมีข้อมูลซ้ำได้
karim79

มีการสั่งการใช้งานชุดบางอย่าง (เช่น LinkedHashSet ซึ่งดูแลรักษา LinkedList ไว้เบื้องหลัง) แต่ Set ADT ไม่มีการสั่งซื้อ
Michael Myers

10

รายการ

  1. เป็นการจัดกลุ่มองค์ประกอบ
  2. รายการใช้เพื่อรวบรวมองค์ประกอบที่มีรายการซ้ำ
  3. มีการกำหนดวิธีการใหม่ภายในรายการส่วนติดต่อ

ชุด

  1. เป็นการจัดกลุ่มองค์ประกอบที่ไม่มีการเรียงลำดับ
  2. ชุดจะใช้ในการรวบรวมองค์ประกอบโดยไม่ซ้ำกัน
  3. ไม่มีการกำหนดวิธีการใหม่ภายในการตั้งค่าอินเทอร์เฟซดังนั้นเราจึงต้องใช้วิธีการอินเทอร์เฟซแบบคอลเลกชันกับชุดย่อยของการตั้งค่าเท่านั้น

10

รายการ:

Listโดยทั่วไปอนุญาตวัตถุที่ซ้ำกัน Listจะต้องสั่งซื้อและสามารถเข้าถึงได้โดยดัชนี

การเรียนการดำเนินงานรวมถึง: ArrayList, LinkedList,Vector

ตั้ง:

Sets ไม่อนุญาตวัตถุที่ซ้ำกัน การนำไปใช้งานส่วนใหญ่นั้นไม่ได้เรียงลำดับ แต่เป็นการใช้งานเฉพาะ

คลาสการนำไปใช้งานประกอบด้วย: HashSet(ไม่เรียงลำดับ), (เรียงลำดับ), LinkedHashSet(เรียง TreeSetลำดับตามธรรมชาติหรือโดยตัวเปรียบเทียบที่ให้มา)


7

ขณะที่เรากำลังพูดถึงอินเตอร์เฟส Java ทำไมไม่ลองดู Javadoc?!

  • A Listคือคอลเล็กชันที่เรียงลำดับแล้ว (ตามลำดับ) ซึ่งโดยทั่วไปจะอนุญาตการทำซ้ำ
  • A Setคือคอลเล็กชันที่ไม่มีองค์ประกอบที่ซ้ำกันคำสั่งการวนซ้ำอาจรับประกันได้โดยการใช้งาน

ไม่มีการเอ่ยถึงเกี่ยวกับการขาดคำสั่งเกี่ยวกับชุด: มันขึ้นอยู่กับการใช้งาน


2
แก้ไข. LinkedHashSet มีองค์ประกอบตามลำดับการแทรก
ggb667

มันเป็นส่วนต่อประสานทุกอย่างขึ้นอยู่กับการนำไปใช้ List.get () สามารถสร้างไฟล์ที่มีทศนิยม 5 อันดับแรกของ pi และโยน StackOverFlowException ในการใช้งานบางอย่างซึ่งไม่ได้หมายความว่าคุณสามารถพูดว่า "รายการเป็นสิ่งที่สามารถสร้างไฟล์ได้" เนื่องจากไม่ใช่ส่วนหนึ่งของ สัญญาที่กำหนดโดยส่วนต่อประสาน ชุดการอ้างสิทธิ์เอกสารนั้นเป็นแบบจำลองตามแนวคิดทางคณิตศาสตร์ของชุดซึ่งตามคำจำกัดความจะไม่ได้รับคำสั่ง รับชุดในรหัสของคุณคุณไม่สามารถสันนิษฐานได้ว่ามีการสั่งซื้อโดยไม่ละเมิดหลักการของ SOLID
ร่า

@ ไก่ฉันมักจะLinkedHashSetอยู่ทางด้านซ้ายมือหากรหัสนั้นขึ้นอยู่กับการสั่งซื้อในภายหลัง ฉันจะใช้Setก็ต่อเมื่อฉันใช้มันอย่างเดียวเพราะคุณไม่สามารถสันนิษฐานได้ว่าการติดตั้งพื้นฐานLinkedHashSetนั้นอาจจะเป็นวันนี้ แต่พรุ่งนี้รหัสก็จะเปลี่ยนและมันจะล้มเหลว
Christophe Roussy

หากคุณประกาศ LinkedHashSet คุณไม่ได้จัดการกับ Set ดังนั้นการอ้างสิทธิ์ว่าชุดควรทำงานอย่างไรมีความเกี่ยวข้องน้อยมาก ฉันบอกว่าความเป็นระเบียบ (เป็นไปได้) ในการตั้งค่าตามการติดตั้งใช้งานบางอย่างคล้ายกับว่า "อินสแตนซ์ของ Runnable มีวิธีการรันที่จะรันบนเธรดบางตัวนอกจากนี้พวกเขาเปิดการเชื่อมต่อฐานข้อมูลและอ่านข้อมูลลูกค้า " แน่นอนว่าการใช้งานบางอย่างอาจทำเช่นนั้น แต่นั่นไม่ใช่สิ่งที่ส่อให้เห็นโดยอินเตอร์เฟสที่เรียกใช้
sara

5

นี่อาจไม่ใช่คำตอบที่คุณกำลังมองหา แต่ JavaDoc ของคลาสคอลเลคชันเป็นคำอธิบายที่ค่อนข้างดี คัดลอก / วาง:

คอลเลกชันที่ได้รับคำสั่ง (หรือเรียกว่าลำดับ) ผู้ใช้ของอินเทอร์เฟซนี้มีการควบคุมที่ถูกต้องแม่นยำว่าส่วนใดของรายการที่แทรกอยู่ในรายการ ผู้ใช้สามารถเข้าถึงองค์ประกอบตามดัชนีจำนวนเต็ม (ตำแหน่งในรายการ) และค้นหาองค์ประกอบในรายการ

ปกติแล้วรายการจะอนุญาตให้มีองค์ประกอบที่ซ้ำกัน โดยปกติแล้วรายการจะอนุญาตให้มีคู่ขององค์ประกอบ e1 และ e2 เช่นนั้น e1.equals (e2) และพวกเขามักจะอนุญาตให้มีองค์ประกอบที่เป็นโมฆะหลายรายการหากพวกเขาอนุญาตให้องค์ประกอบที่เป็นโมฆะทั้งหมด ไม่น่าเป็นไปได้ที่บางคนอาจต้องการใช้รายการที่ห้ามซ้ำโดยโยนข้อยกเว้นรันไทม์เมื่อผู้ใช้พยายามแทรกพวกเขา แต่เราคาดว่าการใช้นี้จะหายาก


5

ชุดคือกลุ่มที่ไม่ได้เรียงลำดับของวัตถุที่แตกต่าง - ไม่อนุญาตให้มีวัตถุที่ซ้ำกัน โดยทั่วไปแล้วจะใช้งานโดยใช้รหัสแฮชของวัตถุที่ถูกแทรก (การใช้งานเฉพาะอาจเพิ่มการสั่งซื้อ แต่ตัวตั้งค่าอินเทอร์เฟซเองไม่ได้)

รายการคือกลุ่มวัตถุที่เรียงลำดับซึ่งอาจมีรายการที่ซ้ำกัน มันอาจจะนำมาใช้กับArrayList, LinkedListฯลฯ


1
ฉันสับสน😕! สิ่งที่สั่ง / ไม่ได้เรียงหมายถึงอะไรในบริบทนี้ มันเกี่ยวข้องกับการเรียงลำดับจากน้อยไปมากและมากไปหาน้อย? หากListไม่ได้รับคำสั่ง ordered
malhobayyeb

4
เรียงลำดับคือเมื่อข้อมูลอินพุตถูกจัดเรียงอย่างถูกต้องเหมือนกับอินพุตโดยผู้ใช้ขณะที่เรียงลำดับคือเมื่อข้อมูลอินพุตถูกเรียงลำดับพจนานุกรมหรือเรียงลำดับจากน้อยไปมาก / มากไปหาน้อย (ในแง่ของค่าจำนวนเต็ม) ไม่ได้เรียงลำดับหมายความว่าข้อมูลที่ป้อนเข้าอาจหรืออาจไม่ได้รับการจัดเก็บตามลำดับที่ผู้ใช้ป้อน
Akhil

5

รายการ:
รายการอนุญาตให้ใช้องค์ประกอบที่ซ้ำกันและค่า Null ง่ายต่อการค้นหาโดยใช้ดัชนีที่สอดคล้องกันขององค์ประกอบและยังจะแสดงองค์ประกอบตามลำดับการแทรก ตัวอย่าง: (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);
    }
 }

}

เอาท์พุท:

1
1
555
333
888
555
null ค่า
null
: 1
ค่า: 555
ค่า: 333
ค่า: 888
ค่า: 555
ค่า: null
ค่า: null

ชุด:
ชุดไม่อนุญาตให้องค์ประกอบที่ซ้ำกันใด ๆ และจะอนุญาตให้มีค่า Null เดียวมันจะไม่รักษาคำสั่งใด ๆ ที่จะแสดงองค์ประกอบเฉพาะTreeSetจะแสดงในลำดับที่น้อยไปมาก

ตัวอย่าง: (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");
    }

 }

}

เอาท์พุท:

ทุก
ทักทาย
ต้อนรับ
โลก
java.lang.NullPointerException
ชุดไม่อนุญาตให้มีค่า Null และความคุ้มค่าที่ซ้ำกัน


3

1.List ช่วยให้ค่าที่ซ้ำกันและชุดไม่อนุญาตให้ซ้ำกัน

2.List เก็บรักษาลำดับที่คุณแทรกอิลิเมนต์ในรายการ Set ไม่รักษาลำดับ 3.List เป็นลำดับขององค์ประกอบในขณะที่ Set เป็นรายการที่แตกต่างกันขององค์ประกอบที่ไม่ได้เรียงลำดับ


3

รายการชุด Vs

1) ชุดไม่อนุญาตให้ทำซ้ำ รายการอนุญาตการทำซ้ำ ขึ้นอยู่กับการใช้งานของชุดมันยังรักษาคำสั่งแทรก

LinkedHashSetเช่น: มันยังคงคำสั่งแทรกโปรดดูคลิกที่นี่

2) มีวิธีการ โดยธรรมชาติของชุดมันจะให้ประสิทธิภาพที่ดีกว่าในการเข้าถึง กรณีที่ดีที่สุดคือ o (1) containsแต่รายการที่มีปัญหาเกี่ยวกับประสิทธิภาพในการเรียก


2

ทั้งหมดของListการเรียนการรักษาความสงบเรียบร้อยของการแทรก พวกเขาใช้การใช้งานที่แตกต่างกันขึ้นอยู่กับประสิทธิภาพและลักษณะอื่น ๆ (เช่นArrayListสำหรับความเร็วในการเข้าถึงของดัชนีที่เฉพาะเจาะจงLinkedListสำหรับเพียงเพื่อรักษาลำดับ) เนื่องจากไม่มีคีย์จึงอนุญาตให้มีการทำซ้ำได้

Setเรียนไม่รักษาความสงบเรียบร้อยการแทรก พวกเขาอาจเลือกที่จะกำหนดคำสั่งที่เฉพาะเจาะจง (เช่นเดียวกับSortedSet) แต่โดยทั่วไปจะมีคำสั่งที่กำหนดใช้งานขึ้นอยู่กับฟังก์ชั่นแฮบาง (เช่นเดียวกับHashSet) เนื่องจากSetคีย์ถูกเข้าถึงโดยคีย์จึงไม่อนุญาตให้มีรายการซ้ำ


แผนที่จัดเก็บวัตถุตามคีย์ แต่ตั้งค่าวัตถุเก็บโดยใช้ค่าเฉพาะที่เกี่ยวข้องกับวัตถุซึ่งมักจะเป็นรหัสแฮช (แผนที่นอกจากนี้ยังอาจใช้รหัสกัญชาเพื่อตรวจสอบความเป็นเอกลักษณ์ที่สำคัญ แต่พวกเขาไม่จำเป็นต้อง.)
ควินน์เทย์เลอร์

1

การสั่งซื้อ ... รายการมีคำสั่งชุดหนึ่งไม่มี


2
Set ADT ไม่ได้ระบุการสั่งซื้อ แต่การติดตั้งใช้งานบางอย่าง (เช่น LinkedHashSet) จะรักษาลำดับการแทรก
Michael Myers

3
อย่างไรก็ตามความแตกต่างที่สำคัญยิ่งกว่าคือชุดไม่อนุญาตให้ทำซ้ำ กระเป๋า / มัลติเซ็ตทำ
Quinn Taylor

TreeSet มีการสั่งซื้อ
stackoverflowuser2010

1

ความแตกต่างที่ควรทราบระหว่างรายการกับชุดใน Java มีดังนี้

1)ความแตกต่างพื้นฐานระหว่างรายการและชุดใน Java ช่วยให้องค์ประกอบที่ซ้ำกัน รายการใน Java อนุญาตการทำซ้ำขณะที่ Set ไม่อนุญาตการทำซ้ำ หากคุณแทรกที่ซ้ำกันในการตั้งค่ามันจะแทนที่ค่าที่เก่ากว่า การนำไปใช้งานของชุดใน Java จะมีองค์ประกอบที่ไม่ซ้ำกันเท่านั้น

2)ความแตกต่างที่สำคัญระหว่างรายการและชุดใน Java คือการสั่งซื้อ รายการคือชุดสะสมที่ได้รับคำสั่งขณะที่ชุดเป็นชุดสะสมที่ไม่มีการเรียงลำดับ รายการรักษาลำดับการแทรกขององค์ประกอบหมายถึงองค์ประกอบใด ๆ ที่ถูกแทรกไว้ก่อนหน้านี้จะไปยังดัชนีที่ต่ำกว่าองค์ประกอบใด ๆ ที่ถูกแทรกหลังจาก ตั้งค่าใน Java ไม่ได้ดูแลคำสั่งใด ๆ แม้ว่า Set จะเป็นอีกทางเลือกหนึ่งที่เรียกว่า SortedSet ซึ่งสามารถเก็บองค์ประกอบของการเรียงตามลำดับที่กำหนดโดยวิธี Comparable และ Comparator ของ Objects ที่เก็บไว้ใน Set

3)การติดตั้ง List List ยอดนิยมใน Java ได้แก่ ArrayList, Vector และ LinkedList ในขณะที่การใช้งานอินเทอร์เฟซ Set เป็นที่นิยม ได้แก่ HashSet, TreeSet และ LinkedHashSet

มันค่อนข้างชัดเจนว่าถ้าคุณต้องการรักษาลำดับการแทรกหรือวัตถุและคอลเลกชันของคุณสามารถมีรายการที่ซ้ำกันกว่ารายการเป็นวิธีที่จะไป ในทางตรงกันข้ามถ้าความต้องการของคุณคือการรักษาคอลเลกชันที่ไม่ซ้ำกันโดยไม่ซ้ำกันกว่าชุดเป็นวิธีที่จะไป


สวัสดี @Vibha ถ้าฉันต้องการทั้งสองเงื่อนไข? ฉันหมายความว่าฉันไม่ต้องการให้ข้อมูลของฉันมีข้อมูลซ้ำซ้อนและฉันก็ต้องการให้มีการสั่งซื้อ
Panadol Chong

1

รายการ:

  1. อนุญาตการทำซ้ำ
  2. สั่งซื้อในองค์ประกอบการจัดกลุ่ม (ในคำอื่น ๆ ที่มีลำดับที่แน่นอนไม่จำเป็นต้องเรียงลำดับจากน้อยไปมาก)

ตั้ง:

  1. ไม่อนุญาตให้ซ้ำซ้อน
  2. ไม่มีการเรียงลำดับในองค์ประกอบการจัดกลุ่ม (ในคำอื่น ๆ ที่ไม่มีคำสั่งที่แน่นอนมันอาจหรืออาจไม่เรียงตามลำดับจากน้อยไปหามาก)

0

Set<E>และมีทั้งที่ใช้ในการเก็บองค์ประกอบของประเภทList<E> Eความแตกต่างคือSetถูกเก็บไว้ในแบบไม่เรียงลำดับและไม่อนุญาตให้ใช้ค่าซ้ำกัน Listใช้ในการจัดเก็บองค์ประกอบในวิธีการสั่งซื้อและอนุญาตให้มีค่าซ้ำกัน

Setองค์ประกอบไม่สามารถเข้าถึงได้โดยตำแหน่งดัชนีและListองค์ประกอบสามารถเข้าถึงได้ด้วยตำแหน่งดัชนี


1
@BalusC โปรดอย่าแสดงความคิดเห็นโดยไม่เห็นวันที่โพสต์ ดูโพสต์ที่คุ้มค่าในเวลานั้น
Yash

0

สวัสดีมีคำตอบมากมายให้แล้ว .. ขอให้ฉันชี้บางประเด็นที่ยังไม่ได้กล่าวถึง:

  • การใช้งานรายการส่วนใหญ่ (ArrayList, Vector) ใช้งานRandomAccessอินเทอร์เฟซซึ่งเป็นตัวทำเครื่องหมายสำหรับการเข้าถึงที่รวดเร็วขึ้น ไม่มีการใช้ชุดทำ
  • ใช้รายการหนึ่ง Iterator พิเศษที่เรียกว่าซึ่งสนับสนุนการทำซ้ำในทั้งสองทิศทางListIterator Set ใช้ Iterator ซึ่งรองรับการวนซ้ำเพียงทางเดียวเท่านั้น
  • HashSet ใช้หน่วยความจำมากกว่า5.5 เท่าของ ArrayList สำหรับเก็บองค์ประกอบจำนวนเดียวกัน

@smurti นี่มันช้าไปหน่อยและไม่แน่ใจว่าคุณได้จดบันทึกไว้หรือไม่ แต่จุดแรกของคุณขัดแย้งกับตัวเอง: "การใช้งานส่วนใหญ่ของรายการ (ArrayList, Vector) ใช้ RandomAccess ... " และ "... ไม่มีรายการ การติดตั้งใช้งานทำอย่างนั้น "
Peter M

0

ความแตกต่างที่ใหญ่ที่สุดคือแนวคิดพื้นฐาน

จากอินเตอร์เฟสSet and List เซตเป็นแนวคิดทางคณิตศาสตร์ วิธีการตั้งค่าขยายคอลเลกชันไม่ว่าจะเพิ่มวิธีการใหม่ ขนาด () หมายถึง cardinality (มากขึ้นคือBitSet.cardinality, ตัวนับลิเนียร์, ล็อกบันทึก, HyperLogLog ) addAll () หมายถึงสหภาพ maintainAll () หมายถึงทางแยก removeAll () หมายถึงความแตกต่าง

อย่างไรก็ตาม รายการขาดแนวคิดเหล่านี้ รายการเพิ่มวิธีการจำนวนมากเพื่อสนับสนุนแนวคิดลำดับซึ่งส่วนติดต่อการรวบรวมไม่จัดหา แนวคิดหลักคือINDEX เช่นเพิ่ม (ดัชนีองค์ประกอบ), รับ (ดัชนี), ค้นหา (indexOf ()), ลบ (ดัชนี) องค์ประกอบ รายการนอกจากนี้ยังมี " คอลเลกชันดู " รายการย่อย ชุดไม่มีมุมมอง ไม่สามารถเข้าถึงตำแหน่งได้ รายการยังมีอัลกอริทึมจำนวนมากในคลาสCollections เรียงลำดับ (รายชื่อ) binarySearch (รายชื่อ) ย้อนกลับ (รายชื่อ) สับเปลี่ยน (รายชื่อ) เติม (รายชื่อ) params วิธีการคือรายการอินเตอร์เฟซ องค์ประกอบที่ซ้ำกันเป็นเพียงผลลัพธ์ของแนวคิด ไม่ใช่ความแตกต่างที่สำคัญ

ดังนั้นความแตกต่างที่สำคัญคือแนวคิด เซตเป็นชุดแนวคิดคณิตศาสตร์ รายการคือแนวคิดลำดับ


-1

นี่คือตัวอย่างที่ชัดเจนกับ Groovy ฉันสร้างชุดและรายการ จากนั้นฉันพยายามเก็บ 20 ค่าที่สร้างแบบสุ่มภายในแต่ละรายการ ค่าที่สร้างขึ้นสามารถอยู่ในช่วง 0 ถึง 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

ผลลัพธ์ :

ตัวเลขสุ่ม: 4, 1, 4, 0, 1, 2, 4, 0, 0, 3, 4, 3, 2, 0, 4, 0, 1, 3, 1, 3

ชุด: [4, 1, 0, 2, 3]

รายการ: [4, 1, 4, 0, 1, 2, 4, 0, 0, 3, 4, 3, 2, 0, 4, 0, 1, 3, 1, 3]

คุณจะเห็นว่าความแตกต่างคือ:

  • ชุดไม่อนุญาตให้มีค่าซ้ำกัน
  • รายการอนุญาตค่าที่ซ้ำกัน

1
รายการยังรักษาการสั่งซื้อ
glen3b

-1

เช่นเดียวกับคำตอบเนื่องจาก SET ไม่มีค่าซ้ำซ้อนและ List สามารถ แน่นอนการสั่งซื้อเป็นอีกสิ่งหนึ่งที่ทำให้พวกเขาแตกต่าง


-1

ชุด: ชุดไม่สามารถมีองค์ประกอบที่ซ้ำกันในคอลเลกชันของมัน มันเป็นคอลเล็กชั่นที่ไม่ได้เรียงลำดับ ในการเข้าถึงข้อมูลจาก Set จำเป็นต้องใช้ Iterator เท่านั้นและไม่สามารถดึงข้อมูลจากดัชนีได้ ส่วนใหญ่จะใช้เมื่อใดก็ตามที่จำเป็นต้องมีการเก็บรวบรวมเอกลักษณ์

รายการ: รายการสามารถมีองค์ประกอบที่ซ้ำกันโดยมีการเรียงลำดับตามธรรมชาติ ดังนั้นจึงสามารถดึงข้อมูลตามดัชนีหรือตัววนซ้ำ มีการใช้กันอย่างแพร่หลายในการจัดเก็บคอลเลกชันที่ต้องเข้าถึงตามดัชนี


-2

ชื่อ TOPIC: List VS Set

ฉันเพิ่งผ่านหัวข้อที่สำคัญที่สุดของ Java ที่ชื่อว่า Collections Framework ฉันคิดว่าจะแบ่งปันความรู้เล็กน้อยเกี่ยวกับ Collections กับคุณ รายการ, ชุด, แผนที่เป็นหัวข้อที่สำคัญที่สุดของมัน ดังนั้นเริ่มต้นด้วยรายการและชุด

ความแตกต่างระหว่างรายการและชุด:

  1. List เป็นคลาสคอลเลกชันที่ขยายAbstractListคลาสโดยที่ Set เป็นคลาสคอลเลกชันที่ขยายAbstractSetคลาส แต่ทั้งสองใช้ส่วนติดต่อคอลเลกชัน

  2. รายการส่วนต่อประสานอนุญาตให้มีค่าที่ซ้ำกัน (องค์ประกอบ) ในขณะที่ชุดส่วนต่อประสานไม่อนุญาตให้มีค่าซ้ำกัน ในกรณีขององค์ประกอบที่ซ้ำกันในชุดมันจะแทนที่ค่าที่เก่ากว่า

  3. รายการส่วนต่อประสานอนุญาตให้ค่า NULL โดยที่เป็นชุดอินเตอร์เฟสไม่อนุญาตให้ใช้ค่า Null ในกรณีของการใช้ค่า Null NullPointerExceptionในชุดมันจะช่วยให้

  4. รายการอินเตอร์เฟสคงลำดับการแทรก นั่นหมายถึงวิธีที่เราเพิ่มองค์ประกอบในรายการในลักษณะเดียวกับที่เราได้รับมันโดยใช้ตัววนซ้ำหรือสำหรับแต่ละสไตล์ ในขณะที่Setการใช้งานไม่จำเป็นต้องรักษาลำดับการแทรก (แม้ว่าSortedSetจะใช้TreeSetและLinkedHashSetเก็บรักษาลำดับการแทรก)

  5. รายการส่วนต่อประสานมีวิธีการของตนเองที่กำหนดไว้ในขณะที่ชุดส่วนต่อประสานไม่มีวิธีของตัวเองดังนั้นชุดใช้วิธีการรวบรวมส่วนติดต่อเท่านั้น

  6. รายการอินเตอร์เฟสมีคลาสดั้งเดิมหนึ่งคลาสที่เรียกว่าVectorขณะที่ชุดอินเตอร์เฟสไม่มีคลาสดั้งเดิม

  7. สุดท้าย แต่ไม่ใช่อย่างน้อย ... listIterator()วิธีนี้สามารถใช้เพื่อวนรอบองค์ประกอบภายใน List Classes เท่านั้นในขณะที่เราสามารถใช้ iterator () วิธีการเข้าถึง Set elements elements

เราสามารถเพิ่มอะไรอีกบ้าง โปรดแจ้งให้เราทราบ

ขอบคุณ


สำหรับหนึ่งListและSetเป็นอินเทอร์เฟซที่มีการใช้งาน "ฐาน" ในรูปแบบของระดับนามธรรม (ซึ่งคุณกล่าวถึง) นอกจากนี้ # 3 ไม่ถูกต้องสมบูรณ์เนื่องจากชุดส่วนใหญ่อนุญาตให้มีค่า Null (แต่ขึ้นอยู่กับการใช้งาน) ฉันไม่เข้าใจ # 5 และ # 7 และสำหรับ # 6 Vectorไม่ใช่แบบดั้งเดิม แต่เพิ่งซิงโครไนซ์และไม่ต้องการใช้ยกเว้นเมื่อจำเป็นต้องซิงโครไนซ์
glen3b

-3

ตั้ง:

ไม่สามารถมีค่าซ้ำกันได้การสั่งซื้อขึ้นอยู่กับการนำไปใช้ โดยค่าเริ่มต้นจะไม่ได้รับคำสั่งไม่สามารถเข้าถึงได้โดยดัชนี

รายการ:

สามารถมีค่าซ้ำกันเรียงตามค่าเริ่มต้นสามารถเข้าถึงได้โดยใช้ดัชนี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.