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
CopyOnWriteArraySetkhô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