อะไรคือความแตกต่างพื้นฐานระหว่างSet<E>
และList<E>
อินเตอร์เฟส?
อะไรคือความแตกต่างพื้นฐานระหว่างSet<E>
และList<E>
อินเตอร์เฟส?
คำตอบ:
List
เป็นลำดับที่เรียงลำดับขององค์ประกอบในขณะที่Set
เป็นรายการที่แตกต่างขององค์ประกอบที่ไม่ได้สั่ง (ขอบคุณQuinn Taylor )
คอลเลกชันที่ได้รับคำสั่ง (หรือเรียกว่าลำดับ) ผู้ใช้ของอินเทอร์เฟซนี้มีการควบคุมที่ถูกต้องแม่นยำว่าส่วนใดของรายการที่แทรกอยู่ในรายการ ผู้ใช้สามารถเข้าถึงองค์ประกอบตามดัชนีจำนวนเต็ม (ตำแหน่งในรายการ) และค้นหาองค์ประกอบในรายการ
คอลเล็กชันที่ไม่มีองค์ประกอบที่ซ้ำกัน อย่างเป็นทางการยิ่งขึ้นชุดไม่มีองค์ประกอบของคู่ e1 และ e2 เช่นนั้น e1.equals (e2) และองค์ประกอบโมฆะหนึ่งรายการ ตามนัยโดยชื่อของมันอินเตอร์เฟสนี้จำลองโมเดลนามธรรมทางคณิตศาสตร์
╔═══════════════════╦══════════════════════╦═════════════════════════════╗
║ ║ List ║ Set ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║ Duplicates ║ YES ║ NO ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║ Order ║ ORDERED ║ DEPENDS ON IMPLEMENTATION ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║ Positional Access ║ YES ║ NO ║
╚═══════════════════╩══════════════════════╩═════════════════════════════╝
รายการสั่งซื้อองค์ประกอบ (ไม่ซ้ำกันหรือไม่)
สอดคล้องกับอินเทอร์เฟซของ Java ชื่อList
สามารถเข้าถึงได้โดยดัชนี
การใช้งานที่ไม่สมบูรณ์
รายการขององค์ประกอบที่ไม่ซ้ำกัน:
สอดคล้องกับอินเตอร์เฟซของ Java ชื่อSet
อาจไม่สามารถเข้าถึงได้โดยดัชนี
การใช้งานที่ไม่สมบูรณ์
ทั้งอินเตอร์เฟสSet
และList
สอดคล้องกับอินเตอร์เฟสของ Java ที่ชื่อCollection
ชุดไม่สามารถมีองค์ประกอบที่ซ้ำกันในขณะที่รายการสามารถ รายการ (ใน Java) ยังหมายถึงการสั่งซื้อ
โดยทั่วไปเรามักจะอ้างถึงกลุ่มที่ไม่ได้เรียงลำดับซึ่งอนุญาตให้มีการทำสำเนาเป็นกระเป๋าและไม่อนุญาตให้มีการทำซ้ำเป็นชุด
รายการ
ชุด
List
โดยทั่วไปอนุญาตวัตถุที่ซ้ำกัน
List
จะต้องสั่งซื้อและสามารถเข้าถึงได้โดยดัชนี
การเรียนการดำเนินงานรวมถึง: ArrayList
, LinkedList
,Vector
Set
s ไม่อนุญาตวัตถุที่ซ้ำกัน การนำไปใช้งานส่วนใหญ่นั้นไม่ได้เรียงลำดับ แต่เป็นการใช้งานเฉพาะ
คลาสการนำไปใช้งานประกอบด้วย:
HashSet
(ไม่เรียงลำดับ), (เรียงลำดับ),
LinkedHashSet
(เรียง
TreeSet
ลำดับตามธรรมชาติหรือโดยตัวเปรียบเทียบที่ให้มา)
ขณะที่เรากำลังพูดถึงอินเตอร์เฟส Java ทำไมไม่ลองดู Javadoc?!
List
คือคอลเล็กชันที่เรียงลำดับแล้ว (ตามลำดับ) ซึ่งโดยทั่วไปจะอนุญาตการทำซ้ำSet
คือคอลเล็กชันที่ไม่มีองค์ประกอบที่ซ้ำกันคำสั่งการวนซ้ำอาจรับประกันได้โดยการใช้งานไม่มีการเอ่ยถึงเกี่ยวกับการขาดคำสั่งเกี่ยวกับชุด: มันขึ้นอยู่กับการใช้งาน
LinkedHashSet
อยู่ทางด้านซ้ายมือหากรหัสนั้นขึ้นอยู่กับการสั่งซื้อในภายหลัง ฉันจะใช้Set
ก็ต่อเมื่อฉันใช้มันอย่างเดียวเพราะคุณไม่สามารถสันนิษฐานได้ว่าการติดตั้งพื้นฐานLinkedHashSet
นั้นอาจจะเป็นวันนี้ แต่พรุ่งนี้รหัสก็จะเปลี่ยนและมันจะล้มเหลว
นี่อาจไม่ใช่คำตอบที่คุณกำลังมองหา แต่ JavaDoc ของคลาสคอลเลคชันเป็นคำอธิบายที่ค่อนข้างดี คัดลอก / วาง:
คอลเลกชันที่ได้รับคำสั่ง (หรือเรียกว่าลำดับ) ผู้ใช้ของอินเทอร์เฟซนี้มีการควบคุมที่ถูกต้องแม่นยำว่าส่วนใดของรายการที่แทรกอยู่ในรายการ ผู้ใช้สามารถเข้าถึงองค์ประกอบตามดัชนีจำนวนเต็ม (ตำแหน่งในรายการ) และค้นหาองค์ประกอบในรายการ
ปกติแล้วรายการจะอนุญาตให้มีองค์ประกอบที่ซ้ำกัน โดยปกติแล้วรายการจะอนุญาตให้มีคู่ขององค์ประกอบ e1 และ e2 เช่นนั้น e1.equals (e2) และพวกเขามักจะอนุญาตให้มีองค์ประกอบที่เป็นโมฆะหลายรายการหากพวกเขาอนุญาตให้องค์ประกอบที่เป็นโมฆะทั้งหมด ไม่น่าเป็นไปได้ที่บางคนอาจต้องการใช้รายการที่ห้ามซ้ำโดยโยนข้อยกเว้นรันไทม์เมื่อผู้ใช้พยายามแทรกพวกเขา แต่เราคาดว่าการใช้นี้จะหายาก
ชุดคือกลุ่มที่ไม่ได้เรียงลำดับของวัตถุที่แตกต่าง - ไม่อนุญาตให้มีวัตถุที่ซ้ำกัน โดยทั่วไปแล้วจะใช้งานโดยใช้รหัสแฮชของวัตถุที่ถูกแทรก (การใช้งานเฉพาะอาจเพิ่มการสั่งซื้อ แต่ตัวตั้งค่าอินเทอร์เฟซเองไม่ได้)
รายการคือกลุ่มวัตถุที่เรียงลำดับซึ่งอาจมีรายการที่ซ้ำกัน มันอาจจะนำมาใช้กับArrayList
, LinkedList
ฯลฯ
List
ไม่ได้รับคำสั่ง ordered
รายการ:
รายการอนุญาตให้ใช้องค์ประกอบที่ซ้ำกันและค่า 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 และความคุ้มค่าที่ซ้ำกัน
1.List ช่วยให้ค่าที่ซ้ำกันและชุดไม่อนุญาตให้ซ้ำกัน
2.List เก็บรักษาลำดับที่คุณแทรกอิลิเมนต์ในรายการ Set ไม่รักษาลำดับ 3.List เป็นลำดับขององค์ประกอบในขณะที่ Set เป็นรายการที่แตกต่างกันขององค์ประกอบที่ไม่ได้เรียงลำดับ
รายการชุด Vs
1) ชุดไม่อนุญาตให้ทำซ้ำ รายการอนุญาตการทำซ้ำ ขึ้นอยู่กับการใช้งานของชุดมันยังรักษาคำสั่งแทรก
LinkedHashSet
เช่น: มันยังคงคำสั่งแทรกโปรดดูคลิกที่นี่
2) มีวิธีการ โดยธรรมชาติของชุดมันจะให้ประสิทธิภาพที่ดีกว่าในการเข้าถึง กรณีที่ดีที่สุดคือ o (1) contains
แต่รายการที่มีปัญหาเกี่ยวกับประสิทธิภาพในการเรียก
ทั้งหมดของList
การเรียนการรักษาความสงบเรียบร้อยของการแทรก พวกเขาใช้การใช้งานที่แตกต่างกันขึ้นอยู่กับประสิทธิภาพและลักษณะอื่น ๆ (เช่นArrayList
สำหรับความเร็วในการเข้าถึงของดัชนีที่เฉพาะเจาะจงLinkedList
สำหรับเพียงเพื่อรักษาลำดับ) เนื่องจากไม่มีคีย์จึงอนุญาตให้มีการทำซ้ำได้
Set
เรียนไม่รักษาความสงบเรียบร้อยการแทรก พวกเขาอาจเลือกที่จะกำหนดคำสั่งที่เฉพาะเจาะจง (เช่นเดียวกับSortedSet
) แต่โดยทั่วไปจะมีคำสั่งที่กำหนดใช้งานขึ้นอยู่กับฟังก์ชั่นแฮบาง (เช่นเดียวกับHashSet
) เนื่องจากSet
คีย์ถูกเข้าถึงโดยคีย์จึงไม่อนุญาตให้มีรายการซ้ำ
การสั่งซื้อ ... รายการมีคำสั่งชุดหนึ่งไม่มี
ความแตกต่างที่ควรทราบระหว่างรายการกับชุดใน 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
มันค่อนข้างชัดเจนว่าถ้าคุณต้องการรักษาลำดับการแทรกหรือวัตถุและคอลเลกชันของคุณสามารถมีรายการที่ซ้ำกันกว่ารายการเป็นวิธีที่จะไป ในทางตรงกันข้ามถ้าความต้องการของคุณคือการรักษาคอลเลกชันที่ไม่ซ้ำกันโดยไม่ซ้ำกันกว่าชุดเป็นวิธีที่จะไป
รายการ:
ตั้ง:
Set<E>
และมีทั้งที่ใช้ในการเก็บองค์ประกอบของประเภทList<E>
E
ความแตกต่างคือSet
ถูกเก็บไว้ในแบบไม่เรียงลำดับและไม่อนุญาตให้ใช้ค่าซ้ำกัน List
ใช้ในการจัดเก็บองค์ประกอบในวิธีการสั่งซื้อและอนุญาตให้มีค่าซ้ำกัน
Set
องค์ประกอบไม่สามารถเข้าถึงได้โดยตำแหน่งดัชนีและList
องค์ประกอบสามารถเข้าถึงได้ด้วยตำแหน่งดัชนี
สวัสดีมีคำตอบมากมายให้แล้ว .. ขอให้ฉันชี้บางประเด็นที่ยังไม่ได้กล่าวถึง:
RandomAccess
อินเทอร์เฟซซึ่งเป็นตัวทำเครื่องหมายสำหรับการเข้าถึงที่รวดเร็วขึ้น ไม่มีการใช้ชุดทำListIterator
Set ใช้ Iterator ซึ่งรองรับการวนซ้ำเพียงทางเดียวเท่านั้นความแตกต่างที่ใหญ่ที่สุดคือแนวคิดพื้นฐาน
จากอินเตอร์เฟสSet and List เซตเป็นแนวคิดทางคณิตศาสตร์ วิธีการตั้งค่าขยายคอลเลกชันไม่ว่าจะเพิ่มวิธีการใหม่ ขนาด () หมายถึง cardinality (มากขึ้นคือBitSet.cardinality, ตัวนับลิเนียร์, ล็อกบันทึก, HyperLogLog ) addAll () หมายถึงสหภาพ maintainAll () หมายถึงทางแยก removeAll () หมายถึงความแตกต่าง
อย่างไรก็ตาม รายการขาดแนวคิดเหล่านี้ รายการเพิ่มวิธีการจำนวนมากเพื่อสนับสนุนแนวคิดลำดับซึ่งส่วนติดต่อการรวบรวมไม่จัดหา แนวคิดหลักคือINDEX เช่นเพิ่ม (ดัชนีองค์ประกอบ), รับ (ดัชนี), ค้นหา (indexOf ()), ลบ (ดัชนี) องค์ประกอบ รายการนอกจากนี้ยังมี " คอลเลกชันดู " รายการย่อย ชุดไม่มีมุมมอง ไม่สามารถเข้าถึงตำแหน่งได้ รายการยังมีอัลกอริทึมจำนวนมากในคลาสCollections เรียงลำดับ (รายชื่อ) binarySearch (รายชื่อ) ย้อนกลับ (รายชื่อ) สับเปลี่ยน (รายชื่อ) เติม (รายชื่อ) params วิธีการคือรายการอินเตอร์เฟซ องค์ประกอบที่ซ้ำกันเป็นเพียงผลลัพธ์ของแนวคิด ไม่ใช่ความแตกต่างที่สำคัญ
ดังนั้นความแตกต่างที่สำคัญคือแนวคิด เซตเป็นชุดแนวคิดคณิตศาสตร์ รายการคือแนวคิดลำดับ
นี่คือตัวอย่างที่ชัดเจนกับ 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]
คุณจะเห็นว่าความแตกต่างคือ:
เช่นเดียวกับคำตอบเนื่องจาก SET ไม่มีค่าซ้ำซ้อนและ List สามารถ แน่นอนการสั่งซื้อเป็นอีกสิ่งหนึ่งที่ทำให้พวกเขาแตกต่าง
ชุด: ชุดไม่สามารถมีองค์ประกอบที่ซ้ำกันในคอลเลกชันของมัน มันเป็นคอลเล็กชั่นที่ไม่ได้เรียงลำดับ ในการเข้าถึงข้อมูลจาก Set จำเป็นต้องใช้ Iterator เท่านั้นและไม่สามารถดึงข้อมูลจากดัชนีได้ ส่วนใหญ่จะใช้เมื่อใดก็ตามที่จำเป็นต้องมีการเก็บรวบรวมเอกลักษณ์
รายการ: รายการสามารถมีองค์ประกอบที่ซ้ำกันโดยมีการเรียงลำดับตามธรรมชาติ ดังนั้นจึงสามารถดึงข้อมูลตามดัชนีหรือตัววนซ้ำ มีการใช้กันอย่างแพร่หลายในการจัดเก็บคอลเลกชันที่ต้องเข้าถึงตามดัชนี
ชื่อ TOPIC: List VS Set
ฉันเพิ่งผ่านหัวข้อที่สำคัญที่สุดของ Java ที่ชื่อว่า Collections Framework ฉันคิดว่าจะแบ่งปันความรู้เล็กน้อยเกี่ยวกับ Collections กับคุณ รายการ, ชุด, แผนที่เป็นหัวข้อที่สำคัญที่สุดของมัน ดังนั้นเริ่มต้นด้วยรายการและชุด
ความแตกต่างระหว่างรายการและชุด:
List เป็นคลาสคอลเลกชันที่ขยายAbstractList
คลาสโดยที่ Set เป็นคลาสคอลเลกชันที่ขยายAbstractSet
คลาส แต่ทั้งสองใช้ส่วนติดต่อคอลเลกชัน
รายการส่วนต่อประสานอนุญาตให้มีค่าที่ซ้ำกัน (องค์ประกอบ) ในขณะที่ชุดส่วนต่อประสานไม่อนุญาตให้มีค่าซ้ำกัน ในกรณีขององค์ประกอบที่ซ้ำกันในชุดมันจะแทนที่ค่าที่เก่ากว่า
รายการส่วนต่อประสานอนุญาตให้ค่า NULL โดยที่เป็นชุดอินเตอร์เฟสไม่อนุญาตให้ใช้ค่า Null ในกรณีของการใช้ค่า Null NullPointerException
ในชุดมันจะช่วยให้
รายการอินเตอร์เฟสคงลำดับการแทรก นั่นหมายถึงวิธีที่เราเพิ่มองค์ประกอบในรายการในลักษณะเดียวกับที่เราได้รับมันโดยใช้ตัววนซ้ำหรือสำหรับแต่ละสไตล์ ในขณะที่Set
การใช้งานไม่จำเป็นต้องรักษาลำดับการแทรก (แม้ว่าSortedSet
จะใช้TreeSet
และLinkedHashSet
เก็บรักษาลำดับการแทรก)
รายการส่วนต่อประสานมีวิธีการของตนเองที่กำหนดไว้ในขณะที่ชุดส่วนต่อประสานไม่มีวิธีของตัวเองดังนั้นชุดใช้วิธีการรวบรวมส่วนติดต่อเท่านั้น
รายการอินเตอร์เฟสมีคลาสดั้งเดิมหนึ่งคลาสที่เรียกว่าVector
ขณะที่ชุดอินเตอร์เฟสไม่มีคลาสดั้งเดิม
สุดท้าย แต่ไม่ใช่อย่างน้อย ... listIterator()
วิธีนี้สามารถใช้เพื่อวนรอบองค์ประกอบภายใน List Classes เท่านั้นในขณะที่เราสามารถใช้ iterator () วิธีการเข้าถึง Set elements elements
เราสามารถเพิ่มอะไรอีกบ้าง โปรดแจ้งให้เราทราบ
ขอบคุณ
List
และSet
เป็นอินเทอร์เฟซที่มีการใช้งาน "ฐาน" ในรูปแบบของระดับนามธรรม (ซึ่งคุณกล่าวถึง) นอกจากนี้ # 3 ไม่ถูกต้องสมบูรณ์เนื่องจากชุดส่วนใหญ่อนุญาตให้มีค่า Null (แต่ขึ้นอยู่กับการใช้งาน) ฉันไม่เข้าใจ # 5 และ # 7 และสำหรับ # 6 Vector
ไม่ใช่แบบดั้งเดิม แต่เพิ่งซิงโครไนซ์และไม่ต้องการใช้ยกเว้นเมื่อจำเป็นต้องซิงโครไนซ์
ตั้ง:
ไม่สามารถมีค่าซ้ำกันได้การสั่งซื้อขึ้นอยู่กับการนำไปใช้ โดยค่าเริ่มต้นจะไม่ได้รับคำสั่งไม่สามารถเข้าถึงได้โดยดัชนี
รายการ:
สามารถมีค่าซ้ำกันเรียงตามค่าเริ่มต้นสามารถเข้าถึงได้โดยใช้ดัชนี