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

วิธีใช้ removeAll() ใน CopyOnWriteArraySet ของ Android

ภาพรวมของ CopyOnWriteArraySet

CopyOnWriteArraySet เป็น Set ที่ thread-safe ตัวแปรของ ArrayList ทุกครั้งที่มีการเปลี่ยนแปลง (add, set, remove) จะสร้างสำเนา Array ใหม่ เหมาะสำหรับการอ่านมาก เขียนน้อย (read-heavy, write-rare)

ตัวอย่างการใช้งาน removeAll()

ตัวอย่างนี้สาธิตเมธอด removeAll(Collection<?> c) ซึ่งลบสมาชิกทั้งหมดที่อยู่ใน Collection ที่ระบุ

ขั้นตอนที่ 1-2: สร้างโปรเจกต์และ Layout

สร้างโปรเจกต์ใหม่ ใช้ Layout TextView

ขั้นตอนที่ 3: โค้ด Java

package com.example.myapplication;

import android.os.Build;
import android.os.Bundle;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;
import java.util.Arrays;
import java.util.concurrent.CopyOnWriteArraySet;

public class MainActivity extends AppCompatActivity {
    CopyOnWriteArraySet<String> copyOnWriteArraySet;

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        copyOnWriteArraySet = new CopyOnWriteArraySet<>();
        final TextView actionEvent = findViewById(R.id.actionEvent);
        
        copyOnWriteArraySet.add("sai");
        copyOnWriteArraySet.add("ram");
        copyOnWriteArraySet.add("krishna");
        copyOnWriteArraySet.add("prasad");
        copyOnWriteArraySet.add("ram");  // Set ไม่รับค่าซ้ำ จะเก็บแค่ 1 "ram"
        
        actionEvent.setText("" + copyOnWriteArraySet);
        
        actionEvent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // ลบทุกค่าที่อยู่ใน Array นี้
                String[] strings = {"krishna", "ram"};
                copyOnWriteArraySet.removeAll(Arrays.asList(strings));
                actionEvent.setText("" + copyOnWriteArraySet);
            }
        });
    }
}

พฤติกรรมของ CopyOnWriteArraySet

  • เป็น Set - ไม่อนุญาตค่าซ้ำ (Duplicate)
  • เพิ่ม "ram" 2 ครั้ง → เก็บได้แค่ 1 ตัว
  • ลำดับการเก็บ: ตามลำดับที่เพิ่ม (Insertion order)
  • Thread-safe - ทุกการดำเนินการเขียนสร้าง Array ใหม่

ตัวอย่างข้อมูล

ก่อน add: []
เพิ่ม: sai, ram, krishna, prasad, ram (ซ้ำ)
Set จริง: [sai, ram, krishna, prasad]  // "ram" ตัวที่ 2 ถูกตัดทิ้ง

ก่อน removeAll: [sai, ram, krishna, prasad]
removeAll(["krishna", "ram"])
หลัง removeAll: [sai, prasad]

removeAll() vs remove() vs clear()

เมธอดคำอธิบายคืนค่า
removeAll(Collection)ลบสมาชิกทั้งหมดที่อยู่ใน Collection ที่ให้มาboolean (true หากมีการเปลี่ยนแปลง)
remove(Object)ลบสมาชิกตัวเดียวที่ระบุboolean
clear()ลบสมาชิกทั้งหมดvoid
retainAll(Collection)เก็บเฉพาะสมาชิกที่อยู่ใน Collection ที่ให้มา (ลบอื่นๆ)boolean

⚠️ ประสิทธิภาพ (Performance)

⚠️ หมายเหตุ: CopyOnWriteArraySet ทุกครั้งที่ removeAll() จะ สร้าง Array ใหม่ทั้งหมด (Copy-on-write) เหมาะสำหรับ:
  • การอ่านมาก (Iteration บ่อย)
  • การเขียนน้อย (Add/Remove นานครั้ง)
  • ข้อมูลไม่มากเกินไป (Array copy cost)
หากเขียนบ่อย ควรพิจารณา ConcurrentHashMap.newKeySet() แทน

วิธีทดสอบ

  1. รันแอป ดู Set: [sai, ram, krishna, prasad]
  2. คลิก TextView → เรียก removeAll(["krishna", "ram"])
  3. ผลลัพธ์: [sai, prasad]

กรณีใช้งานจริง

  • Listener/Observer pattern - เก็บ Listener แบบ Thread-safe
  • Cache keys ที่ต้องการลบหลายรายการพร้อมกัน
  • Whitelist/Blacklist management