Map و HashMap

Map هي خريطة تخزن بيانات بمفتاح-قيمة. في هذا الدرس، سنتعلم كيفية استخدامها.

إنشاء HashMap

JAVA
import java.util.HashMap;
import java.util.Map;

// خريطة فارغة
Map<String, Integer> ages = new HashMap<>();

// خريطة بقيم أولية
Map<String, Integer> scores = new HashMap<>(Map.of(
    "أحمد", 95,
    "محمد", 88,
    "علي", 92
));

العمليات الأساسية

إضافة عناصر

JAVA
Map<String, Integer> ages = new HashMap<>();
ages.put("أحمد", 25);      // إضافة مفتاح-قيمة
ages.put("محمد", 30);
ages.put("أحمد", 26);      // تحديث القيمة (المفتاح فريد)

الوصول للقيم

JAVA
Map<String, Integer> ages = new HashMap<>(Map.of("أحمد", 25، "محمد", 30));

int age = ages.get("أحمد");              // 25
int ageOrDefault = ages.getOrDefault("علي", 0);  // 0 (قيمة افتراضية)
boolean has = ages.containsKey("محمد");    // true
boolean hasValue = ages.containsValue(30); // true
int size = ages.size();                    // 2

حذف العناصر

JAVA
Map<String, Integer> ages = new HashMap<>(Map.of("أحمد", 25، "محمد", 30));
ages.remove("محمد");           // حذف بال מפתח
ages.remove("أحمد", 26);     // حذف فقط إذا كانت القيمة متطابقة
ages.clear();                  // تفريغ

تحديث القيم

JAVA
Map<String, Integer> scores = new HashMap<>();
scores.put("أحمد", 95);

// تحديث مباشر
scores.put("أحمد", 98);

// تحديث بشرط
scores.putIfAbsent("محمد", 88);  // يضاف فقط إذا لم يكن موجودًا

// تحديث باستخدام دالة
scores.merge("أحمد", 5, Integer::sum);  // أحمد = 95 + 5 = 100

المرور على Map

المرور على المفاتيح

JAVA
Map<String, Integer> ages = new HashMap<>(Map.of("أحمد", 25، "محمد", 30));

for (String name : ages.keySet()) {
    System.out.println(name + ": " + ages.get(name));
}

المرور على القيم

JAVA
for (int age : ages.values()) {
    System.out.println(age);
}

المرور على الأزواج

JAVA
for (Map.Entry<String, Integer> entry : ages.entrySet()) {
    System.out.println(entry.getKey() + ": " + entry.getValue());
}

باستخدام forEach

JAVA
ages.forEach((name, age) -> System.out.println(name + ": " + age));

TreeMap — خريطة مرتبة

JAVA
import java.util.TreeMap;

Map<String, Integer> sortedMap = new TreeMap<>();
sortedMap.put("محمد", 30);
sortedMap.put("أحمد", 25);
sortedMap.put("علي", 28);
System.out.println(sortedMap);  // {أحمد=25، علي=28، محمد=30} (مرتبة أبجديًا)

LinkedHashMap — خريطة مرتبة بالإدراج

JAVA
import java.util.LinkedHashMap;

Map<String, Integer> orderedMap = new LinkedHashMap<>();
orderedMap.put("محمد", 30);
orderedMap.put("أحمد", 25);
orderedMap.put("علي", 28);
System.out.println(orderedMap);  // {محمد=30، أحمد=25، علي=28} (ترتيب الإدراج)

مثال: عداد الكلمات

JAVA
public static Map<String, Integer> countWords(String text) {
    Map<String, Integer> counts = new HashMap<>();
    String[] words = text.toLowerCase().split("\\s+");
    
    for (String word : words) {
        counts.merge(word, 1, Integer::sum);
    }
    
    return counts;
}

String text = "Java هي لغة برمجة Java سهلة وممتعة";
Map<String, Integer> wordCounts = countWords(text);
System.out.println(wordCounts);  // {java=2، هي=1، لغة=1، برمجة=1، سهلة=1، وممتعة=1}

مثال: ذاكرة التخزين المؤقت (Cache)

JAVA
import java.util.HashMap;
import java.util.Map;

public class SimpleCache<K, V> {
    private Map<K, V> cache = new HashMap<>();
    private int maxSize;
    
    public SimpleCache(int maxSize) {
        this.maxSize = maxSize;
    }
    
    public V get(K key) {
        return cache.get(key);
    }
    
    public void put(K key, V value) {
        if (cache.size() >= maxSize) {
            // حذف أول عنصر (مبسط)
            K firstKey = cache.keySet().iterator().next();
            cache.remove(firstKey);
        }
        cache.put(key, value);
    }
    
    public boolean containsKey(K key) {
        return cache.containsKey(key);
    }
}

مقارنة بين الخرائط

الميزة HashMap TreeMap LinkedHashMap
الترتيب بدون أبجدي بالإставка
الأداء الأسرع أبطأ متوسط
null مفتاح يسمح لا يسمح يسمح

❓ أسئلة شائعة

س ما الفرق بين Map و HashMap؟
ج Map هي الواجهة، HashMap هي التنفيذ.
س ماذا يحدث إذا أضفت مفتاحًا مكررًا؟
ج تتم تحديث القيمة القديمة بالجديدة.
س هل Map آمنة للخيوط؟
ج HashMap ليست آمنة. استخدم ConcurrentHashMap للخيوط المتعددة.

📖 ملخص

📝 تمارين

  1. دليل هاتف: أنشئ Map من أسماء وأرقام هواتف
  2. عداد: أنشئ Map يعد تكرار الكلمات
  3. مترجم: أنشئ Map تترجم الكلمات من إنجليزي إلى عربي

الدرس التالي

في الدرس التالي، سنتعلم Generics — الأنواع العامة.

100%