🌟 HashSet في جافا: الدليل الشامل للمبتدئين

مرحباً بك في درس HashSet! إذا كنت قد استخدمت ArrayList من قبل، فستجد أن HashSet يشبهها لكن مع اختلافات مهمة جداً تجعله الخيار الأمثل في مواقع معينة.

ما هو HashSet؟ 🤔

HashSet هو أحد أنواع المجموعات (Collections) في جافا التي تخزن العناصر بطريقة فريدة - أي لا تسمح بتكرار العناصر. تخيلها كحقيبة ذكية ترفض وضع عنصرين متماثلين!

import java.util.HashSet;

HashSet<String> names = new HashSet<>();

لماذا نستخدم HashSet؟ 💡

  1. منع التكرار: يضمن عدم وجود عناصر مكررة تلقائياً
  2. أداء سريع: عمليات البحث والإضافة والحذف سريعة جداً
  3. ترتيب غير مضمون: العناصر لا تحفظ ترتيب إضافتها

إنشاء HashSet وإنشاء أول مجموعة

لإنشاء HashSet، نستخدم الصيغة الأساسية التالية:

// إنشاء HashSet لتخزين أسماء
HashSet<String> names = new HashSet<>();

// إنشاء HashSet لتخزين أرقام
HashSet<Integer> numbers = new HashSet<>();

العمليات الأساسية على HashSet 🛠️

1. إضافة عناصر (add())

HashSet<String> fruits = new HashSet<>();
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Orange");
fruits.add("Apple"); // لن يضاف لأنه مكرر!

System.out.println(fruits); // [Apple, Banana, Orange]

2. التحقق من وجود عنصر (contains())

HashSet<String> fruits = new HashSet<>();
fruits.add("Apple");
fruits.add("Banana");

System.out.println(fruits.contains("Apple")); // true
System.out.println(fruits.contains("Strawberry")); // false

3. إزالة عنصر (remove())

HashSet<String> fruits = new HashSet<>();
fruits.add("Apple");
fruits.add("Banana");

fruits.remove("Banana");
System.out.println(fruits); // [Apple]

4. معرفة الحجم (size())

HashSet<String> fruits = new HashSet<>();
fruits.add("Apple");
fruits.add("Banana");

System.out.println(fruits.size()); // 2

مثال عملي: إدارة قائمة جهات اتصال 📱

لنطبق ما تعلمناه في مثال واقعي:

import java.util.HashSet;

public class ContactManager {
    public static void main(String[] args) {
        HashSet<String> contacts = new HashSet<>();
        
        // إضافة جهات اتصال
        contacts.add("Ahmed: 0512345678");
        contacts.add("Fatima: 0598765432");
        contacts.add("Khaled: 0555555555");
        contacts.add("Ahmed: 0512345678"); // مكرر - لن يضاف
        
        // عرض الجهات
        System.out.println("Contacts: " + contacts);
        
        // التحقق من وجود جهة
        if (contacts.contains("Fatima: 0598765432")) {
            System.out.println("Fatima is in the list!");
        }
        
        // عدد جهات الاتصال
        System.out.println("عدد الجهات: " + contacts.size());
    }
}

الفرق بين ArrayList و HashSet 📊

الميزة ArrayList HashSet
التكرار يسمح بالتكرار يمنع التكرار
الترتيب يحفظ ترتيب الإضافة لا يحفظ الترتيب
الأداء أبطأ في البحث أسرع في البحث

متى نستخدم HashSet؟ 🎯

  • عندما تريد منع العناصر المكررة تلقائياً
  • عندما يكون البحث عن العناصر عملية متكررة
  • عندما لا يهمك ترتيب العناصر

متى لا نستخدم HashSet؟ ⚠️

  • عندما تحتاج لحفظ ترتيب الإضافة
  • عندما تريد السماح بالعناصر المكررة
  • عندما تحتاج للوصول للعناصر بواسطة index

خلاصة الدرس 📝

تعلمنا اليوم أن HashSet هو مجموعة ذكية تمنع التكرار وتوفر أداءً ممتازاً في البحث. إنه الخيار الأمثل عندما نريد ضمان تفرد البيانات مع سرعة في الأداء.