مقدمة
سبب تقديم تعزيز للحلقات: في الإصدارات السابقة من JDK5 ، من المثير للقلق أكثر إزعاجًا عناصر في صفيف أو مجموعة وتكرار طول المصفوفة أو المجموعة.
يتم تعريف بناء الجملة الجديد في JDK5 - محسّن للحلقات لتبسيط هذه العمليات. لا يمكن استخدام الحلقات إلا في المصفوفات أو المجموعات التي تنفذ واجهات مبهجة.
تنسيق بناء الجملة:
لـ (متغير النوع المتغير: صفيف أو مجموعة يجب تكرارها) {
}
في Java ، فإن اجتياز المجموعات والصفائف بشكل عام لها النماذج الثلاثة التالية:
لـ (int i = 0 ؛ i <list.size () ؛ i ++) {system.out.print (list.get (i)+"،") ؛} iterator iterator = list.iterator () ؛ بينما (iterator.hasnext ()) {system.out.print (iterator.next () + "،") ؛} لـ (integer i: list) {system.out.print (i + "،") ؛} الأول عادي بالنسبة لتجاوز الحلقة ، والثاني هو استخدام التكرار للتجبر ، والثالث يسمى عمومًا محسّنًا للحلقة (لكل منهما).
مبدأ التنفيذ
يمكن ملاحظة أن النموذج الثالث هو السكر النحوي الذي توفره Java. نحن هنا نحلل كيف يتم تنفيذ هذا التعزيز للحلقة في الطبقة الأساسية.
نحن نفقد الرمز التالي:
لـ (integer i: list) {system.out.println (i) ؛}بعد فك الارتباط:
integer i ؛ for (iterator iterator = list.iterator () ؛ iterator.hasnext () ؛ system.out.println (i)) {i = (integer) iterator.next () ؛ } الرمز المعدل في الواقع معقد للغاية ، لذلك دعونا نقسمه بترتيب التنفيذ:
عدد صحيح أنا ؛ يحدد متغير مؤقت أنا
iterator iterator = list.iterator () ؛ احصل على التكرار في القائمة
iterator.hasnext () ؛ يحدد ما إذا كانت هناك عناصر غير محسوسة في التكرار
i = (integer) iterator.next () ؛ احصل على العنصر الأول غير المشترك وقم بتعيينه إلى المتغير المؤقت i
System.out.println (i) يخرج قيمة المتغير المؤقت i
هذه الدورات حتى يتم اجتياز جميع العناصر في القائمة.
من خلال فك الإلغاء ، نرى أن الطبقة الأساسية من المحسّنة للحلقات في Java يتم تنفيذها بالفعل من خلال نمط Iterator.
حفرة تعزيز الحلقة
يقال إن هذا هو الحفرة في تعزيز الحلقة ، ولكن في الواقع لأن بعض الأشخاص قد يدخلون في الحفرة في مبدأ التنفيذ لتعزيز الحلقة.
نظرًا لأن تعزيز الحلقة يتم تنفيذها من خلال التكرار ، يجب أن يكون له خصائص التكرار.
هناك آلية فاشلة سريعة في جافا. عند استخدام جهاز التكرار لاجتياز العناصر ، يجب أن تكون حذراً عند حذف المجموعة. إذا كنت تستخدمه بشكل غير صحيح ، فقد يحدث ConversIdificationException. هذا استثناء وقت التشغيل ولن يحدث خلال فترة التجميع. سوف ينفجر فقط عند تشغيل البرنامج بالفعل.
كما في الكود التالي:
لـ (الطالب Stu: الطلاب) {if (stu.getId () == 2) students.remove (stu) ؛ }سيتم طرح استثناء ConcurrentModificationException.
يعمل ITerator في موضوع منفصل ولديه قفل Mutex. بعد إنشاء التكرار ، يشير جدول فهرس الوصلة الواحدة إلى الكائن الأصلي. عندما يتغير عدد الكائنات الأصلية ، لن يتغير محتوى جدول الفهرس هذا بشكل متزامن ، لذلك عندما يتحرك مؤشر الفهرس للخلف ، لا يمكن العثور على الكائن إلى التكرار ، لذلك وفقًا لمبدأ الفشل ، سيتم طرح ITERATAR على الفور.
java.util.ConcurrentModificationexception استثناء.
لذلك ، لا يسمح التكرار بتغيير الكائنات المتكررة عندما يعمل.
ولكن يمكنك استخدام طريقة التكرار الخاصة بـ remove() لحذف الكائن. ستحافظ طريقة Iterator.remove() على اتساق الفهرس مع حذف الكائن المتكرر الحالي.
حذف العناصر بشكل صحيح أثناء العبور:
iterator <Tudent> stuiter = students.iterator () ؛ بينما (stuiter.hasnext ()) {student student = stuiter.next () ؛ if (student.getID () == 2) stuiter.remove () ؛ // هنا تحتاج إلى استخدام طريقة إزالة التكرار لإزالة الكائن الحالي. إذا كنت تستخدم طريقة إزالة القائمة ، فسيظهر ConversIdificationException أيضًا} حسنًا ، سأقدم لك هنا مبدأ التنفيذ المتمثل في تعزيز الحلقة والمخاطر التي قد تقع فيها إذا كنت تستخدمها بشكل غير صحيح. لذلك ، على الرغم من أنها بناء جملة بسيط من أجل EAC ، يجب عليك أيضًا فهم مبادئها ، وإلا فقد يؤدي ذلك إلى بعض المشكلات التي لا يمكن تفسيرها.
لخص
ما سبق هو المحتوى الكامل لهذه المقالة. آمل أن يكون لمحتوى هذه المقالة قيمة مرجعية معينة لدراسة أو عمل الجميع. إذا كان لديك أي أسئلة ، فيمكنك ترك رسالة للتواصل. شكرا لك على دعمك إلى wulin.com.