English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
توسيع HashMap
مقدمة:
حجم HashMap أكبر أو يساوي (الحجم * معامل التحميلعندما، تنشأ عملية توسيع الكتلة، وهي عملية مكلفة للغاية.
لماذا يتم توسيع الحجم؟ حجم HashMap المبدئي هو 16، وكلما أضفنا عناصر جديدة إلى HashMap، ازدادت فرص الصراع في الحسابات، مما يجعل قائمة كل حوض أطول،
سيؤثر هذا على أداء البحث، لأنه يجب عليك دائمًا التحقق من كل سلسلة، والتحقق من أن العنصر متساوٍ، حتى تتمكن من العثور على العنصر.
لتحسين أداء البحث، يمكن توسيع الحجم فقط، لتقليل الصراع في الحسابات، وجعل توزيع مفتاح العناصر متساوٍ قدر الإمكان.
نقاط توسيع الحجم
قيمة المعامل الزائد المبدئية هي 0.75
static final float DEFAULT_LOAD_FACTOR = 0.75f;
قيمة الحجم المبدئية هي 16
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // يساوي 16
يقدم HashMap ميزة إضافية يمكن من خلالها تحديد الكمية المبدئية والمعامل الزائد عند إنشائه.
public HashMap(int initialCapacity, float loadFactor)
بالافتراض، عندما يصبح حجم HashMap أكبر من أو يساوي 16 * 0.75 = 12،
في نفس الوقت، عند وجود عنصر على الأقل في كل Entry (أو ما يُدعى بحوض) يتم توسيع الحجم.
if ((size >= threshold) && (null != table[bucketIndex])) { resize(2 * table.length); hash = (null != key) ? hash(key) : 0; bucketIndex = indexFor(hash, table.length); }
عند توسيع الحجم، يتم مضاعفة قدرة المحتوى
resize(2 * table.length);
عند توسيع الحجم، يجب إعادة حساب مؤشر العناصر في المجموعة
1- إعادة تخصيص مجموعة Entry جديدة
2- إعادة حساب مؤشر العنصر الأصلي في المجموعة الجديدة(استهلاك موارد عالي)
شكرًا على القراءة، آمل أن يساعدكم هذا، شكرًا لدعمكم لموقعنا!