English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
في هذا الدليل، سنتعلم باستخدام الأمثلة Java WeakHashMap والعمليات التي يمكن تنفيذها. سنكتشف أيضًا الفرق بين WeakHashMap وHashMap
فئة WeakHashMap في إطار Java Collections Framework توفر وظائف بنية البيانات جدول الهشاشة.
هي التي تحققواجهة Map.
ملاحظة: WeakHashMap هي نوع منWeakReferenceالنوع.
عناصر نوع الضعف يمكن جمعها في Java إذا لم تعد الإشارة مستخدمة في البرنامج.
دعونا نتعلم أولاً إنشاء جدول هشاشة ضعف. ثم، سنفهم الفرق بينه وبين hashmap.
لإنشاء جدول هشاشة ضعف، يجب علينا أولاً استيراد حزمة 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
دعونا نرى تنفيذ جدول الضعف في 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 هي إشارات قوية.
هذه هي الطريقة التي يمكننا من إنشاء جدول هاشة ضعيف من جدول هاشة آخر.
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 كلاً يقدم طرقًا للقيام بعدة عمليات على المappings.
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}
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
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}
الطريقة | وصف |
---|---|
clear() | حذف جميع المدخلات من map |
containsKey() | تحقق من أن map يحتوي على المفتاح المحدد وإرجاع قيمة بولية |
containsValue() | تحقق من أن map يحتوي على القيمة المحددة وإرجاع قيمة بولية |
size() | إرجاع حجم map |
isEmpty() | تحقق من أن map فارغاً وإرجاع قيمة بولية |