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

Cách dùng addIfAbsent() trong CopyOnWriteArrayList Android

Giới thiệu về CopyOnWriteArrayList

CopyOnWriteArrayList là list thread-safe, copy-on-write. Phương thức addIfAbsent(E e) (API 21+) thêm phần tử chỉ khi nó chưa tồn tại trong list (so sánh bằng equals()). Trả về true nếu thêm thành công, false nếu đã tồn tại. Thao tác nguyên tử (atomic).

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

Mở Android Studio, chọn File → New Project, điền thông tin cần thiết.

Bước 2: Thiết kế 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:gravity="center"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">

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

</LinearLayout>

Bước 3: Viết logic (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.concurrent.CopyOnWriteArrayList;

public class MainActivity extends AppCompatActivity {
    CopyOnWriteArrayList<String> copyOnWriteArrayList;

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        copyOnWriteArrayList = new CopyOnWriteArrayList<>();
        final TextView actionEvent = findViewById(R.id.actionEvent);

        copyOnWriteArrayList.add("sai");
        copyOnWriteArrayList.add("ram");
        copyOnWriteArrayList.add("krishna");
        copyOnWriteArrayList.add("prasad");
        copyOnWriteArrayList.add("ram"); // Trùng lặp cho phép với add()

        actionEvent.setText(copyOnWriteArrayList.toString());

        actionEvent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Thêm "new element" chỉ nếu chưa có
                boolean added = copyOnWriteArrayList.addIfAbsent("new element");
                actionEvent.setText("Added: " + added + "\n" + copyOnWriteArrayList.toString());

                // Thử thêm "ram" (đã có) - sẽ trả về false
                // boolean added2 = copyOnWriteArrayList.addIfAbsent("ram");
            }
        });
    }
}

Chạy ứng dụng

Kết nối thiết bị (API 21+) và chạy ứng dụng.

Cách dùng addIfAbsent() trong CopyOnWriteArrayList Android

Nhấn vào TextView để addIfAbsent:

Cách dùng addIfAbsent() trong CopyOnWriteArrayList Android

So sánh add() vs addIfAbsent():
Phương thứcCho phép trùng?Trả vềAtomic?
add(e)Cóboolean (luôn true)Có
addIfAbsent(e)Khôngboolean (true nếu thêm mới)Có
Ứng dụng: Tránh duplicate khi nhiều luồng cùng thêm (ví dụ: đăng ký listener, cache key). Hiệu năng O(n) do phải duyệt kiểm tra.