Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Cách sử dụng retainAll() trong CopyOnWriteArraySet trên Android

Giới thiệu về CopyOnWriteArraySet

CopyOnWriteArraySet là một biến thể an toàn cho luồng (thread-safe) của ArrayList. Các phép toán như add, set được thực hiện bằng cách tạo một bản sao mới của mảng cơ sở. Điều này đảm bảo tính an toàn khi nhiều luồng truy cập đồng thời.

Ví dụ sử dụng phương thức retainAll()

Phương thức retainAll() chỉ giữ lại các phần tử có trong collection được chỉ định, loại bỏ các phần tử khác.

Bước 1: Tạo dự án mới

Tạo dự án Android mới trong Android Studio như bình thường.

Bước 2: Giao diện (res/layout/activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:app="https://schemas.android.com/apk/res-auto"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/actionEvent"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_marginTop="30dp"
        android:textSize="40sp" />

</LinearLayout>

Bước 3: Logic xử lý (src/MainActivity.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);
        
        // Thêm các phần tử (lưu ý: "ram" bị trùng lặp, Set sẽ chỉ giữ 1)
        copyOnWriteArraySet.add("sai");
        copyOnWriteArraySet.add("ram");
        copyOnWriteArraySet.add("krishna");
        copyOnWriteArraySet.add("prasad");
        copyOnWriteArraySet.add("ram"); // Bị loại bỏ do trùng lặp
        
        actionEvent.setText("" + copyOnWriteArraySet);
        
        actionEvent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Chỉ giữ lại "krishna" và "ram"
                String[] strings = {"krishna", "ram"};
                copyOnWriteArraySet.retainAll(Arrays.asList(strings));
                actionEvent.setText("" + copyOnWriteArraySet);
            }
        });
    }
}

Kết quả chạy ứng dụng

Ban đầu: [sai, ram, krishna, prasad] (phần tử "ram" trùng lặp chỉ hiện 1 lần)

Sau khi click TextView (gọi retainAll): [ram, krishna] - chỉ còn lại 2 phần tử được chỉ định trong mảng strings.

Lưu ý quan trọng

  • CopyOnWriteArraySet không cho phép phần tử trùng lặp (tính chất của Set)
  • retainAll() thay đổi tập hợp hiện tại, chỉ giữ lại các phần tử có trong collection tham số
  • An toàn cho luồng - phù hợp cho môi trường đa luồng