Set<E>और List<E>इंटरफेस के बीच मूलभूत अंतर क्या है ?
Set<E>और List<E>इंटरफेस के बीच मूलभूत अंतर क्या है ?
जवाबों:
Listतत्वों का एक क्रमबद्ध क्रम है, जो तत्वों Setकी एक अलग सूची है जो कि अनियंत्रित है (धन्यवाद, क्विन टेलर )।
एक आदेशित संग्रह (जिसे एक अनुक्रम के रूप में भी जाना जाता है)। इस इंटरफ़ेस के उपयोगकर्ता का सटीक नियंत्रण है कि सूची में प्रत्येक तत्व कहां डाला गया है। उपयोगकर्ता अपने पूर्णांक सूचकांक (सूची में स्थिति) द्वारा तत्वों तक पहुंच सकता है, और सूची में तत्वों की खोज कर सकता है।
एक संग्रह जिसमें कोई डुप्लिकेट तत्व नहीं हैं। अधिक औपचारिक रूप से, सेटों में e1 और e2 तत्वों की कोई जोड़ी नहीं होती है जैसे कि e1.equals (e2), और अधिकांश एक शून्य तत्व पर। जैसा कि इसके नाम से निहित है, यह इंटरफेस गणितीय सेट अमूर्त मॉडल है।
╔═══════════════════╦══════════════════════╦═════════════════════════════╗
║ ║ List ║ Set ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║ Duplicates ║ YES ║ NO ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║ Order ║ ORDERED ║ DEPENDS ON IMPLEMENTATION ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║ Positional Access ║ YES ║ NO ║
╚═══════════════════╩══════════════════════╩═════════════════════════════╝
एलिमेंट के एलिमेंट (यूनिक या नॉट ) कन्सट्रक्स्ड लिस्ट
को जावा के इंटरफेस नाम दिया गया हैList
इंडेक्स द्वारा एक्सेस किया जा सकता है
का उपयोग करते हुए नकल की
अद्वितीय तत्वों की सूची:
जावा के इंटरफ़ेस के अनुरूप जिसका नामSet
कैन नहीं है सूचकांक द्वारा पहुँचा जा
का उपयोग करते हुए नकल की
जावा के इंटरफेस नाम के इंटरफेस Setऔर Listअनुरूप दोनोंCollection
वैचारिक रूप से हम आम तौर पर एक अनआर्गेनाइज्ड ग्रुपिंग को संदर्भित करते हैं जो डुप्लिकेट को एक बैग के रूप में अनुमति देता है और डुप्लिकेट को सेट नहीं होने देता है।
सूची
सेट
Listआमतौर पर नकली वस्तुओं की अनुमति देते हैं।
Lists का आदेश दिया जाना चाहिए, और इसलिए सूचकांक द्वारा सुलभ हैं।
कार्यान्वयन वर्गों में शामिल हैं: ArrayList, LinkedList,Vector
Sets नहीं डुप्लिकेट ऑब्जेक्ट्स की अनुमति दें। अधिकांश कार्यान्वयन अनियंत्रित हैं, लेकिन यह कार्यान्वयन विशिष्ट है।
कार्यान्वयन वर्गों में शामिल हैं:
HashSet(अव्यवस्थित),
LinkedHashSet(आदेशित),
TreeSet(प्राकृतिक क्रम द्वारा या तुलनित्र द्वारा प्रदान किया गया)
जैसा कि हम जावा इंटरफेस के बारे में बात कर रहे हैं, जावदोक को क्यों नहीं देखा जा सकता है।
Listएक ऑर्डर किया हुआ संग्रह (अनुक्रम) है, जो आमतौर पर डुप्लिकेट की अनुमति देता हैSetऐसा संग्रह है जिसमें कोई डुप्लिकेट तत्व नहीं हैं, कार्यान्वयन के लिए पुनरावृत्ति आदेश की गारंटी दी जा सकती हैसेट से संबंधित आदेश की कमी के बारे में कोई उल्लेख नहीं है: यह कार्यान्वयन पर निर्भर करता है।
LinkedHashSetपर बाईं ओर रखता हूं यदि कोड बाद में आदेश पर निर्भर करता है। मैं केवल इसका उपयोग करता Setहूं अगर मैं वास्तव में इसे एक की तरह उपयोग करता हूं, जैसा कि आप यह नहीं मान सकते हैं कि अंतर्निहित कार्यान्वयन एक है LinkedHashSetया ऐसा है, यह आज हो सकता है, लेकिन कल कोड बदलता है और यह विफल हो जाएगा।
यह वह उत्तर नहीं हो सकता है जिसकी आप तलाश कर रहे हैं, लेकिन संग्रह कक्षाओं का JavaDoc वास्तव में बहुत वर्णनात्मक है। कॉपी / पेस्ट किया:
एक आदेशित संग्रह (जिसे एक अनुक्रम के रूप में भी जाना जाता है)। इस इंटरफ़ेस के उपयोगकर्ता का सटीक नियंत्रण है कि सूची में प्रत्येक तत्व कहां डाला गया है। उपयोगकर्ता अपने पूर्णांक सूचकांक (सूची में स्थिति) द्वारा तत्वों तक पहुंच सकता है, और सूची में तत्वों की खोज कर सकता है।
सेट के विपरीत, सूचियाँ आमतौर पर डुप्लिकेट तत्वों की अनुमति देती हैं। औपचारिक रूप से, सूचियां आमतौर पर तत्वों के जोड़े को e1 और e2 की अनुमति देती हैं जैसे कि e1.equals (e2), और वे आमतौर पर कई अशक्त तत्वों को अनुमति देते हैं यदि वे सभी शून्य तत्वों की अनुमति देते हैं। यह समझ से बाहर नहीं है कि कोई व्यक्ति ऐसी सूची को लागू करने की इच्छा कर सकता है जो डुप्लिकेट को प्रतिबंधित करती है, जब उपयोगकर्ता उन्हें डालने का प्रयास करता है, तो रनटाइम अपवाद को फेंकने से, लेकिन हम इस उपयोग के दुर्लभ होने की उम्मीद करते हैं।
एक सेट अलग-अलग वस्तुओं का एक अनियंत्रित समूह है - कोई डुप्लिकेट ऑब्जेक्ट की अनुमति नहीं है। यह आम तौर पर सम्मिलित की जा रही वस्तुओं के हैश कोड का उपयोग करके लागू किया जाता है। (विशिष्ट कार्यान्वयन आदेश जोड़ सकते हैं, लेकिन सेट इंटरफ़ेस स्वयं नहीं करता है।)
एक सूची वस्तुओं का एक आदेशित समूह है जिसमें डुप्लिकेट हो सकते हैं। यह एक साथ लागू किया जा सकता है ArrayList, LinkedListआदि
Listso
सूची:
सूची नकली तत्वों और अशक्त मूल्यों की अनुमति देता है। तत्वों के संबंधित सूचकांक का उपयोग करके खोज करना आसान है और यह सम्मिलन क्रम में तत्वों को भी प्रदर्शित करेगा। उदाहरण: (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
अशक्त
शून्य
मान: 1
मूल्य: 555
मूल्य: 333
मूल्य: 888
मूल्य: 555
मूल्य: अशक्त
मूल्य: अशक्त
सेट:
सेट किसी भी नकली तत्वों की अनुमति नहीं है और यह एकल अशक्त मूल्य की अनुमति देता है। यह तत्वों को प्रदर्शित करने के लिए किसी भी आदेश को बनाए नहीं रखेगा। केवल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
सेट शून्य मान और डुप्लिकेट मान की अनुमति नहीं देता है
सूची बनाम सेट
1) सेट डुप्लिकेट की अनुमति नहीं देता है। सूची डुप्लिकेट की अनुमति देता है। सेट के कार्यान्वयन के आधार पर, यह सम्मिलन आदेश को भी बनाए रखता है।
उदाहरण के लिए: LinkedHashSet। यह प्रविष्टि क्रम को बनाए रखता है। कृपया देखें कृपया यहाँ क्लिक करें
2) विधि शामिल है। सेट की प्रकृति से यह उपयोग करने के लिए बेहतर प्रदर्शन देगा। सबसे अच्छा मामला इसका ओ (1)। लेकिन सूची को लागू करने के लिए प्रदर्शन मुद्दा है contains।
सभी Listवर्ग सम्मिलन के क्रम को बनाए रखते हैं। वे प्रदर्शन और अन्य विशेषताओं के आधार पर अलग-अलग कार्यान्वयन का उपयोग करते हैं (उदाहरण के ArrayListलिए एक विशिष्ट सूचकांक की पहुंच की गति के लिए,)LinkedList लिए बस आदेश बनाए रखने के लिए)। चूंकि कोई कुंजी नहीं है, इसलिए डुप्लिकेट की अनुमति है।
Setकक्षाएं प्रविष्टि व्यवस्था बनाए रखने नहीं है। वे वैकल्पिक रूप से एक विशिष्ट आदेश (जैसे के साथ SortedSet) लागू कर सकते हैं , लेकिन आमतौर पर कुछ हैश फ़ंक्शन (जैसा कि HashSet) के आधार पर एक कार्यान्वयन-परिभाषित आदेश होता है । चूँकि Sets कुंजी द्वारा एक्सेस किया गया है, डुप्लिकेट को अनुमति नहीं है।
आदेश देना ... एक सूची में एक आदेश है, एक सेट नहीं है।
जावा में सूची और सेट के बीच के कुछ योग्य अंतर निम्नानुसार दिए गए हैं:
1) Java में List और Set के बीच मूलभूत अंतर डुप्लिकेट तत्वों की अनुमति देता है। जावा में सूची डुप्लिकेट की अनुमति देता है जबकि सेट किसी भी डुप्लिकेट की अनुमति नहीं देता है। यदि आप सेट में डुप्लिकेट सम्मिलित करते हैं तो यह पुराने मूल्य को बदल देगा। जावा में सेट के किसी भी कार्यान्वयन में केवल अनन्य तत्व शामिल होंगे।
2) जावा में लिस्ट और सेट के बीच एक और महत्वपूर्ण अंतर ऑर्डर है। सूची क्रमबद्ध संग्रह है जबकि सेट एक अनियोजित संग्रह है। सूची तत्वों के सम्मिलन क्रम को बनाए रखती है, इसका अर्थ है कि पहले डाला गया कोई भी तत्व किसी भी तत्व की तुलना में कम सूचकांक पर जाएगा। जावा में सेट किसी भी आदेश को बनाए नहीं रखता है। हालाँकि सेट एक अन्य विकल्प प्रदान करता है जिसे SortedSet कहा जाता है जो सेट में संग्रहीत वस्तुओं के तुलनीय और तुलनात्मक तरीकों द्वारा परिभाषित विशिष्ट सॉर्टिंग क्रम में सेट तत्वों को संग्रहीत कर सकता है।
3) जावा में सूची इंटरफ़ेस के लोकप्रिय कार्यान्वयन में एरेलेलिस्ट, वेक्टर और लिंक्डलिस्ट शामिल हैं। जबकि सेट इंटरफ़ेस के लोकप्रिय कार्यान्वयन में हैशसेट, ट्रीसेट और लिंक्डहाशसेट शामिल हैं।
यह बहुत स्पष्ट है कि यदि आपको प्रविष्टि आदेश या ऑब्जेक्ट को बनाए रखने की आवश्यकता है और आप संग्रह में डुप्लिकेट शामिल कर सकते हैं तो सूची जाने का एक तरीका है। दूसरी तरफ अगर आपकी आवश्यकता बिना किसी डुप्लिकेट के अद्वितीय संग्रह को बनाए रखने की है, तो सेट जाने का तरीका है।
सूची:
सेट:
Set<E>और List<E>दोनों प्रकार के तत्वों को संग्रहीत करने के लिए उपयोग किया जाता है E। अंतर यह है कि Setअनियंत्रित तरीके से संग्रहीत किया जाता है और डुप्लिकेट मानों की अनुमति नहीं देता है। Listतत्वों को संग्रहीत तरीके से संग्रहीत करने के लिए उपयोग किया जाता है और यह डुप्लिकेट मानों की अनुमति देता है।
Setतत्वों को एक सूचकांक स्थिति तक नहीं पहुँचा जा सकता है, और Listतत्वों को एक सूचकांक स्थिति के साथ एक्सेस किया जा सकता है।
नमस्ते इतने सारे उत्तर पहले से ही दिए गए हैं..मुझे कुछ बिंदुओं की ओर इशारा करते हैं जिनका अब तक उल्लेख नहीं किया गया है:
RandomAccess इंटरफ़ेस को जो तेजी से पहुंच के लिए एक मार्कर इंटरफ़ेस है। सेट कार्यान्वयन में से कोई भी ऐसा नहीं करता है।ListIterator दोनों दिशाओं में चलना का समर्थन करता है । सेट Iterator का उपयोग करता है जो केवल 1 तरह से चलने का समर्थन करता हैसबसे बड़ी अलग मूल अवधारणा है।
से सेट और सूची इंटरफ़ेस। सेट गणित की अवधारणा है। सेट विधि संग्रह का विस्तार करती है। कभी भी नई विधि न जोड़ें। आकार () का अर्थ है कार्डिनैलिटी (अधिक है BitSet.cardinality, रैखिक काउंटर , लॉग लॉग og हाइपरलॉगलाइन )। addAll () का अर्थ है संघ। अनुरक्षण () का अर्थ है प्रतिच्छेदन। removeAll () का अर्थ है अंतर।
हालाँकि इन अवधारणाओं की कमी है। अनुक्रम अवधारणा का समर्थन करने के लिए सूची में बहुत सी विधि जोड़ें जो संग्रह इंटरफ़ेस आपूर्ति नहीं करता है। मुख्य अवधारणा INDEX है । जैसे ऐड (इंडेक्स, एलिमेंट), गेट (इंडेक्स), सर्च (इंडेक्सऑफ ()), रिमूव (इंडेक्स) एलिमेंट। सूची भी " संग्रह दृश्य " उप सूची प्रदान करें । सेट के पास दृश्य नहीं है। स्थितिगत पहुंच नहीं है। सूची भी संग्रह वर्ग में बहुत सारे एल्गोरिदम प्रदान करती है । प्रकार (सूची), binarySearch (सूची), रिवर्स (सूची), शफ़ल (सूची), भरण (सूची)। विधि का नाम सूची इंटरफ़ेस है। डुप्लिकेट तत्व केवल अवधारणाओं का परिणाम हैं। आवश्यक अंतर नहीं।
तो आवश्यक अंतर अवधारणा है। सेट गणित सेट अवधारणा है। सूची अनुक्रम अवधारणा है।
यहाँ ग्रूवी के साथ एक स्पष्ट उदाहरण है। मैं एक सेट और एक सूची बनाता हूं। फिर मैं प्रत्येक सूची के भीतर 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]
आप देख सकते हैं कि अंतर यह है कि:
सेट करें: एक सेट के संग्रह में डुप्लिकेट तत्व नहीं हो सकते। यह एक अनियोजित संग्रह भी है। डेटा को सेट से एक्सेस करने के लिए, केवल Iterator का उपयोग करना आवश्यक है और इसके लिए इंडेक्स आधारित पुनर्प्राप्ति संभव नहीं है। जब भी आवश्यक विशिष्टता संग्रह की आवश्यकता होती है तब इसका उपयोग मुख्य रूप से किया जाता है।
सूची: एक सूची में डुप्लिकेट तत्व हो सकते हैं, जैसा कि डाला गया प्राकृतिक आदेश दिया गया है। इस प्रकार, यह सूचकांक या सूचना के आधार पर डेटा पुनर्प्राप्त किया जा सकता है। यह संग्रह को संग्रहीत करने के लिए व्यापक रूप से उपयोग किया जाता है जिसे सूचकांक के आधार पर उपयोग करने की आवश्यकता होती है।
विषय का नाम: सूची वी.एस. सेट
मैं अभी जावा के सबसे महत्वपूर्ण विषय से गुजरा हूं जिसे कलेक्शंस फ्रेमवर्क कहा जाता है। मैंने सोचा कि आप के साथ संग्रह के बारे में थोड़ा ज्ञान साझा करें। सूची, सेट, मानचित्र इसके सबसे महत्वपूर्ण विषय हैं। तो चलिए सूची और सेट के साथ शुरू करते हैं।
सूची और सेट के बीच का अंतर:
सूची एक संग्रह वर्ग है जो कक्षा का विस्तार करता है AbstractListजहां सेट एक संग्रह वर्ग है जो कक्षा का विस्तार करता है AbstractSetलेकिन दोनों संग्रह इंटरफ़ेस को लागू करता है।
सूची इंटरफ़ेस डुप्लिकेट मानों (तत्वों) की अनुमति देता है जबकि सेट इंटरफ़ेस डुप्लिकेट मानों की अनुमति नहीं देता है। सेट में डुप्लिकेट तत्वों के मामले में, यह पुराने मूल्यों को बदल देता है।
सूची इंटरफ़ेस NULL मानों की अनुमति देता है जहाँ सेट इंटरफ़ेस Null मानों की अनुमति नहीं देता है। सेट में नल मान का उपयोग करने के मामले में यह देता है NullPointerException।
सूची इंटरफ़ेस प्रविष्टि क्रम बनाए रखता है। इसका मतलब है कि जिस तरह से हम सूची में तत्वों को जोड़ते हैं उसी तरह हम इसे इट्रेटर या फॉर-प्रत्येक शैली का उपयोग करके प्राप्त करते हैं। जबकि Setकार्यान्वयन अनिवार्य रूप से सम्मिलन क्रम को बनाए नहीं रखते हैं। (हालांकि सम्मिलन आदेश SortedSetका उपयोग करता है TreeSet, और LinkedHashSetबनाए रखता है)।
सूची इंटरफ़ेस की अपनी विधियाँ हैं, जबकि सेट इंटरफ़ेस की अपनी कोई विधि नहीं है, इसलिए सेट केवल संग्रह इंटरफ़ेस विधियों का उपयोग करता है।
सूची इंटरफ़ेस में एक विरासत वर्ग कहा जाता है Vectorजबकि सेट इंटरफ़ेस में कोई विरासत वर्ग नहीं होता है
अंतिम लेकिन कम से कम नहीं ... listIterator()विधि का उपयोग केवल सूची वर्गों के भीतर तत्वों के माध्यम से चक्र के लिए किया जा सकता है जबकि हम कक्षा तत्वों तक पहुंचने के लिए पुनरावृत्ति () विधि का उपयोग कर सकते हैं
कुछ और हम जोड़ सकते हैं? कृपया मुझे बताओ।
धन्यवाद।
Listऔर एक Setइंटरफेस है जो एक सार वर्ग के रूप में "आधार" कार्यान्वयन है (जिसका आपने उल्लेख किया है)। इसके अलावा, # 3 पूरी तरह से गलत है , क्योंकि अधिकांश सेट शून्य मान (लेकिन कार्यान्वयन निर्भर) की अनुमति देते हैं। मुझे # 5 और # 7 समझ में नहीं आता है, और # 6 के Vectorलिए विरासत नहीं है, लेकिन सिर्फ सिंक्रनाइज़ किया जाता है और उपयोग के लिए पसंद नहीं किया जाता है जब सिंक्रनाइज़ेशन की आवश्यकता होती है।
सेट:
डुप्लिकेट मान नहीं हो सकते हैं ऑर्डर करना कार्यान्वयन पर निर्भर करता है। डिफ़ॉल्ट रूप से यह आदेश नहीं दिया जाता है कि अनुक्रमणिका तक पहुंच नहीं है
सूची:
डुप्लिकेट मान हो सकते हैं डिफ़ॉल्ट रूप से आदेशित अनुक्रमणिका द्वारा एक्सेस किया जा सकता है