[java] التحقق من وجود المفتاح في HashMap


3 Answers

لن تكسب أي شيء عن طريق التحقق من وجود المفتاح. هذا هو كود HashMap :

@Override
public boolean containsKey(Object key) {
    Entry<K, V> m = getEntry(key);
    return m != null;
}

@Override
public V get(Object key) {
    Entry<K, V> m = getEntry(key);
    if (m != null) {
        return m.value;
    }
    return null;
}

فقط تحقق مما إذا كانت قيمة الإرجاع الخاصة بـ get() مختلفة عن null .

هذا هو كود مصدر HashMap.

مصادر :

Question

هل التحقق من وجود المفتاح في HashMap ضروري دائمًا؟

لدي HashMap مع يقول إدخالات 1000 وأنا أبحث في تحسين الكفاءة. إذا تم الوصول إلى HashMap بشكل متكرر ، فسيؤدي التحقق من وجود المفتاح عند كل وصول إلى زيادة كبيرة في الحجم. بدلاً من ذلك إذا لم يكن المفتاح موجودًا ومن ثم يحدث استثناء ، يمكنني التقاط الاستثناء. (عندما أعلم أن هذا سيحدث نادرا). سيقلل هذا من الوصول إلى HashMap بمقدار النصف.

قد لا تكون هذه ممارسة جيدة للبرمجة ، ولكنها ستساعدني في تقليل عدد مرات الدخول. أو هل أنا في عداد المفقودين شيء هنا؟

[ تحديث ] ليس لدي قيم فارغة في HashMap.




if(map.get(key) != null || (map.get(key) == null && map.containsKey(key)))



  1. إذا كانت فئة المفتاح هي الخاصة بك تأكد من تنفيذ hashCode () و يساوي () الطرق.
  2. بشكل أساسي ، يجب أن يكون الوصول إلى HashMap هو O (1) ولكن مع تطبيق أسلوب hashCode غير صحيح ، يصبح O (n) ، لأنه سيتم تخزين القيمة بنفس مفتاح التجزئة كقائمة مرتبطة.



هل تقصد أنك حصلت على رمز مثل

if(map.containsKey(key)) doSomethingWith(map.get(key))

في انحاء المكان ؟ ثم يجب عليك ببساطة التحقق ما إذا كان map.get(key) عاد فارغة وهذا كل شيء. بالمناسبة ، لا يلقي HashMap الاستثناءات للمفاتيح المفقودة ، فإنه يُرجع بدلاً من ذلك. الحالة الوحيدة التي تحتاج فيها containsKey الأساسي هي عندما تقوم بتخزين قيم فارغة ، للتمييز بين قيمة فارغة وقيمة مفقودة ، ولكن هذا عادة ما يعتبر ممارسة سيئة.




Related



Tags

java java   hashmap