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ọiremoveFirst() - 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ự