ใช่เพราะนั่นไม่ใช่วิธีที่คุณลบช่วงออกจากโค้ดภายนอก ให้ทำสิ่งนี้แทน:
list.subList(start, end).clear();
นี่เรียกremoveRangeเบื้องหลังจริงๆ †
OP ถามว่าเหตุใดจึงremoveRangeไม่เป็นส่วนหนึ่งของListAPI สาธารณะ เหตุผลได้อธิบายไว้ใน Item 40 ของ Effective Java 2nd ed และฉันอ้างถึงที่นี่:
มีสามเทคนิคในการตัดทอนรายการพารามิเตอร์ที่ยาวเกินไป วิธีหนึ่งคือการแยกวิธีการออกเป็นหลายวิธีซึ่งแต่ละวิธีต้องการเพียงส่วนย่อยของพารามิเตอร์ หากทำอย่างไม่ระมัดระวังสิ่งนี้อาจนำไปสู่วิธีการต่างๆมากเกินไป แต่ก็สามารถช่วยลดจำนวนวิธีได้โดยการเพิ่มมุมฉาก ตัวอย่างเช่นพิจารณาjava.util.Listอินเทอร์เฟซ ไม่มีวิธีการในการค้นหาดัชนีแรกหรือตัวสุดท้ายขององค์ประกอบในรายการย่อยซึ่งทั้งสองอย่างจะต้องใช้พารามิเตอร์สามตัว แต่จะให้subListวิธีการซึ่งรับสองพารามิเตอร์และส่งกลับมุมมองของรายการย่อย วิธีนี้สามารถใช้ร่วมกับindexOfหรือlastIndexOfวิธีการซึ่งแต่ละพารามิเตอร์มีพารามิเตอร์เดียวเพื่อให้ได้ฟังก์ชันที่ต้องการ ยิ่งไปกว่านั้นsubListวิธีการสามารถใช้ร่วมกับวิธีการใด ๆที่ดำเนินการบนListอินสแตนซ์เพื่อทำการคำนวณตามอำเภอใจในรายการย่อย API ที่ได้มีอัตราส่วนกำลังต่อน้ำหนักสูงมาก
เราสามารถโต้แย้งได้ว่าremoveRangeไม่มีพารามิเตอร์จำนวนมากดังนั้นจึงอาจไม่ใช่ตัวเลือกสำหรับการรักษานี้ แต่เนื่องจากมีวิธีเรียกใช้removeRangeผ่านทางsubListจึงไม่มีเหตุผลที่จะทำให้Listอินเทอร์เฟซยุ่งเหยิงด้วยวิธีการซ้ำซ้อน
†AbstractList.removeRangeเอกสารพูดว่า:
วิธีนี้เรียกโดยการclearดำเนินการในรายการนี้และรายการย่อย เอาชนะวิธีการนี้จะใช้ประโยชน์จาก internals ของการดำเนินรายการที่สามารถอย่างมีนัยสำคัญในการปรับปรุงประสิทธิภาพของclearการดำเนินงานในรายการนี้และรายการย่อยของ
นอกจากนี้โปรดดูการนำ OpenJDK ไปใช้AbstractList.clearและSubList.removeRange.