English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

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

Java التحكم في العملية

Java متجهات

Java تعامل الأشياء (I)

Java تعامل الأشياء (II)

Java تعامل الأشياء (III)

معالجة استثناءات Java

Java قائمة (List)

Java Queue (الطابور)

Java مجموعة Map

Java مجموعة Set

Java إدخال/إخراج (I/O)

Java Reader/Writer

Java مواضيع أخرى

Java WeakHashMap

في هذا الدليل، سنتعلم باستخدام الأمثلة Java WeakHashMap والعمليات التي يمكن تنفيذها. سنكتشف أيضًا الفرق بين WeakHashMap وHashMap

فئة WeakHashMap في إطار Java Collections Framework توفر وظائف بنية البيانات جدول الهشاشة.

هي التي تحققواجهة Map.

ملاحظة: WeakHashMap هي نوع منWeakReferenceالنوع.

عناصر نوع الضعف يمكن جمعها في Java إذا لم تعد الإشارة مستخدمة في البرنامج.

دعونا نتعلم أولاً إنشاء جدول هشاشة ضعف. ثم، سنفهم الفرق بينه وبين hashmap.

إنشاء WeakHashMap

لإنشاء جدول هشاشة ضعف، يجب علينا أولاً استيراد حزمة java.util.WeakHashMap. بعد استيراد الحزمة، يمكن استخدام الطريقة التالية لإنشاء جدول هشاشة ضعف في Java.

//إنشاء WeakHashMap، حجمه 8، معامل الحمل 0.6
WeakHashMap<Key, Value> numbers = new WeakHashMap<>(8, 0.6);

في الكود المقدم، قمنا بإنشاء WeakHashMap بنسمة numbers.

هنا،

  • Key - الميزة الفريدة المستخدمة للربط بكل عنصر (قيمة) في الجردة

  • Value - العنصر المرتبط بكلي في الجردة

لاحظ جزء new WeakHashMap<>(8, 0.6). هنا، المعامل الأول هو الحجم، والمعامل الثاني هو معامل الحمل.

  • capacity - حجم الجردة هو 8. هذا يعني أن يمكنها تخزين 8 عنصر.

  • loadFactor- معامل الحمل لهذا الجردة هو 0.6. هذا يعني أن كلما تم مليء جدول الهشاشة بـ 60% من العناصر، سيتم نقل العناصر إلى جدول هشاشة جديد، حجمه ضعف حجم الجدول الأصلي.

حجم افتراضي ومعامل الحمل

يمكن إنشاء WeakHashMap دون تحديد حجمها ومعامل الحمل. على سبيل المثال،

//WeakHashMap يحتوي على حجم افتراضي ومعامل الحمل
WeakHashMap<Key, Value> numbers1 = new WeakHashMap<>();

بالافتراض،

  • حجم الجردة سيكون 16

  • معامل الحمل سيكون 0.75

الفرق بين HashMap و WeakHashMap

دعونا نرى تنفيذ جدول الضعف في Java.

import java.util.WeakHashMap;
class Main {
    public static void main(String[] args) {
        //إنشاء WeakHashMap بنسمة numbers
        WeakHashMap<String, Integer> numbers = new WeakHashMap<>();
        String two = new String("Two");
        Integer twoValue = 2;
        String four = new String("Four");
        Integer fourValue = 4;
        // إدراج عنصر
        numbers.put(two, twoValue);
        numbers.put(four, fourValue);
        System.out.println("WeakHashMap: " + numbers);
        //الإشارة الصفراء
        two = null;
        // تنفيذ إزالة النفايات
        System.gc();
        System.out.println("الجردة الناعمة بعد جمع القمامة في HashMap: " + numbers);
    }
}

نتيجة الإخراج

WeakHashMap: {أربعة=4،إثنان=2}
الجردة الناعمة بعد جمع القمامة في HashMap: {أربعة}

كما رأينا، عند إعداد مفتاح WeakHashMap two إلى null وإجراء إزالة النفايات، سيتم حذف المفتاح.

هذا لأن، على عكس المخططات، تنتمي مفاتيح المخططات الضعيفةالإشارة الضعيفةالنوع. هذا يعني أن إذا لم تعد تستخدم سجل الخريطة، فإن مشغل النفايات سيقوم بإزالة السجل. هذا مفيد جدًا لتوفير الموارد.

