Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

ลบข้อมูลทั้งหมดจาก ArrayList ใน Java (clear method)

เมธอด 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);
}