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

Cách sử dụng removeFirst() trong LinkedBlockingDeque trên Android

Giới thiệu về removeFirst()

removeFirst() lấy và xóa phần tử đầu tiên (head) của deque. Nếu deque rỗng, ném NoSuchElementException.

Khác với poll() trả về null khi rỗng, removeFirst() dùng khi bạn chắc chắn deque không rỗng.

Ví dụ minh họa

Bước 1: Tạo project

Android Studio → File → New Project.

Bước 2: Layout

<?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: Code (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.LinkedBlockingDeque;

public class MainActivity extends AppCompatActivity {
    LinkedBlockingDeque<String> linkedBlockingDeque;

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

        linkedBlockingDeque = new LinkedBlockingDeque<>();
        final TextView actionEvent = findViewById(R.id.actionEvent);

        linkedBlockingDeque.add("sai");
        linkedBlockingDeque.add("ram");
        linkedBlockingDeque.add("krishna");
        linkedBlockingDeque.add("prasad");
        linkedBlockingDeque.add("ram");

        actionEvent.setText("" + linkedBlockingDeque);

        actionEvent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // removeFirst() lấy VÀ xóa phần tử đầu
                linkedBlockingDeque.removeFirst();
                actionEvent.setText("" + linkedBlockingDeque);
            }
        });
    }
}

Kết quả

Ban đầu: [sai, ram, krishna, prasad, ram]

Click 1: [ram, krishna, prasad, ram]

Click 2: [krishna, prasad, ram]

... đến khi rỗng, click tiếp → Crash: NoSuchElementException

Xử lý an toàn

actionEvent.setOnClickListener(v -> {
    if (!linkedBlockingDeque.isEmpty()) {
        linkedBlockingDeque.removeFirst();
        actionEvent.setText("" + linkedBlockingDeque);
    } else {
        actionEvent.setText("Deque rỗng!");
    }
});

Hoặc dùng poll() an toàn hơn

String removed = linkedBlockingDeque.poll(); // Trả về null nếu rỗng
if (removed != null) {
    actionEvent.setText("Đã xóa: " + removed + "\n" + linkedBlockingDeque);
} else {
    actionEvent.setText("Deque rỗng");
}

So sánh các phương thức xóa đầu

Phương thức Rỗng Trả về Blocking (bounded)
removeFirst() Ném NoSuchElementException E Không
poll() / pollFirst() Trả về null E hoặc null Không
take() / takeFirst() Block vô hạn E Có

removeFirst() vs remove()

// Tương đương nhau
deque.removeFirst();
deque.remove(); // Mặc định xóa head

Ứng dụng - Queue xử lý task FIFO

LinkedBlockingDeque<Task> taskQueue = new LinkedBlockingDeque<>();

// Producer
taskQueue.addLast(new Task("Low priority"));
taskQueue.addFirst(new Task("High priority")); // Ưu tiên cao

// Consumer
while (!taskQueue.isEmpty()) {
    Task task = taskQueue.removeFirst(); // Xử lý theo thứ tự
    task.execute();
}

Lưu ý

  • Luôn kiểm tra isEmpty() trước khi gọi removeFirst()
  • Thread-safe cho đa luồng
  • Có overload removeFirstOccurrence(Object) xóa theo giá trị
  • Phù hợp cho pattern Queue/Deque xử lý tuần tự