في تطبيقات Java الخاصة بك، ستعمل عادة مع أنواع مختلفة من الكائنات. وقد ترغب في القيام بعمليات مثل الفرز، والبحث، والتكرار على هذه الكائنات.
قبل إدخال إطار العمل للمجموعات في JDK 1.2، كنت ستستخدم Arrays و Vectors لتخزين وإدارة مجموعة من الكائنات. لكن كانت لديها نصيبها من العيوب.
إن إطار عمل مجموعات Java يهدف إلى التغلب على هذه المشاكل من خلال توفير تنفيذات عالية الأداء لهياكل البيانات الشائعة. تتيح لك هذه التنفيذات التركيز على كتابة منطق التطبيق بدلاً من التركيز على العمليات على المستوى المنخفض.
ثم، أدخلت التوابع الجينية في JDK 1.5 تحسينًا كبيرًا على إطار عمل مجموعات Java. تتيح لك التوابع الجينية فرض سلامة النوع للكائنات المخزنة في مجموعة، مما يعزز من قوة تطبيقاتك. يمكنك قراءة المزيد عن التوابع الجينية في Java هنا.
في هذه المقالة، سأرشدك على كيفية استخدام إطار عمل مجموعات Java. سنناقش أنواع المجموعات المختلفة، مثل القوائم، والمجموعات، والطوابير، والخرائط. كما سأوفر شرحًا موجزًا لخصائصها الرئيسية مثل:
-
الآليات الداخلية
-
معالجة التكرارات
-
دعم القيم الفارغة
-
الترتيب
-
التزامن
-
الأداء
-
الأساليب الرئيسية
-
التنفيذات الشائعة
سنقوم أيضًا بشرح بعض أمثلة الشيفرة لفهم أفضل، وسأتطرق إلى فئة الأدوات الجديدة واستخدامها.
جدول المحتويات:
فهم إطار عمل جافا للمجموعات
وفقًا لـوثائق جافا، “تعد المجموعة كائنًا يمثل مجموعة من الكائنات. إطار العمل للمجموعات هو بنية موحدة لتمثيل المجموعات وتلاعبها”.
ببساطة، يساعد إطار عمل جافا للمجموعات في إدارة مجموعة من الكائنات وتنفيذ العمليات عليها بكفاءة وبطريقة منظمة. يجعل من السهل تطوير التطبيقات من خلال تقديم طرق مختلفة للتعامل مع مجموعات الكائنات. يمكنك إضافة وإزالة والبحث وفرز الكائنات بفعالية باستخدام إطار عمل جافا للمجموعات.
واجهات المجموعات
في جافا، تحدد الواجهة عقدًا يجب أن يتم تنفيذه من قبل أي فئة تنفذها. وهذا يعني أن الفئة المنفذة يجب أن توفر تنفيذات ملموسة لجميع الطرق المعلنة في الواجهة.
في إطار تجميعات جافا، تمتد واجهات تجميع مختلفة مثل Set
، List
، وQueue
من واجهة Collection
، ويجب أن تلتزم بالعقد المحدد من قبل واجهة Collection
.
فك تسلسل التركيب الهرمي لإطار تجميعات جافا
تحقق من هذا المخطط الجميل من هذا المقال الذي يوضح تسلسل تركيبة جافا للمجموعات:
سنبدأ من الأعلى ونعمل نحو الأسفل حتى تتمكن من فهم ما يُعرض في هذا المخطط:
-
في أساس إطار تجميعات جافا توجد واجهة
Iterable
، التي تتيح لك تكرار العناصر في مجموعة. -
تمتد واجهة
Collection
من واجهةIterable
. وهذا يعني أنها ترث خصائص وسلوك واجهةIterable
وتضيف سلوكها الخاص لإضافة، وإزالة، واسترداد العناصر. -
الواجهات الخاصة مثل
List
وSet
وQueue
توسع الواجهةCollection
بشكل أكبر. كل واجهة من هذه الواجهات لديها فئات أخرى تنفذ أساليبها. على سبيل المثال،ArrayList
هو تنفيذ شهير لواجهةList
،HashSet
تنفذ واجهةSet
، وهكذا. -
واجهة
Map
هي جزء من إطار عمل مجموعات جافا، ولكنها لا توسع الواجهةCollection
، على عكس المذكور أعلاه. -
جميع الواجهات والفئات في هذا الإطار هي جزء من حزمة
java.util
.
ملاحظة: مصدر شائع للارتباك في إطار مجموعات جافا يدور حول الفرق بين Collection
و Collections
. Collection
هو واجهة في الإطار، بينما Collections
هو فئة مساعدة. توفر فئة Collections
طرقًا ساكنة تنفذ عمليات على عناصر مجموعة.
واجهات مجموعات جافا
الآن، أصبحت على دراية بأنواع المجموعات المختلفة التي تشكل أساس إطار المجموعات. الآن سنلقي نظرة أقرب على واجهات List
، Set
، Queue
، و Map
.
في هذا القسم، سنناقش كل واجهة من هذه الواجهات أثناء استكشاف آلياتها الداخلية. سنفحص كيفية التعامل مع العناصر المكررة وما إذا كانت تدعم إدراج قيم الـ null. سنفهم أيضًا ترتيب العناصر أثناء الإدراج ودعمها للمزامنة، والتي تتعامل مع مفهوم سلامة الخيوط. ثم سنمر ببعض الطرق الرئيسية لهذه الواجهات ونختتم بمراجعة التنفيذات الشائعة وأدائها لعمليات مختلفة.
قبل أن نبدأ، دعنا نتحدث بإيجاز عن المزامنة والأداء.
-
المزامنة تتحكم في الوصول إلى الكائنات المشتركة بواسطة خيوط متعددة، مضمنة سلامتها ومنع الصراعات. هذا أمر حاسم للحفاظ على سلامة الخيوط.
-
عند اختيار نوع التجميع، عامل مهم هو أداؤه خلال العمليات الشائعة مثل الإدراج والحذف والاسترجاع. يتم التعبير عن الأداء عادة باستخدام تعبير Big-O. يمكنك معرفة المزيد عنه هنا.
القوائم
قائمة هي مجموعة مرتبة أو تسلسلية من العناصر. تتبع فهرسة تبدأ من الصفر، مما يسمح بإدراج العناصر أو إزالتها أو الوصول إليها باستخدام موضع الفهرس.
-
الآلية الداخلية: تدعم
List
داخليًا إما بواسطة مصفوفة أو قائمة متسلسلة، اعتمادًا على نوع التنفيذ. على سبيل المثال، يستخدمArrayList
مصفوفة، بينما تستخدمLinkedList
قائمة متسلسلة داخليًا. يمكنك قراءة المزيد عنLinkedList
هنا. تعيدList
تحجيم نفسها ديناميكيًا عند إضافة أو إزالة العناصر. يجعل الاسترجاع القائم على الفهرسة منها نوعًا فعالًا جدًا من التجميع. -
التكرارات: يُسمح بالعناصر المكررة في
List
، مما يعني أنه يمكن أن يكون هناك أكثر من عنصر واحد فيList
بنفس القيمة. يمكن استرداد أي قيمة بناءً على الفهرس الذي تم تخزينها فيه. -
القيمة الفارغة: يُسمح أيضًا بالقيم الفارغة في
List
. نظرًا لأن الاستمارات مسموح بها، يمكنك أيضًا وجود عناصر فارغة متعددة. -
الترتيب: يحافظ
List
على ترتيب الإدراج، مما يعني أن العناصر تخزن بنفس النظام الذي تمت إضافته به. هذا مفيد عندما ترغب في استرداد العناصر بالترتيب الدقيق الذي تم إدخالها به. -
المزامنة:
List
ليست متزامنة بشكل افتراضي، مما يعني أنها لا تحتوي على طريقة مدمجة للتعامل مع الوصول بواسطة عدة خيوط في نفس الوقت. -
الأساليب الرئيسية: إليك بعض الأساليب الرئيسية لواجهة
List
:add(E element)
،get(int index)
،set(int index, E element)
،remove(int index)
، وsize()
. دعنا نلقي نظرة على كيفية استخدام هذه الأساليب من خلال برنامج مثالي.import java.util.ArrayList; import java.util.List; public class ListExample { public static void main(String[] args) { // إنشاء قائمة List<String> list = new ArrayList<>(); // add(E element) list.add("تفاح"); list.add("موز"); list.add("كرز"); // get(int index) String secondElement = list.get(1); // "موز" // set(int index, E element) list.set(1, "توت أزرق"); // remove(int index) list.remove(0); // يزيل "تفاح" // size() int size = list.size(); // 2 // طباعة القائمة System.out.println(list); // الناتج: [توت أزرق, كرز] // طباعة حجم القائمة System.out.println(size); // الناتج: 2 } }
-
التنفيذات المشتركة:
ArrayList
،LinkedList
،Vector
،Stack
-
الأداء: عادةً، عمليات الإدراج والحذف سريعة في كل من
ArrayList
وLinkedList
. ولكن يمكن أن يكون استرداد العناصر بطيئًا لأنه يتعين عليك المرور عبر العقد.
العملية | ArrayList | LinkedList |
الإدراج | سريع في النهاية – O(1) معمم، بطيء في البداية أو الوسط – O(n) | سريع في البداية أو الوسط – O(1)، بطيء في النهاية – O(n) |
الحذف | سريع في النهاية – O(1) معمم، بطيء في البداية أو الوسط – O(n) | سريع – O(1) إذا كانت الموضع معروفة |
استرجاع | سريع – O(1) للوصول العشوائي | بطيء – O(n) للوصول العشوائي، حيث يتضمن المرور |
مجموعات
مجموعة هي نوع من مجموعات العناصر التي لا تسمح بالعناصر المكررة وتمثل مفهوم مجموعة رياضية.
-
آلية العمل الداخلية: يتمتع
Set
بدعم داخلي من قِبلHashMap
. وتعتمد على نوع التنفيذ، حيث يكون مدعومًا إما بـHashMap
,LinkedHashMap
, أوTreeMap
. لقد كتبت مقالًا مفصلًا حول كيفية عملHashMap
داخليًا هنا. تأكد من الاطلاع عليه. -
التكرارات: نظرًا لأن
Set
يمثل مفهوم المجموعة الرياضية، لا يُسمح بوجود عناصر مكررة. وهذا يضمن أن جميع العناصر فريدة، مما يحافظ على سلامة المجموعة. -
قيمة الـ Null: يُسمح بحد أقصى بوجود قيمة Null واحدة في مجموعة
Set
لأنه لا يُسمح بتكرار القيم. ولكن هذا لا ينطبق على تنفيذTreeSet
, حيث لا تُسمح بقيم Null على الإطلاق. -
الترتيب: ترتيب العناصر في مجموعة
Set
يعتمد على نوع التنفيذ.-
HashSet
: النظام غير مضمون ويمكن وضع العناصر في أي موضع. -
LinkedHashSet
: هذا التنفيذ يحتفظ بترتيب الإدخال، لذا يمكنك استرداد العناصر بنفس الترتيب الذي تم إدخالها به. -
TreeSet
: يتم إدراج العناصر استنادًا إلى ترتيبها الطبيعي. بالإضافة إلى ذلك، يمكنك التحكم في ترتيب الإدراج عن طريق تحديد مُقارن مخصص.
-
-
المزامنة: لا تتزامن مجموعة
Set
، مما يعني أنه قد تواجه مشاكل التزامن، مثل ظروف السباق، والتي يمكن أن تؤثر على سلامة البيانات إذا حاول اثنان أو أكثر من الخيوط الوصول إلى كائنSet
بشكل متزامن -
الأساليب الرئيسية: إليك بعض الأساليب الرئيسية لواجهة
Set
:add(E element)
،remove(Object o)
،contains(Object o)
، وsize()
. دعنا نلقي نظرة على كيفية استخدام هذه الأساليب من خلال برنامج مثالي.import java.util.HashSet; import java.util.Set; public class SetExample { public static void main(String[] args) { // إنشاء مجموعة Set<String> set = new HashSet<>(); // إضافة عناصر إلى المجموعة set.add("Apple"); set.add("Banana"); set.add("Cherry"); // إزالة عنصر من المجموعة set.remove("Banana"); // التحقق مما إذا كانت المجموعة تحتوي على عنصر boolean containsApple = set.contains("Apple"); System.out.println("Contains Apple: " + containsApple); // الحصول على حجم المجموعة int size = set.size(); System.out.println("Size of the set: " + size); } }
-
تنفيذات شائعة:
HashSet
,LinkedHashSet
,TreeSet
-
الأداء: تقدم تنفيذات
Set
أداء سريع للعمليات الأساسية، ما عدا فيTreeSet
، حيث يمكن أن يكون الأداء أبطأ نسبيًا لأن الهيكل البيانات الداخلي يتضمن فرز العناصر أثناء هذه العمليات.
العملية | HashSet | LinkedHashSet | TreeSet |
إدراج | سريع – O(1) | سريع – O(1) | أبطأ – O(log n) |
حذف | سريع – O(1) | سريع – O(1) | أبطأ – O(log n) |
استرجاع | سريع – O(1) | سريع – O(1) | أبطأ – O(log n) |
الطوابير
يعتبر Queue
مجموعة خطية من العناصر المستخدمة لاحتواء عناصر متعددة قبل المعالجة، عادةً وفقاً لترتيب FIFO (الأولوية للأولوية). وهذا يعني أن العناصر تُضاف في طرف واحد وتُزال من الطرف الآخر، لذلك أول عنصر يتم إضافته إلى الطابور هو أول عنصر يتم إزالته.
-
الآلية الداخلية: تختلف عمليات العمل الداخلية لـ
Queue
استنادًا إلى تنفيذها المحدد.-
LinkedList
– يستخدم قائمة مزدوجة المرتبطات لتخزين العناصر، مما يعني أنه يمكنك الانتقال إلى الأمام والخلف، مما يسمح بعمليات مرنة. -
PriorityQueue
– مدعوم داخليًا بكومة ثنائية، وهو فعال جدًا لعمليات الاسترجاع. -
ArrayDeque
– يتم تنفيذه باستخدام مصفوفة تتوسع أو تنكمش مع إضافة أو إزالة العناصر. هنا، يمكن إضافة العناصر أو إزالتها من كلا طرفي الطابور.
-
-
التكرارات: في
Queue
، يُسمح بالعناصر المكررة، مما يسمح بإدراج عدة نسخ من نفس القيمة -
القيمة الخالية: لا يمكنك إدراج قيمة فارغة في
Queue
لأن بعض طرقQueue
تعيد قيمة فارغة للإشارة إلى أنه فارغ. لتجنب الالتباس، لا يُسمح بالقيم الفارغة. -
الترتيب: يتم إدراج العناصر استنادًا إلى ترتيبها الطبيعي. بالإمكان أيضًا التحكم في ترتيب الإدراج عن طريق تحديد مقارن مخصص.
-
التزامن: لا يتزامن
Queue
بشكل افتراضي. ولكن، يمكنك استخدامConcurrentLinkedQueue
أو تنفيذBlockingQueue
لضمان سلامة التداول بين الخيوط. -
الأساليب الرئيسية: إليك بعض الأساليب الرئيسية لواجهة
Queue
:add(E element)
،offer(E element)
،poll()
، وpeek()
. دعنا نلقي نظرة على كيفية استخدام هذه الأساليب من خلال برنامج مثالي.import java.util.LinkedList; import java.util.Queue; public class QueueExample { public static void main(String[] args) { // إنشاء طابور باستخدام LinkedList Queue<String> queue = new LinkedList<>(); // استخدام الأسلوب add لإدراج العناصر، يقوم بإلقاء استثناء إذا فشل الإدراج queue.add("Element1"); queue.add("Element2"); queue.add("Element3"); // استخدام الأسلوب offer لإدراج العناصر، يرجع false إذا فشل الإدراج queue.offer("Element4"); // عرض الطابور System.out.println("Queue: " + queue); // التطلع إلى العنصر الأول (لا يتم إزالته) String firstElement = queue.peek(); System.out.println("Peek: " + firstElement); // يُخرج "Element1" // سحب العنصر الأول (استرجاعه وإزالته) String polledElement = queue.poll(); System.out.println("Poll: " + polledElement); // يُخرج "Element1" // عرض الطابور بعد السحب System.out.println("Queue after poll: " + queue); } }
-
التنفيذات الشائعة:
LinkedList
،PriorityQueue
،ArrayDeque
-
الأداء: التنفيذات مثل
LinkedList
وArrayDeque
عادةً سريعة في إضافة وإزالة العناصر. يكونPriorityQueue
أبطأ قليلاً لأنه يقوم بإدراج العناصر استنادًا إلى ترتيب الأولوية المحدد.
العملية | LinkedList | PriorityQueue | ArrayDeque |
الإدراج | سريع في البداية أو الوسط – O(1)، بطيء في النهاية – O(n) | أبطأ – O(log n) | سريع – O(1)، بطيء – O(n)، إذا تضمنت تغيير حجم المصفوفة الداخلية |
الحذف | سريع – O(1) إذا كان الموضع معروفًا | أبطأ – O(log n) | سريع – O(1)، بطيء – O(n)، إذا تضمنت تغيير حجم المصفوفة الداخلية |
الاسترجاع | بطيء – O(n) للوصول العشوائي، حيث يتطلب الأمر المرور عبر العناصر | سريع – O(1) | سريع – O(1) |
الخرائط
تمثل Map
مجموعة من الأزواج مفتاح-قيمة، حيث يرتبط كل مفتاح بقيمة واحدة. على الرغم من أن Map
هو جزء من إطار العمل Java Collection، إلا أنه لا يمتد إلى واجهة java.util.Collection
.
-
آلية العمل الداخلية: تعمل
Map
داخليًا باستخدامHashTable
استنادًا إلى مفهوم التجزئة. لقد كتبت مقالًا مفصلًا حول هذا الموضوع، لذا اقرأه لفهم أعمق. -
التكرارات: يخزن
Map
البيانات على شكل أزواج مفتاح-قيمة. هنا، كل مفتاح فريد، لذا لا يُسمح بوجود مفاتيح مكررة. ولكن يُسمح بالقيم المكررة. -
قيمة الـNull: نظرًا لعدم السماح بوجود مفاتيح مكررة، يمكن لـ
Map
أن تحتوي على مفتاح واحد فقط يكون قيمته Null. ونظرًا للسماح بالقيم المكررة، يمكن أن تحتوي على قيم Null متعددة. في تنفيذTreeMap
، لا يمكن أن تكون المفاتيح Null لأنه يقوم بفرز العناصر بناءً على المفاتيح. ومع ذلك، يُسمح بالقيم Null. -
الترتيب: تختلف ترتيب الإدراج في
Map
حسب التنفيذ:-
HashMap
– لا يضمن ترتيب الإدراج حيث يتم تحديدها استنادًا إلى مفهوم التجزئة. -
LinkedHashMap
– يتم الاحتفاظ بترتيب الإدراج ويمكنك استرجاع العناصر بنفس الترتيب الذي تمت إضافته في المجموعة. -
TreeMap
– يتم إدراج العناصر استنادًا إلى ترتيبها الطبيعي. بالإضافة إلى ذلك، يمكنك التحكم في ترتيب الإدراج عن طريق تحديد مقارن مخصص.
-
-
التزامن: لا يتم مزامنة
Map
افتراضيًا. ولكن يمكنك استخدامCollections.synchronizedMap()
أو تنفيذاتConcurrentHashMap
لتحقيق سلامة الخيط. -
الأساليب الرئيسية: هنا بعض الأساليب الرئيسية لواجهة
Map
:put(K key, V value)
،get(Object key)
،remove(Object key)
،containsKey(Object key)
، وkeySet()
. دعنا نلقي نظرة على كيفية استخدام هذه الأساليب مع برنامج مثالي.import java.util.HashMap; import java.util.Map; import java.util.Set; public class MapMethodsExample { public static void main(String[] args) { // إنشاء HashMap جديد Map<String, Integer> map = new HashMap<>(); // put(K key, V value) - يدرج أزواج المفتاح والقيمة في الخريطة map.put("Apple", 1); map.put("Banana", 2); map.put("Orange", 3); // get(Object key) - يعيد القيمة المرتبطة بالمفتاح Integer value = map.get("Banana"); System.out.println("القيمة ل 'Banana': " + value); // remove(Object key) - يزيل زوج المفتاح والقيمة للمفتاح المحدد map.remove("Orange"); // containsKey(Object key) - يتحقق مما إذا كانت الخريطة تحتوي على المفتاح المحدد boolean hasApple = map.containsKey("Apple"); System.out.println("تحتوي على 'Apple': " + hasApple); // keySet() - يعيد عرضًا مجموعة من المفاتيح الموجودة في الخريطة Set<String> keys = map.keySet(); System.out.println("المفاتيح في الخريطة: " + keys); } }
-
تنفيذات شائعة:
HashMap
،LinkedHashMap
،TreeMap
،Hashtable
،ConcurrentHashMap
-
الأداء: تُستخدم تنفيذية
HashMap
على نطاق واسع بشكل رئيسي بسبب سمات أدائه الفعالة الموضحة في الجدول أدناه.
العملية | HashMap | LinkedHashMap | TreeMap |
الإدراج | سريع – O(1) | سريع – O(1) | أبطأ – O(log n) |
الحذف | سريع – O(1) | سريع – O(1) | أبطأ – O(log n) |
الاسترجاع | سريع – O(1) | سريع – O(1) | أبطأ – O(log n) |
فئة الأدوات للمجموعات
كما تم التأكيد في بداية هذه المقالة، تحتوي فئة الأدوات Collections
على عدة طرق ثابتة مفيدة تتيح لك القيام بالعمليات المستخدمة بشكل شائع على عناصر المجموعة. تساعدك هذه الطرق في تقليل الشفرة الزائدة في تطبيقك وتتيح لك التركيز على المنطق التجاري.
وإليك بعض الميزات والطرق الرئيسية، جنبًا إلى جنب مع وظيفتها بإيجاز:
-
الفرز:
Collections.sort(List<T>)
– يُستخدم هذا الطريق لفرز عناصر القائمة بترتيب تصاعدي. -
البحث:
Collections.binarySearch(List<T>, key)
– يتم استخدام هذه الطريقة للبحث عن عنصر محدد في قائمة مرتبة وإرجاع مؤشره. -
ترتيب عكسي:
Collections.reverse(List<T>)
– يتم استخدام هذه الطريقة لعكس ترتيب العناصر في قائمة. -
عمليات الحد الأدنى/الحد الأقصى:
Collections.min(Collection<T>)
وCollections.max(Collection<T>)
– يتم استخدام هذه الطرق للعثور على أقل وأعلى عناصر في مجموعة معينة على التوالي. -
مزامنة:
Collections.synchronizedList(List<T>)
– يتم استخدام هذه الطريقة لجعل قائمة آمنة للاستخدام في الواجهة بتزامنها. -
مجموعات غير قابلة للتعديل:
Collections.unmodifiableList(List<T>)
– يُستخدم هذا الأسلوب لإنشاء عرض للقراءة فقط لقائمة، مما يمنع التعديلات.
هنا برنامج Java عيني يظهر مختلف وظائف فئة الخدمة Collections
:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CollectionsExample {
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>();
numbers.add(5);
numbers.add(3);
numbers.add(8);
numbers.add(1);
// فرز
Collections.sort(numbers);
System.out.println("Sorted List: " + numbers);
// البحث
int index = Collections.binarySearch(numbers, 3);
System.out.println("Index of 3: " + index);
// ترتيب عكسي
Collections.reverse(numbers);
System.out.println("Reversed List: " + numbers);
// عمليات الحد الأدنى/الحد الأقصى
int min = Collections.min(numbers);
int max = Collections.max(numbers);
System.out.println("Min: " + min + ", Max: " + max);
// تزامن
List<Integer> synchronizedList = Collections.synchronizedList(numbers);
System.out.println("Synchronized List: " + synchronizedList);
// مجموعات غير قابلة للتعديل
List<Integer> unmodifiableList = Collections.unmodifiableList(numbers);
System.out.println("Unmodifiable List: " + unmodifiableList);
}
}
يظهر هذا البرنامج فرزًا، بحثًا، عكسًا، العثور على القيم الدنيا والقصوى، التزامن، وإنشاء قائمة غير قابلة للتعديل باستخدام فئة الخدمة Collections
.
الاستنتاج
في هذه المقالة، تعلمت عن إطار Java Collections وكيف يساعد في إدارة مجموعات الكائنات في تطبيقات Java. استكشفنا أنواع مجموعات مختلفة مثل القوائم، المجموعات، الطوابير، والخرائط واكتسبنا رؤية في بعض الخصائص الرئيسية وكيف تدعم كل من هذه الأنواع.
لقد تعلمت عن الأداء، التزامن، والأساليب الرئيسية، مكتسبًا رؤى قيمة في اختيار الهياكل البيانات الصحيحة لاحتياجاتك.
من خلال فهم هذه المفاهيم، يمكنك الاستفادة الكاملة من إطار الجمعيات في جافا، مما يتيح لك كتابة رمز أكثر كفاءة وبناء تطبيقات قوية.
إذا وجدت هذه المقالة مثيرة للاهتمام، فلا تتردد في الاطلاع على مقالاتي الأخرى على freeCodeCamp والتواصل معي على LinkedIn.
Source:
https://www.freecodecamp.org/news/java-collections-framework-reference-guide/