
كلنا عارفين مدى أهمية هياكل البيانات في التطبيقات بتاعتنا ، وقد ايه معرفتنا بنوع المشكلة اللي بنحاول نحلها هو اللي بيحدد نوع هياكل البيانات اللي هنستعملها ، لإن كل واحدة بتتميز بعدة خصائص بتميزها عن الباقيين.
ولو جينا نشوف ده في الـ Java فهياكل البيانات أو الـ Collections
بمعنى أصح اللي بنخزن فيها البيانات متعددة وفيه منهم كتير ، فورقة وقلم وتعالوا نتعرف على الـ Java Collections Cheatsheet
ونشوف ايه هي أشهر الـ Collections
اللي موجودة في الـ Java ونستعملهم امتة.
Java Collections Cheatsheet
احنا بدايتنا هتكون هل البيانات اللي محتاجين نخزنها عبارة عن مجرد قيم Values ولا محتاج اخزن البيانات على شكل Key/Value Pairs. وبناءا على اجابتنا هنا احنا هنتفرع لفرعين:
- محتاجين
Values
- محتاجين
Key/Value Pairs
لو احنا كنا عاوزين نخزن قيم فقط لا غير يعني مجرد Values
، فحد هيقول خلاص احنا ممكن نستعمل الـ ArrayList وهتكون فعالة وكويسة جدًا. ولكن صبرًا مش بنختار الـ Collections
بالسرعة دي، احنا محتاجين نفهم طبيعة المشكلة اللي بنحلها الاول فخلونا نكمل.
لو احنا هنخزن مجرد Values
فمحتاجين نسأل سؤال مهم هي القيم اللي هنخزنها فيها Duplicates
ولا لا ؟
لو عادي نسمح بوجود قيم مقررة يعني Duplicates وقتها هنختار الـ ArrayList كـ Collection نستعمله وهيكون جميل جدًا ومناسب لطبيعة الشغل.
طب لو مافيش Duplicates ؟ يعني بمعنى أدق عاوزين القيم تبقى مميزة و Unique
بدون أي تكرار ؟ حد هيرد بسرعة برضو ويقول ممكن نستعمل الـ HashSet
، هنقوله كلامك صحيح ، ولكن صبرًا احنا محتاجين نفهم طبيعة المشكلة اللي بنحلها الأول .. فخلونا نكمل.
طب لو الاجابة كانت لا وان مافيش Duplicates
؟ محتاجين دلوقتي نسأل سؤال تاني مهم الا وهو .. هي القيم الـ Unique دي اما نخزنها هل بعد كده هنبحث فيهم على حاجات معينة ؟ أو ممكن نضطر نمسح منهم حاجات معينة ؟
لو الاجابة كانت لا .. فوقتها الـ ArrayList هتكون الـ Collection المناسب للاستعمال برضو حتى وانا ماعنديش Duplicates، لاني هيكون عندي مجموعة من القيم وخلاص محتاج احتفظ بيهم وارجعهم على سبيل المثال او محتاج اعدي على كل عنصر اعمل Processing ليه بشكل معين.
لكن لو مافيش Duplicates
والقيم عاوزنها تبقى Unique
وبدون أي تكرار , محتاجين نفهم هل الترتيب هيكون شكله عامل ازاي ؟ هل هيكون مهم ولا مش مهم .. يعني هل القيم دي عاوزينها تكون مُرتبة Ordered
ولا مش فارق معانا الترتيب ؟ لو الترتيب مش فارق معانا فوقتها ممكن نستعمل الـ HashSet بحرية وهيكون خيار مناسب.
ولكن لو الترتيب فارق معانا ؟ محتاجين نعرف هل عاوزين نرتب العناصر بناء على عمليات الـ Insertions اللي دخلت بيهم ؟ ولا بناء على القيم الفعلية ؟ لو بناء على الـ Insertion فوقتها هنختار الـ LinkedHashSet ولكن لو بناء على القيم الفعلية وقتها هنختار الـ TreeSet.
فزي ماحنا شايفين ، احنا مختارناش الـ HashSet
علطول من البداية مع عدم وجود Duplicates
؟ ده لان مش بالضرورة يكون ماعنديش Duplicates
فاروح استعمله ، لو انا بس عاوز مجرد Collection
يحتفظ بالبيانات عشان هعدي عليهم كلهم كده كده واعمل عليهم شغل فالـ ArrayList هتكون أفضل ، ولكن مع معرفتنا ان طبيعة المشكلة متطلبة Searching
أو اني اعمل Removal
لبعض العناصر , والترتيب كذلك فرق معايا في اختيار نوع الـ HashSet
اذ كان هو اللي هستعمله ولا هستعمل الـ LinkedHashSet
أو الـ TreeSet
.
بكده نكون خلصنا أول فرع معانا وهو اللي كان فيه مخزنين قيم Values
فقط تعالوا نشوف لو هنخزن Key/Value Pairs
الوضع هيكون عامل ازاي.
لو انا معايا البيانات بتاعتي عاوز اخزنها على شكل Kay/Value Pairs
محتاج برضو افهم هل الترتيب هيفرق معايا ولا لا .. لو مش هيفرق معايا ترتيبهم عامل ازاي , وقتها ممكن استعمل علطول الـ HashMap.
ولكن لو الترتيب هيفرق معايا محتاج اسأل السؤال اللي سألناه مع الـ HashSet
هو احنا عاوزين نرتب على حسب الـ Insertion Order
ولا على حسب الـ Values
؟ لو على حسب الـ Insertion Order فهنستعمل الـ LinkedHashMap ولو الـ Order على حسب الـ Values فوقتها هنستعمل الـ TreeMap.
هتلاقونا هنا استعملنا نفس الكلام شبه الـ
HashSet
عشان يبقى سهل عليكم تفتكروهم ، لو عاوزينInsertion Order
هنستعمل الـLinkedHash Implementation
سواء مع الـ Map أو الـ Set ولكن لو عاوزينSorted Values
وقتها هنستعمل الـTree Implementation
سواء مع الـMap
أو الـSet
في الختام
زي ما شوفنا مع بعض فهمنا لطبيعة المشكلة اللي بنحاول نحلها هيساعدنا في اختيار الـ Collection
المناسب وده فعلا من المواضيع المهمة واللي ممكن تفيد بشكل كبير في تحسين اداء التطبيق بصورة كبيرة كونك بس اختارت هياكل البيانات المناسبة واستعملتها في محلها.