Vector vs ArrayList
Vector là class legacy (từ Java 1.0), đồng bộ hóa (thread-safe) nên chậm hơn ArrayList. Android khuyến nghị dùng ArrayList trừ khi cần thread-safe. Tuy nhiên, ArrayAdapter chấp nhận bất kỳ List nào, bao gồm Vector.
Ví dụ sử dụng Vector
MainActivity.java
package com.example.vectordemo;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.util.Vector;
public class MainActivity extends AppCompatActivity {
EditText name;
ArrayAdapter<String> adapter;
Vector<String> vectorList;
ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
vectorList = new Vector<>();
name = findViewById(R.id.name);
listView = findViewById(R.id.listView);
findViewById(R.id.refresh).setOnClickListener(v -> {
if (adapter != null) {
adapter.notifyDataSetChanged();
}
});
findViewById(R.id.save).setOnClickListener(v -> {
String input = name.getText().toString().trim();
if (!input.isEmpty()) {
vectorList.add(input);
// Tạo adapter mới từ vectorList
adapter = new ArrayAdapter<>(this,
android.R.layout.simple_list_item_1, vectorList);
listView.setAdapter(adapter);
Toast.makeText(this, "Đã thêm", Toast.LENGTH_SHORT).show();
} else {
name.setError("Nhập tên");
}
});
}
}
Giao diện activity_main.xml
Giống các ví dụ trước: 1 EditText, 2 Button (Lưu, Làm mới), 1 ListView.
Điểm khác biệt với ArrayList
| Đặc điểm | Vector | ArrayList |
|---|---|---|
| Thread-safe | Có (tất cả method synchronized) | Không |
| Hiệu năng | Chậm hơn do synchronization | Nhanh hơn |
| Tăng dung lượng | Mặc định gấp đôi (2x) | Mặc định 1.5x |
| API hiện đại | Legacy, ít cập nhật | Tiêu chuẩn, khuyến nghị |
Khi nào nên dùng Vector?
- Code cũ (legacy) đã dùng Vector.
- Chia sẻ list giữa nhiều thread không dùng đồng bộ hóa bên ngoài.
- Tương thích API cũ yêu cầu Vector.
Best practice Android
// Thay vì Vector, dùng ArrayList + Collections.synchronizedList() nếu cần thread-safe List<String> safeList = Collections.synchronizedList(new ArrayList<>()); // Hoặc dùng CopyOnWriteArrayList cho đọc nhiều, ghi ít List<String> cowList = new CopyOnWriteArrayList<>();
Kết luận
Ví dụ này minh họa Vector hoạt động với ArrayAdapter, nhưng không khuyến nghị cho ứng dụng Android mới. Hãy dùng ArrayList hoặc các concurrent collection phù hợp.