ใช่เพราะนั่นไม่ใช่วิธีที่คุณลบช่วงออกจากโค้ดภายนอก ให้ทำสิ่งนี้แทน:
list.subList(start, end).clear();
นี่เรียกremoveRange
เบื้องหลังจริงๆ †
OP ถามว่าเหตุใดจึงremoveRange
ไม่เป็นส่วนหนึ่งของList
API สาธารณะ เหตุผลได้อธิบายไว้ใน 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
.