Tìm hiểu CopyOnWriteArraySet
CopyOnWriteArraySet là một tập hợp (Set) an toàn cho luồng, được hỗ trợ bởi một CopyOnWriteArrayList bên dưới. Nó không cho phép các phần tử trùng lặp và phù hợp cho các kịch bản đọc nhiều, ghi ít.
Ví dụ: Kiểm tra sự tồn tại của nhiều phần tử với containsAll()
Phương thức containsAll(Collection<?> c) trả về true nếu tập hợp chứa tất cả các phần tử trong collection được truyền vào.
Bước 1: Tạo dự án
Tạo project mới trong Android Studio (File → New Project).
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 chính (MainActivity.java)
package com.example.myapplication;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import android.widget.TextView;
import java.util.Arrays;
import java.util.concurrent.CopyOnWriteArraySet;
public class MainActivity extends AppCompatActivity {
private 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 phần tử (trùng lặp "ram" sẽ bị bỏ qua)
copyOnWriteArraySet.add("sai");
copyOnWriteArraySet.add("ram");
copyOnWriteArraySet.add("krishna");
copyOnWriteArraySet.add("prasad");
copyOnWriteArraySet.add("ram");
actionEvent.setText(copyOnWriteArraySet.toString());
// Xử lý sự kiện click để kiểm tra containsAll
actionEvent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String[] strings = {"krishna", "ram"};
boolean result = copyOnWriteArraySet.containsAll(Arrays.asList(strings));
actionEvent.setText("Kết quả containsAll: " + result); // true
}
});
}
}
Kết quả
- Lần đầu: Hiển thị set
[sai, ram, krishna, prasad](không trùng lặp). - Sau khi click TextView: Hiển thị
Kết quả containsAll: truevì cả "krishna" và "ram" đều có trong set.