เมธอด clear() ของ ArrayList ใช้ลบ ทุก elements ออกจากลิสต์ ทำให้ขนาด (size) กลายเป็น 0 แต่ ความจุ (capacity) คงเดิม
Syntax
public void clear()
- ไม่มี parameter
- ไม่คืนค่า (void)
- Time complexity: O(n) - ต้อง null out ทุก element reference
ตัวอย่างเต็ม
import java.util.ArrayList;
public class Demo {
public static void main(String[] args) {
ArrayList<Integer> arrlist = new ArrayList<>(5); // initial capacity 5
// เพิ่มข้อมูล
arrlist.add(25);
arrlist.add(50);
arrlist.add(75);
arrlist.add(100);
arrlist.add(150);
arrlist.add(200);
arrlist.add(250); // capacity จะขยายอัตโนมัติ
System.out.println("Before clear:");
for (Integer number : arrlist) {
System.out.println("Number = " + number);
}
int retval = arrlist.size();
System.out.println("List consists of " + retval + " elements");
System.out.println("Performing clear operation!!");
arrlist.clear();
retval = arrlist.size();
System.out.println("Now, list consists of " + retval + " elements");
// Capacity ยังคงเดิม (internal array ไม่ถูก resize)
System.out.println("Capacity unchanged (internal): ~" + getCapacity(arrlist));
}
// Helper เพื่อดู capacity (ใช้ reflection)
private static int getCapacity(ArrayList<?> list) {
try {
java.lang.reflect.Field field = ArrayList.class.getDeclaredField("elementData");
field.setAccessible(true);
Object[] elementData = (Object[]) field.get(list);
return elementData.length;
} catch (Exception e) {
return -1;
}
}
}
Output
Before clear: Number = 25 Number = 50 Number = 75 Number = 100 Number = 150 Number = 200 Number = 250 List consists of 7 elements Performing clear operation!! Now, list consists of 0 elements Capacity unchanged (internal): ~10
clear() vs removeAll() vs new ArrayList()
| วิธี | คำอธิบาย | Capacity | Performance |
|---|---|---|---|
list.clear() |
ลบ elements ทั้งหมด in-place | คงเดิม | O(n) - เร็วที่สุดสำหรับ reuse list |
list.removeAll(list) |
ลบ elements ทั้งหมด (ผ่าน Collection) | คงเดิม | O(n²) - ช้ากว่า มี overhead |
list = new ArrayList<>() |
สร้าง list ใหม่ทิ้งเก่า | Reset เป็น default (10) | O(1) แต่ GC ต้องเก็บเก่า |
list.removeIf(e -> true) |
ลบด้วย predicate (Java 8+) | คงเดิม | O(n) - เหมือน clear() |
เมื่อไหร่ควรใช้ clear()?
- ต้องการ reuse ArrayList instance เดียวกัน (หลีกเลี่ยง object allocation)
- ใน loop ที่ process batches:
list.clear(); list.addAll(nextBatch); - Memory-sensitive contexts: คง capacity ไว้ป้องกัน reallocation
ข้อควรระวัง
- ConcurrentModificationException - หาก iterate พร้อม clear() จาก thread อื่น
- Iterator/ListIterator ที่สร้างก่อน clear() จะเป็น invalid
- References จากภายนอกไปยัง elements เดิมยังคงอยู่ (ไม่ถูก null out อัตโนมัติ)
ตัวอย่างการใช้ใน Batch Processing
List<Task> batch = new ArrayList<>(1000);
while (hasMoreTasks()) {
batch.clear(); // reuse list, avoid GC pressure
batch.addAll(fetchNextBatch(1000));
processBatch(batch);
}