คำนำ
เหตุผลในการแนะนำการปรับปรุงสำหรับลูป: ในรุ่นก่อนหน้าของ JDK5 มันเป็นปัญหามากขึ้นในการสำรวจองค์ประกอบในอาร์เรย์หรือคอลเลกชันและตัววนซ้ำของความยาวอาร์เรย์หรือคอลเลกชัน
ไวยากรณ์ใหม่ถูกกำหนดไว้ใน JDK5 - ปรับปรุงสำหรับลูปเพื่อทำให้การดำเนินการดังกล่าวง่ายขึ้น ปรับปรุงสำหรับลูปสามารถใช้กับอาร์เรย์หรือคอลเลกชันที่ใช้อินเตอร์เฟสที่ใช้งานได้
รูปแบบไวยากรณ์:
สำหรับ (ตัวแปรประเภทตัวแปร: อาร์เรย์หรือคอลเลกชันที่ต้องทำซ้ำ) {
-
ในชวาคอลเลกชันและอาร์เรย์โดยทั่วไปมีสามรูปแบบต่อไปนี้:
สำหรับ (int i = 0; i <list.size (); i ++) {system.out.print (list.get (i)+",");} iterator iterator = list.iterator (); ในขณะที่ (iterator.hasnext ()) {system.out.print (iterator.next () + ",");} สำหรับ (จำนวนเต็ม i: list) {system.out.print (i + ",");}; สิ่งแรกคือธรรมดาสำหรับการสำรวจแบบวนรอบที่สองคือการใช้ตัววนซ้ำสำหรับการเดินทางข้ามและที่สามโดยทั่วไปเรียกว่าการปรับปรุงสำหรับลูป (สำหรับแต่ละ)
หลักการดำเนินการ
จะเห็นได้ว่ารูปแบบที่สามคือน้ำตาลวากยสัมพันธ์ที่จัดทำโดย Java ที่นี่เราวิเคราะห์ว่าสิ่งนี้ปรับปรุงสำหรับลูปถูกนำไปใช้ในเลเยอร์พื้นฐานได้อย่างไร
เราสลายรหัสต่อไปนี้:
สำหรับ (จำนวนเต็ม i: รายการ) {system.out.println (i);}หลังจากการสลายตัว:
จำนวนเต็ม i; สำหรับ (iterator iterator = list.iterator (); iterator.hasnext (); system.out.println (i)) {i = (จำนวนเต็ม) iterator.next (); - รหัสที่ถอดรหัสนั้นค่อนข้างซับซ้อนดังนั้นเรามาทำลายมันตามลำดับของการดำเนินการ:
จำนวนเต็ม i; กำหนดตัวแปรชั่วคราว i
ตัววนซ้ำ iterator = list.iterator (); รับตัววนซ้ำของรายการ
iterator.hasnext (); กำหนดว่ามีองค์ประกอบที่ไม่ได้รับความสนใจในตัววนซ้ำหรือไม่
i = (จำนวนเต็ม) iterator.next (); รับองค์ประกอบแรกที่ไม่ได้รับความสนใจและกำหนดให้กับตัวแปรชั่วคราว i
System.out.println (i) ส่งออกค่าของตัวแปรชั่วคราว i
รอบนี้จนกว่าองค์ประกอบทั้งหมดในรายการจะถูกสำรวจ
ผ่านการสลายตัวเราจะเห็นว่าชั้นพื้นฐานของการปรับปรุงสำหรับลูปใน Java นั้นถูกนำไปใช้จริงผ่านรูปแบบตัววนซ้ำ
หลุมของการเสริมสร้างการวนรอบ
นี่คือหลุมในการปรับปรุงสำหรับลูป แต่จริงๆแล้วมันเป็นเพราะบางคนอาจก้าวเข้าสู่หลุมในหลักการดำเนินการของการปรับปรุงสำหรับลูป
เนื่องจากการปรับปรุงสำหรับลูปถูกนำไปใช้ผ่านตัววนซ้ำจึงต้องมีลักษณะของตัววนซ้ำ
มีกลไกที่ล้มเหลวอย่างรวดเร็วในชวา เมื่อใช้ตัววนซ้ำเพื่อสำรวจองค์ประกอบคุณต้องระมัดระวังเมื่อลบคอลเลกชัน หากคุณใช้มันอย่างไม่เหมาะสมอาจเกิดขึ้นพร้อมกัน นี่เป็นข้อยกเว้นรันไทม์และจะไม่เกิดขึ้นในช่วงระยะเวลาการรวบรวม มันจะระเบิดเฉพาะเมื่อโปรแกรมทำงานจริง
ในรหัสต่อไปนี้:
สำหรับ (นักเรียน Stu: นักเรียน) {ถ้า (stu.getId () == 2) นักเรียน REMOVE (Stu); -ข้อยกเว้นที่เกิดขึ้นพร้อมกัน Exception จะถูกโยนลงไป
Iterator ทำงานในเธรดแยกต่างหากและมีล็อค mutex หลังจากสร้างตัววนซ้ำตารางดัชนีลิงค์เดียวที่ชี้ไปที่วัตถุต้นฉบับจะถูกสร้างขึ้น เมื่อจำนวนวัตถุดั้งเดิมเปลี่ยนแปลงเนื้อหาของตารางดัชนีนี้จะไม่เปลี่ยนแปลงแบบซิงโครนัสดังนั้นเมื่อตัวชี้ดัชนีเคลื่อนที่ไปข้างหลังวัตถุที่จะวนซ้ำไม่สามารถพบได้ดังนั้นตามหลักการที่ล้มเหลวอย่างรวดเร็ว
java.util.concurrentModificationException ยกเว้น
ดังนั้นตัววนซ้ำไม่อนุญาตให้มีการเปลี่ยนแปลงวัตถุที่วนซ้ำเมื่อมันทำงาน
แต่คุณสามารถใช้วิธีการของตัวเอง remove() เพื่อลบวัตถุ วิธี Iterator.remove() จะรักษาความสอดคล้องของดัชนีในขณะที่การลบวัตถุที่วนซ้ำในปัจจุบัน
ลบองค์ประกอบอย่างถูกต้องในขณะที่ข้าม:
ตัววนซ้ำ <student> stuiter = students.iterator (); ในขณะที่ (stuiter.hasnext ()) {นักเรียนนักเรียน = stuiter.next (); ถ้า (student.getId () == 2) stuiter.remove (); // ที่นี่คุณต้องใช้วิธีการลบของตัววนซ้ำเพื่อลบวัตถุปัจจุบัน หากคุณใช้วิธีการลบรายการรายการพร้อมกัน Exception จะปรากฏขึ้น} ตกลงที่นี่ฉันจะแนะนำให้คุณรู้จักกับหลักการดำเนินการของการปรับปรุงสำหรับการวนรอบและข้อผิดพลาดที่คุณอาจตกอยู่ในถ้าคุณใช้มันอย่างไม่เหมาะสม ดังนั้นแม้ว่ามันจะเป็นไวยากรณ์ที่ง่ายสำหรับการสอบใด ๆ แต่คุณต้องเข้าใจหลักการของมันไม่เช่นนั้นอาจนำไปสู่ปัญหาที่อธิบายไม่ได้
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าเนื้อหาของบทความนี้จะมีค่าอ้างอิงบางอย่างสำหรับการศึกษาหรือที่ทำงานของทุกคน หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร ขอบคุณสำหรับการสนับสนุน Wulin.com