JShell Java 9 का इंटरैक्टिव REPL टूल है जो Set इंटरफेस और इसके कार्यान्वयन का त्वरित परीक्षण करने के लिए उत्कृष्ट है। एक Set अद्वितीय तत्वों का संग्रह है - कोई डुप्लिकेट नहीं।
Set कार्यान्वयन तुलना
| कार्यान्वयन | क्रम | नल अनुमत | प्रदर्शन | उपयोग केस |
|---|---|---|---|---|
| HashSet | कोई गारंटी नहीं | हां (1) | O(1) सर्वोत्तम | सामान्य उद्देश्य, तेज़ लुकअप |
| LinkedHashSet | सम्मिलन क्रम | हां (1) | O(1) + ओवरहेड | क्रम मायने रखता है, डुप्लिकेट नहीं |
| TreeSet | सॉर्टेड (प्राकृतिक/Comparator) | नहीं | O(log n) | सॉर्टेड सेट, रेंज ऑपरेशन |
| Set.of() | अनिर्दिष्ट | नहीं | O(1) | अपरिवर्तनीय, छोटे निश्चित सेट |
JShell सत्र: Set.of() - अपरिवर्तनीय सेट (Java 9+)
jshell> Set set = Set.of("Adithya", "Chaitanya", "Jai")
set ==> [Jai, Adithya, Chaitanya]
jshell> set.add("Adithya")
| Exception java.lang.UnsupportedOperationException
| at ImmutableCollections.uoe (ImmutableCollections.java:71)
| at ImmutableCollections$AbstractImmutableCollection.add (ImmutableCollections.java:73)
| at (#5:1)
// परिवर्तनीय HashSet में बदलें
jshell> Set hashSet = new HashSet<>(set)
hashSet ==> [Chaitanya, Jai, Adithya]
jshell> hashSet.add("Adithya") // डुप्लिकेट
$8 ==> false
jshell> hashSet
hashSet ==> [Chaitanya, Jai, Adithya] // अपरिवर्तित
JShell सत्र: HashSet
विशेषता: न सम्मिलन क्रम, न सॉर्टेड क्रम।
jshell> Set numbers = new HashSet<>()
numbers ==> []
jshell> numbers.add(12345)
$11 ==> true
jshell> numbers.add(1234)
$12 ==> true
jshell> numbers.add(123)
$13 ==> true
jshell> numbers.add(12)
$14 ==> true
jshell> numbers
numbers ==> [1234, 12345, 123, 12] // क्रम अनियमित
JShell सत्र: LinkedHashSet
विशेषता: सम्मिलन क्रम बनाए रखता है।
jshell> Set numbers1 = new LinkedHashSet<>()
numbers1 ==> []
jshell> numbers1.add(12345)
$17 ==> true
jshell> numbers1.add(1234)
$18 ==> true
jshell> numbers1.add(123)
$19 ==> true
jshell> numbers1.add(12)
$20 ==> true
jshell> numbers1
numbers1 ==> [12345, 1234, 123, 12] // सम्मिलन क्रम!
jshell> numbers1.add(123456)
$22 ==> true
jshell> numbers1
numbers1 ==> [12345, 1234, 123, 12, 123456] // अंत में जोड़ा गया
JShell सत्र: TreeSet
विशेषता: प्राकृतिक क्रम में सॉर्टेड (Integer के लिए आरोही)।
jshell> Set numbers2 = new TreeSet<>()
numbers2 ==> []
jshell> numbers2.add(12345)
$25 ==> true
jshell> numbers2.add(1234)
$26 ==> true
jshell> numbers2.add(123)
$27 ==> true
jshell> numbers2.add(12)
$28 ==> true
jshell> numbers2
numbers2 ==> [12, 123, 1234, 12345] // सॉर्टेड!
jshell> numbers2.add(123456)
$30 ==> true
jshell> numbers2
numbers2 ==> [12, 123, 1234, 12345, 123456] // सॉर्टेड क्रम बनाए रखा
उन्नत JShell प्रयोग
कस्टम ऑब्जेक्ट्स के साथ TreeSet (Comparator)
jshell> record Person(String name, int age) {}
jshell> TreeSet byAge = new TreeSet<>(Comparator.comparing(Person::age))
byAge ==> []
jshell> byAge.add(new Person("Alice", 30))
$2 ==> true
jshell> byAge.add(new Person("Bob", 25))
$3 ==> true
jshell> byAge.add(new Person("Charlie", 35))
$4 ==> true
jshell> byAge
byAge ==> [Person[name=Bob, age=25], Person[name=Alice, age=30], Person[name=Charlie, age=35]]
Set ऑपरेशन
jshell> Set setA = Set.of(1, 2, 3, 4, 5)
setA ==> [1, 2, 3, 4, 5]
jshell> Set setB = Set.of(4, 5, 6, 7, 8)
setB ==> [4, 5, 6, 7, 8]
jshell> // यूनियन
jshell> Set union = new HashSet<>(setA); union.addAll(setB)
union ==> [1, 2, 3, 4, 5, 6, 7, 8]
jshell> // इंटरसेक्शन
jshell> Set intersection = new HashSet<>(setA); intersection.retainAll(setB)
intersection ==> [4, 5]
jshell> // डिफरेंस
jshell> Set difference = new HashSet<>(setA); difference.removeAll(setB)
difference ==> [1, 2, 3]
jshell> // सबसेट जांच
jshell> Set.of(1, 2).containsAll(Set.of(1, 2))
$10 ==> true
Java 9+ फैक्टरी मेथड्स
jshell> // अपरिवर्तनीय सेट (Java 9+)
jshell> Set.of(1, 2, 3)
$1 ==> [1, 2, 3]
jshell> Set.of() // खाली
$2 ==> []
jshell> // 10+ तत्वों के लिए varargs ओवरलोड
jshell> Set.of(1,2,3,4,5,6,7,8,9,10,11)
$3 ==> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
jsell> // कॉपी के लिए अपरिवर्तनीय नहीं
jshell> Set.copyOf(Arrays.asList(1,2,2,3)) // डुप्लिकेट हटाता है
$4 ==> [1, 2, 3]
प्रदर्शन विशेषताएं
| ऑपरेशन | HashSet | LinkedHashSet | TreeSet |
|---|---|---|---|
| add() | O(1) | O(1) | O(log n) |
| contains() | O(1) | O(1) | O(log n) |
| remove() | O(1) | O(1) | O(log n) |
| iteration | अनियमित | सम्मिलन क्रम | सॉर्टेड |
| मेमोरी | कम | मध्यम (लिंक्ड लिस्ट) | उच्च (ट्री नोड्स) |
सामान्य नुकसान
- Set.of() अपरिवर्तनीय है:
add/remove/clearपरUnsupportedOperationExceptionफेंकता है - TreeSet नल की अनुमति नहीं देता:
NullPointerExceptionफेंकता है - परिवर्तनीय ऑब्जेक्ट्स: यदि सेट में ऑब्जेक्ट बदलते हैं तो
equals/hashCodeटूट जाता है - समवर्ती संशोधन: पुनरावृति के दौरान संशोधन से
ConcurrentModificationException