الآن دعونا نرى نفس التنفيذ في الرسم البياني.

import java.util.HashMap;
class Main {
    public static void main(String[] args) {
        // إنشاء hashmap للعدد المزدوج
        HashMap<String, Integer> numbers = new HashMap<>();
        String two = new String("Two");
        Integer twoValue = 2;
        String four = new String("Four");
        Integer fourValue = 4;
        // إدراج عنصر
        numbers.put(two, twoValue);
        numbers.put(four, fourValue);
        System.out.println("HashMap: " + numbers);
        // جعل الإشارة فارغة
        two = null;
        // تنفيذ إزالة النفايات
        System.gc();
        System.out.println("HashMap بعد إزالة النفايات: " + numbers);
    }
}

نتيجة الإخراج

HashMap: {Four=4, Two=2}
HashMap بعد إزالة النفايات: {Four=4, Two=2}

في هذا السياق، عند إعداد مفتاح جدول الهشاشة two إلى null وإجراء إزالة النفايات، لن يتم حذف المفتاح.

هذا لأن، على عكس WeakHashMap، تكون المفاتيح في hashmapالإشارة القويةالنوع. هذا يعني أن حتى إذا لم تعد المفتاح يستخدم في سجل الخريطة، فإن السجل لن يتم حذفه بواسطة مشغل النفايات.

ملاحظة: جميع الوظائف الموجودة في hashmap و WeakHashMap متشابهة، باستثناء أن المفاتيح في WeakHashMap هي إشارات ضعيفة، بينما المفاتيح في hashmap هي إشارات قوية.

إنشاء WeakHashMap من خريطة أخرى

هذه هي الطريقة التي يمكننا من إنشاء جدول هاشة ضعيف من جدول هاشة آخر.

import java.util.HashMap;
import java.util.WeakHashMap;
class Main {
    public static void main(String[] args) {
        // إنشاء hashmap للعدد المزدوج 
        HashMap<String, Integer> evenNumbers = new HashMap<>();
        String two = new String("Two");
        Integer twoValue = 2;
        evenNumbers.put(two, twoValue);
        System.out.println("HashMap: " + evenNumbers);
        // من إنشاء خريطة هاشة ضعيفة من خريطة هاشة أخرى 
        WeakHashMap<String, Integer> numbers = new WeakHashMap<>(evenNumbers);
        System.out.println("WeakHashMap: " + numbers);
    }
}

نتيجة الإخراج

HashMap: {Two=2}
WeakHashMap: {Two=2}

طرق WeakHashMap

WeakHashMap كلاً يقدم طرقًا للقيام بعدة عمليات على المappings.

إدراج العنصر في WeakHashMap

  • put() - أضف الت映射 المحدد إلى الخريطة

  • putAll() - أضف جميع المدخلات من الخريطة المحددة إلى هذه الخريطة

  • putIfAbsent() - إذا لم يكن المفتاح المحدد موجودًا في الخريطة، فأضف الت映射 المحدد إلى الخريطة

على سبيل المثال،

import java.util.WeakHashMap;
class Main {
    public static void main(String[] args) {
        // أنشئ WeakHashMap للعدد الأكبر 
        WeakHashMap<String, Integer> evenNumbers = new WeakHashMap<>();
        String two = new String("Two");
        Integer twoValue = 2;
        // استخدم put()
        evenNumbers.put(two, twoValue);
        String four = new String("Four");
        Integer fourValue = 4;
        // استخدم putIfAbsent()
        evenNumbers.putIfAbsent(four, fourValue);
        System.out.println("WeakHashMap الأعداد الزوجية: " + evenNumbers);
        // أنشئ WeakHashMap تحت الاسم numbers
        WeakHashMap<String, Integer> numbers = new WeakHashMap<>();
        String one = new String("One");
        Integer oneValue = 1;
        numbers.put(one, oneValue);
        // استخدم putAll()
        numbers.putAll(evenNumbers);
        System.out.println("رقم WeakHashMap: " + numbers);
    }
}

نتيجة الإخراج

WeakHashMap الأعداد الزوجية: {Four=4, Two=2}
رقم WeakHashMap: {Two=2, Four=4, One=1}

زيارة عناصر WeakHashMap

