تطبيقات مجموعات Java (على سبيل المثال.HashMaps vs HashSet vs HashTable…)، ما هي تكلفة اختيار الخيار الخطأ؟[مغلق]

StackOverflow https://stackoverflow.com/questions/1033482

سؤال

في الكود الخاص بي، أستخدم افتراضيًا ArrayList لجميع القوائم، وHashMap لجميع الخرائط، وHashSet لجميع المجموعات.

من الناحية العملية، ما مدى خسارتي في المرونة وقابلية التوسع وسهولة القراءة والأداء عن طريق اختيار التنفيذ الخاطئ؟متى يكون من المنطقي قضاء بعض الوقت في اتخاذ قرار باستخدام واحد بدلاً من الآخر؟

أرى بالتأكيد حالة واضحة جدًا حول سبب استخدام شخص ما لقائمة LinkedList بدلاً من ArrayList في ظل ظروف معينة.متى يشعر شخص ما أنه من المهم استخدام HashMap بدلاً من TreeMap أو HashTable؟ماذا عن المجموعات؟

أسئلة:

  1. ما هي تكلفة الاختيار السيئ؟
  2. هل لدى أي شخص قصص كارثية حول اختيار التنفيذ الخاطئ واشتعال النيران في مركز البيانات؟
  3. أي قواعد جيدة من الإبهام؟
  4. هل هناك أي تطبيقات مجموعات غامضة لا يمكنك العيش بدونها؟

لقد قرأت من خلال:

وجدت هذا سؤال يجب أن يكون مرتبطًا من وجهة نظر نظرية، لكنني مهتم أكثر بالعالم الحقيقي، في الخنادق.

هل كانت مفيدة؟

المحلول

هذا سؤال عام جدًا، لكني سأطرح بعض الأفكار.

إذا كنت تقوم بالبرمجة نحو الواجهات، فلن تحقق المرونة نجاحًا كبيرًا.على سبيل المثال

void foo(List<E> list);

ويمكن رؤية تكلفة الاختيار السيئ في عقوبات الأداء.على سبيل المثال، اختيار LinkedList عندما يكون الوصول المباشر (كما في ArrayList) هو ما تبحث عنه.

مجموعات لديها مشكلة مماثلة.إذا كنت تريد الاحتفاظ بالمجموعات المصنفة دون أي تكرارات، فسيكون SortedSet خيارًا أكثر حكمة بدلاً من HashSet.في الخيار الأخير، سيتعين عليك فرز المجموعة بأكملها يدويًا (هذا استدعاء لـ Collections.sort())

<EDIT>

أما بالنسبة لل خرائط, ، هناك الكثير من التطبيقات المختلفة.كل واحد له غرض مختلف.على سبيل المثال، هناك SortedMap, التناظرية لـ SortedSet.ثم هناك WeakHashMap, ، هذا لا يعمل مثل HashMap، بمعنى أنه يمكن إزالة المفاتيح بواسطة أداة تجميع البيانات المهملة.كما يمكنك أن تتخيل، فإن الاختيار بين HashMap وWeakHashMap ليس بالأمر السهل.كما هو الحال دائمًا، يعتمد الأمر على ما تريد تنفيذه معهم.

</EDIT>

فيما يتعلق بالقصة، في مشروعي الحالي، استبدلنا HashSet بـ SortedSet لأن الأداء تأثر.على الرغم من ذلك، لم يشتعل مركز البيانات.

سنتى.

نصائح أخرى

طالما أنك تتبع ممارسة OO الجيدة اعتمادا على نوع مجردة, ، ما الدي يهم؟

إذا وجدت على سبيل المثال أنك استخدمت الخطأ Map ما عليك سوى تغيير التطبيق الذي تستخدمه ولأن جميع تبعياتك قيد التشغيل Map كل شيء يعمل كما كان من قبل فقط مع خصائص الأداء المختلفة.

أعتقد أنه من الجيد استخدام HashMap وHashSet وArrayList كتطبيقات أساسية.عندما تحتاج إلى مجموعة مفروزة، فمن الجيد أن تعرف أن TreeSet متاح؛عندما تقوم بأشياء متكررة، بالمثل، من الجيد أن يكون لديك LinkedList في جيبك الخلفي.لكن قم بالبرمجة للواجهات ومن ثم يمكنك تبديل التطبيقات حسب الحاجة.وإذا كانت نفس المجموعة تحتاج إلى المعالجة (على سبيل المثال) لكل من LinkedList وArrayList، فليس من المهم إنشاء واحدة من الأخرى.

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

هذا النهج لم يحرقني بعد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top