Set HashSet in Java
توضیحات جلسه
جزوه و مستندات
مفاهیم کلیدی
- Set Interface
بخشی از Java Collection Framework است که مجموعهای از المانهای منحصربهفرد یا Unique را نمایش میدهد. این اینترفیس اجازه اضافه کردن مقادیر تکراری را نمیدهد.
- HashSet
یکی از پیادهسازیهای معروف Set در جاوا است که برای ذخیرهسازی دادهها از مکانیزم هشتیبل یا Hash Table استفاده میکند. این کلاس ترتیب ورود المانها را حفظ نمیکند، اما عملیات جستجو، درج و حذف را بسیار بهینه انجام میدهد.
- Duplicate Value
به مقادیر تکراری گفته میشود که در ساختار Set مجاز نیستند. اگر بخواهید مقداری را که از قبل در ست وجود دارد دوباره اضافه کنید، این عملیات انجام نمیشود.
- Null Value
در HashSet فقط میتوانید یک مقدار null داشته باشید. تلاش برای اضافه کردن null دوم به دلیل تکراری بودن، با خطا مواجه نمیشود، اما مقدار جدیدی هم ذخیره نخواهد شد.
- Generics
قابلیتی است که اجازه میدهد نوع دادههای ورودی به ست را محدود کنید؛ برای مثال، فقط String یا Integer. این کار باعث ایجاد Type Safety میشود و از خطاهای زمان اجرا جلوگیری میکند.
- Type Safety
به معنای اطمینان از این است که فقط اشیایی از یک نوع خاص در کالکشن ذخیره میشوند. این موضوع توسط Generics در جاوا مدیریت میشود.
موارد مصاحبه ای
- تفاوت اصلی Set و List چیست؟
در List امکان ذخیره مقادیر تکراری وجود دارد و ترتیب المانها حفظ میشود. اما در Set تمام المانها باید منحصربهفرد باشند و لزوماً ترتیبی در ذخیرهسازی وجود ندارد.
- آیا HashSet ترتیب ورود دادهها را حفظ میکند؟
خیر. HashSet هیچ تضمینی نمیدهد که المانها را به همان ترتیبی که وارد شدهاند، یعنی Insertion Order، نگهداری یا نمایش دهد.
- متد add در صورت تکراری بودن داده چه خروجیای برمیگرداند؟
متد add خروجی از نوع boolean دارد. اگر المان جدید باشد و با موفقیت اضافه شود، مقدار true برمیگرداند. اگر المان تکراری باشد، مقدار false برمیگرداند.
- چرا در Set متد get(index) وجود ندارد؟
چون ستها، بهویژه HashSet، بر اساس ایندکس کار نمیکنند. آنها المانها را بر اساس ساختار داخلی خود، مانند هشکد، مدیریت میکنند؛ بنابراین دسترسی از طریق شماره ایندکس در آنها معنا ندارد.
- چگونه میتوان وجود یک المان را در Set بررسی کرد؟
با استفاده از متد contains میتوان وجود یک مقدار را بررسی کرد. این متد در صورت وجود مقدار در ست، مقدار true برمیگرداند.
سناریو کاربردی
در آموزش، یک HashSet از نوع String ایجاد شد. ابتدا رشتههای "A"، "B" و "C" به آن اضافه شدند. زمانی که تلاش شد رشته "A" برای بار دوم اضافه شود، متد add مقدار false برگرداند. با چاپ اعضای ست مشخص شد که فقط یک نسخه از "A" وجود دارد.
در مثالی دیگر، مجموعهای از اعداد مانند 1، 5، 99، 100 و 42 به یک HashSet اضافه شدند. خروجی نشان داد که اعداد با ترتیبی متفاوت از زمان ورود چاپ میشوند؛ برای مثال، عدد 1 که سومین ورودی بود، ممکن است در ابتدا چاپ شود. این سناریو نشان میدهد که نمیتوان به ترتیب نمایش المانها در HashSet اعتماد کرد.
بیشتر بدانید
- IDE Tip
در محیط IntelliJ IDEA، هنگام تعریف کالکشنها میتوانید با استفاده از قابلیت پیشنهاد خودکار، اینترفیسها و کلاسهای موردنظر را سریعتر import کنید.
- نکته برنامهنویسی
برای تعریف یک ست، بهتر است نوع متغیر را از نوع اینترفیس Set و پیادهسازی آن را از نوع کلاس HashSet در نظر بگیرید؛ مانند:
Set<Integer> numbers = new HashSet<>();
این کار باعث میشود کد شما منعطفتر باشد و در آینده راحتتر بتوانید پیادهسازی ست را تغییر دهید.
- تبدیل به آرایه
با استفاده از متد toArray در جاوا، میتوانید تمام المانهای موجود در یک Set را به یک آرایه معمولی تبدیل کنید و از آن استفاده کنید.
- متد ریموو remove
این متد نیز مانند add خروجی boolean برمیگرداند. اگر المان موردنظر در ست وجود داشته باشد و با موفقیت حذف شود، مقدار true برگردانده میشود.
