Các lớp Vector và ArrayList được triển khai xây dựng dựa trên mảng Object[] dùng để lưu trữ các phần tử. Việc truy xuất đến các phần tử cũng đơn giản thông qua việc truy xuất theo chỉ mục(index) như trong mảng.
Đặc điểm của Vector và ArrayList là chúng ta có thể thêm những phần tử mới vào mà không gặp trở ngại về “sức chứa” như Array thông thường là phải định rõ độ lớn(chiều dài) của mảng.
Vậy, chúng “giãn nở” như thế nào ? Như đã nói ở trên Vector & ArrayList được xây dựng dựa trên mảng các Object[]. Mảng này có thể lớn hơn độ lớn các phần tử cấu thành lên Vector/ArrayList object nhằm giữ khả năng có thể thêm phần tử mới khi cần. Khi tận dụng hết khả năng sức chứa của mảng này thì Vector/ArrayList object phải tạo ra một mảng mới có độ lớn (sức chứa) hơn mảng cũ và những phần tử trước đó sẽ được sao chép chuyển sang mảng mới này. Về độ lớn của mảng mới tạo ra so với mảng cũ sẽ tùy thuộc vào các version SDK mà dao động trong khoảng 50 – 100 (%). 2 đoạn code dưới đây là một minh chứng :
public void ensureCapacity(int minCapacity) {
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object oldData[] = elementData;
int newCapacity = (oldCapacity * 3)/2 + 1;
if (newCapacity < minCapacity)
newCapacity = minCapacity;
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
public void ensureCapacity(int minCapacity) {
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object oldData[] = elementData;
int newCapacity = Math.max(oldCapacity*2, minCapacity);
elementData = new Object[newCapacity];
System.arrayscopy(oldData, 0, elementData, 0, size);
}
}
Tính hiệu quả khi chèn phần tử mới vào Vector & ArrayList :
- Chèn vào vị trí index = 0 sẽ cho tính hiệu quả kém nhất (the worst performance) vì tất cả những phần tử trước đó sẽ phải dịch chuyển lên trên.
- Chèn vào vị trí sau phần tử đứng cuối cùng sẽ cho hiệu quả tốt nhât (the best performance) vì các phần tử trước đó vẫn giữ nguyên vị trí không có một sự xáo trộn nào xảy ra.
- Từ đây ta cũng có thể hiển được tính hiệu quả khi chèn vào vị trí bất kì nào khác 2 vị trí trên.
Điểm khác biệt chính giữa Vector và ArrayList là sử dụng cơ chế đồng bộ (synchronization). Ngoài 2 methods sử dụng serialize thì ArrayList không có một methods nào được đồng bộ hóa. Ngược lại với Vector, hầu hết các phương thức (method) của Vector được đồng bộ hóa. Vì thế Vector là thread-safe còn ArrayList thì không. Trong những ứng dụng đa luồng thì việc sử dụng Vector là hợp lý hơn vì tính đồng bộ của nó thích hợp cho việc giải quyết nhiều tương tác trong một thời điểm. Còn các phương thức của ArrayList sẽ cho tốc độ xử lý nhanh hơn trong trường hợp đơn giản không đòi hỏi xử lý nhiều tương tác trong một thời điểm. Sự cách biệt về tốc độ xử lý giữa 2 class này càng ngày càng được thu hẹp lại với những version JVMs (máy ảo Java) mới nhất.
Đặc điểm của Vector và ArrayList là chúng ta có thể thêm những phần tử mới vào mà không gặp trở ngại về “sức chứa” như Array thông thường là phải định rõ độ lớn(chiều dài) của mảng.
Vậy, chúng “giãn nở” như thế nào ? Như đã nói ở trên Vector & ArrayList được xây dựng dựa trên mảng các Object[]. Mảng này có thể lớn hơn độ lớn các phần tử cấu thành lên Vector/ArrayList object nhằm giữ khả năng có thể thêm phần tử mới khi cần. Khi tận dụng hết khả năng sức chứa của mảng này thì Vector/ArrayList object phải tạo ra một mảng mới có độ lớn (sức chứa) hơn mảng cũ và những phần tử trước đó sẽ được sao chép chuyển sang mảng mới này. Về độ lớn của mảng mới tạo ra so với mảng cũ sẽ tùy thuộc vào các version SDK mà dao động trong khoảng 50 – 100 (%). 2 đoạn code dưới đây là một minh chứng :
public void ensureCapacity(int minCapacity) {
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object oldData[] = elementData;
int newCapacity = (oldCapacity * 3)/2 + 1;
if (newCapacity < minCapacity)
newCapacity = minCapacity;
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
public void ensureCapacity(int minCapacity) {
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object oldData[] = elementData;
int newCapacity = Math.max(oldCapacity*2, minCapacity);
elementData = new Object[newCapacity];
System.arrayscopy(oldData, 0, elementData, 0, size);
}
}
Tính hiệu quả khi chèn phần tử mới vào Vector & ArrayList :
- Chèn vào vị trí index = 0 sẽ cho tính hiệu quả kém nhất (the worst performance) vì tất cả những phần tử trước đó sẽ phải dịch chuyển lên trên.
- Chèn vào vị trí sau phần tử đứng cuối cùng sẽ cho hiệu quả tốt nhât (the best performance) vì các phần tử trước đó vẫn giữ nguyên vị trí không có một sự xáo trộn nào xảy ra.
- Từ đây ta cũng có thể hiển được tính hiệu quả khi chèn vào vị trí bất kì nào khác 2 vị trí trên.
Điểm khác biệt chính giữa Vector và ArrayList là sử dụng cơ chế đồng bộ (synchronization). Ngoài 2 methods sử dụng serialize thì ArrayList không có một methods nào được đồng bộ hóa. Ngược lại với Vector, hầu hết các phương thức (method) của Vector được đồng bộ hóa. Vì thế Vector là thread-safe còn ArrayList thì không. Trong những ứng dụng đa luồng thì việc sử dụng Vector là hợp lý hơn vì tính đồng bộ của nó thích hợp cho việc giải quyết nhiều tương tác trong một thời điểm. Còn các phương thức của ArrayList sẽ cho tốc độ xử lý nhanh hơn trong trường hợp đơn giản không đòi hỏi xử lý nhiều tương tác trong một thời điểm. Sự cách biệt về tốc độ xử lý giữa 2 class này càng ngày càng được thu hẹp lại với những version JVMs (máy ảo Java) mới nhất.
cảm ơn bạn bây giờ mình mới hiểu, hồi trước cứ tưởng vector với list là 1 chứ :D
Trả lờiXóaĐăng nhận xét