1. استخدم entrySet()،keySet() وvalues()

  • entrySet() - تعود مجموعة جميع الت映射ات المفتاح/القيمة

  • keySet() - تعود مجموعة جميع المفاتيح في الخريطة

  • values() - تعود مجموعة جميع القيم في الخريطة

على سبيل المثال،

import java.util.WeakHashMap;
class Main {
    public static void main(String[] args) {
        // أنشئ WeakHashMap للعدد الأكبر 
        WeakHashMap<String, Integer> numbers = new WeakHashMap<>();
        String one = new String("One");
        Integer oneValue = 1;
        numbers.put(one, oneValue);
        String two = new String("Two");
        Integer twoValue = 2;
        numbers.put(two, twoValue);
        System.out.println("WeakHashMap: " + numbers);
        // استخدم entrySet()
        System.out.println("مفهوم/قيمة الت映射: " + numbers.entrySet());
        // استخدم keySet()
        System.out.println("المفاتيح: " + numbers.keySet());
        // استخدم values()
        System.out.println("قيم: " + numbers.values());
    }
}

نتيجة الإخراج

WeakHashMap: {Two=2, One=1}
مفهوم/قيمة الت映射: [Two=2, One=1]
المفاتيح: [Two, One]
القيم: [1, 2]

2. استخدام get() و getOrDefault()

  • get() - يعود القيمة المرتبطة بالمفتاح المحدد. إذا لم يتم العثور على المفتاح، يتم العودة إلى null.

  • getOrDefault() - يعود القيمة المرتبطة بالمفتاح المحدد. إذا لم يتم العثور على المفتاح، يتم العودة إلى القيمة المحددة افتراضياً.

على سبيل المثال،

import java.util.WeakHashMap;
class Main {
    public static void main(String[] args) {
        // أنشئ WeakHashMap للعدد الأكبر 
        WeakHashMap<String, Integer> numbers = new WeakHashMap<>();
        String one = new String("One");
        Integer oneValue = 1;
        numbers.put(one, oneValue);
        String two = new String("Two");
        Integer twoValue = 2;
        numbers.put(two, twoValue);
        System.out.println("WeakHashMap: " + numbers);
        // استخدام get()
        int value1 = numbers.get("Two");
        System.out.println("استخدام طريقة get(): " + value1);
        // استخدام getOrDefault()
        int value2 = numbers.getOrDefault("Four", 4);
        System.out.println("استخدام طريقة getOrDefault(): " + value2);
    }
}

نتيجة الإخراج

WeakHashMap: {Two=2, One=1}
استخدام طريقة get() - 2
استخدام طريقة getOrDefault() - 4

حذف عناصر WeakHashMap

  • remove(key) - يعود العنصر المرتبط بالمفتاح المحدد ويتم حذفه من المapping.

  • remove(key, value) - يتم حذف العنصر من المapping فقط إذا كان المفتاح المحدد مرتبط بالقيمة المحددة ويعود قيمة بولية

على سبيل المثال،

import java.util.WeakHashMap;
class Main {
    public static void main(String[] args) {
        // أنشئ WeakHashMap للعدد الأكبر 
        WeakHashMap<String, Integer> numbers = new WeakHashMap<>();
        String one = new String("One");
        Integer oneValue = 1;
        numbers.put(one, oneValue);
        String two = new String("Two");
        Integer twoValue = 2;
        numbers.put(two, twoValue);
        System.out.println("WeakHashMap: " + numbers);
        // استخدم remove() مع parameter واحد
        int value = numbers.remove("Two");
        System.out.println("حذف القيمة: " + value);
        // استخدم remove() مع 2 معلمات
        boolean result = numbers.remove("One", 3);
        System.out.println("المدخل {One=3} تم حذفه؟ " + result);
        System.out.println("WeakHashMap بعد التحديث: " + numbers);
    }
}

نتيجة الإخراج

WeakHashMap: {Two=2, One=1}
حذف القيمة: 2
المدخل {One=3} تم حذفه؟ False
WeakHashMap بعد التحديث: {One=1}

أساليب أخرى لـ WeakHashMap

الطريقةوصف
clear()حذف جميع المدخلات من map
containsKey()تحقق من أن map يحتوي على المفتاح المحدد وإرجاع قيمة بولية
containsValue()تحقق من أن map يحتوي على القيمة المحددة وإرجاع قيمة بولية
size()إرجاع حجم map
isEmpty()تحقق من أن map فارغاً وإرجاع قيمة بولية