Java có khả năng mẫu không đầy đủ. Miễn là bạn muốn một mảng các đối tượng, thì ArrayList<T>
là tốt. Đối với nguyên thủy, nó khủng khiếp.
Giả sử bạn có một hệ thống phân cấp của các đối tượng mà bạn muốn đưa vào một danh sách, ArrayList
là lý tưởng:
ArrayList<Vehicle> vehicles = new ArrayList<Vehicle>();
vehicles.add(new Car(...));
vehicles.add(new Truck(...));
Tôi giả định trong ví dụ trên mà xe là lớp cơ sở, và xe hơi và xe tải là các lớp con.
Mặt khác, nếu bạn muốn danh sách các số, Java sẽ không hiệu quả cao. Mỗi đối tượng là một tham chiếu (thực sự là một con trỏ 4 byte) đến một đoạn 12 byte bộ nhớ, cộng với những gì bạn đang thực sự sử dụng. Vì ArrayList không thể áp dụng cho int, điều này có nghĩa là việc tạo danh sách các số có nghĩa là:
- Tạo danh sách Số nguyên, trình bao bọc đối tượng cho int.
- Chuyển đổi các đối tượng mỗi lần bạn lấy ra một số. Điều này được thực hiện tự động những ngày này, nhưng phải mất thời gian.
- Khởi tạo bộ nhớ gấp 5 lần khi cần.
Vì vậy, nếu bạn đang xử lý các khối dữ liệu thô sơ (int, float, double), bạn có thể đáng giá khi viết phiên bản ArrayList của riêng mình. Điều này đặc biệt quan trọng khi dữ liệu lớn và nền tảng nhỏ (như một điều Android cầm tay).
Hãy so sánh này:
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < 1000000; i++)
list.add(i):
tới:
public class IntArray {
private int[] data;
private int used;
private void grow() {
// implement code to make data double in size here...
}
public IntArray(int size) {
data = new int[size];
used = 0;
}
public void add(int i) {
if (i >= data.length) grow();
data[used++] = i;
}
}
IntArray list2 = new IntArray(1000000);
for (int i = 0; i < 1000000; i++)
list2.add(i);
Lần cuối cùng tôi benchmarked nó, việc sử dụng tối ưu của danh sách nguyên thủy là hơn 10 lần nhanh hơn so với việc sử dụng phải thừa nhận là không tối ưu của ArrayList . Để công bằng hơn, hãy phân bổ trước danh sách mảng để có kích thước phù hợp - nó vẫn còn chậm hơn.
LinkedList chỉ đáng giá nếu bạn đang chèn vào đầu hoặc giữa danh sách. Nếu danh sách của bạn đang được xây dựng bằng cách thêm vào cuối, ArrayList sẽ triệt để thống trị LinkedList. Vì vậy, đối với một danh sách điển hình của các đối tượng mà bạn đang xây dựng theo thứ tự, ArrayList là những gì bạn đang tìm kiếm. Đối với một danh sách lớn các nguyên thủy như int hoặc double, hãy viết danh sách của riêng bạn.
Khó trả lời mà không biết yêu cầu. Hãy xem http://download.oracle.com/javase/tutorial/collections/index.html và xem cái nào phù hợp với hóa đơn. –
Tại sao không sử dụng API trong ArrayList, ví dụ? – dacwe