So sánh vector và arraylist c++

Cả hai lớp ArrayList và Vector đều implements từ interface List. Cả 2 lớp đều sử dụng một mảng động, có thể thay đổi kích thước, để lưu trữ các phần tử. Chúng đều là một phần của Java Collections Framework. Bài viết này sẽ nói về các điểm khác nhau của 2 lớp này.

So sánh vector và arraylist c++

  • Synchronization: Các phương thức của Vector được đồng bộ hóa, còn ArrayList thì không. Nếu muốn sử dụng ArrayList trong môi trường đa luồng, thì chúng ta phải đồng bộ hóa khối code mà truy cập vào ArrayList.
  • Performance: ArrayList thì nhanh hơn vì chúng không được đồng bộ hóa, trong khi đó các thao tác trên Vector có performance chậm hơn.
  • Data Growth: Cả ArrayList và Vector đều có thể tăng hoặc giảm kích thước một cách linh hoạt để lưu trữ các phần tử. Nhưng cách chúng thay đổi kích thước thì khác nhau. ArrayList tăng 50% kích thước mảng hiện tại nếu số lượng phần tử vượt quá khả năng của nó, trong khi đó Vector tăng 100% – về cơ bản là tăng gấp đôi kích thước mảng hiện tại.
  • Traversal: Vector có thể sử dụng cả Enumeration và Iterator để duyệt các phần tử. Trong khi đó, ArrayList chỉ có thể sử dụng Iterator.

2. Vậy khi nào sử dụng ArrayList hoặc Vector

  • ArrayList thì không được đồng bộ hóa và thread-safe, còn Vector thì ngược lại. Vì vậy trong một môi trường đơn luồng (single-threaded) thì ArrayList được ưa thích hơn, còn trong môi trường đa luồng, Vector sẽ là lựa chọn ưu tiên. Nhưng nếu bạn vẫn thích dùng ArrayList trong môi trường đa luồng thì với Collections API bạn có thể sử dụng phương thức Collections.synchronizedList().
  • Nếu chúng ta không biết sẽ có bao nhiêu dữ liệu trong danh sách, nhưng biết tốc độ tăng trưởng dữ liệu trong danh sách, thì sử dụng Vector sẽ có lợi hơn. Vì ta có thể đặt giá trị giá tăng trong các Vector.
  • Và cuối cùng, vì ArrayList mới hơn và nhanh hơn nên nếu chúng ta không có yêu cầu rõ ràng nào để chọn ArrayList hay Vector thì chúng ta nên chọn ArrayList.

3. Ví dụ

3.1. Duyệt ArrayList sử dụng Iterator

ArrayListExample

package com.icancodeit.java.collections.list; import java.util.ArrayList; import java.util.Iterator; public class ArrayListExample { public static void main(String[] args) {

ArrayList<Integer> arr = new ArrayList<Integer>();
for (int i = 0; i < 5; i++) {
  arr.add(i);
}
Iterator<Integer> iterator = arr.iterator();
while (iterator.hasNext()) {
  System.out.println(iterator.next());
}
} }

Kết quả

3.2. Duyệt Vector sử dụng Enumeration

VectorExample

package com.icancodeit.java.collections.list; import java.util.Enumeration; import java.util.Vector; public class VectorExample { public static void main(String[] args) {

Vector<Integer> vector = new Vector<Integer>();
for (int i = 0; i < 5; i++) {
  vector.add(i);
}
Enumeration<Integer> e = vector.elements();
while (e.hasMoreElements()) {
  System.out.println(e.nextElement());
}
} }

Kết quả

ArrayList, giống như vectơ, cũng thực hiện bốn giao diện. Một lần nữa, như vectơ, kích thước của nó có thể thay đổi trong thời gian chạy. Ngoài ra, nó có một lĩnh vực gọi là dung lượng có kích thước lớn bằng kích thước của ArrayList.

Cả hai vectơ và ArrayList đều tốt cho việc lấy ra các phần tử từ bất kỳ vị trí nào cũng như để chèn hoặc xóa các phần tử từ cuối lớp chứa. Từ quan điểm API, cả hai vectơ cũng như ArrayList đều rất giống nhau. Vì vậy, nơi chính xác nằm sự khác biệt giữa hai? Những điểm sau đây sẽ làm sáng tỏ vấn đề này:

1. Đồng bộ: Vectors được đồng bộ nhưng ArrayList thì không. Nếu bạn thêm hoặc xóa các phần tử từ ArrayList, nó được gọi là sửa đổi cấu trúc. Khi nhiều luồng đang truy cập một ArrayList đồng thời với một khối mã sửa đổi danh sách, thì một trong số chúng cần đồng bộ hoá bên ngoài danh sách. Tóm lại, nội dung vector là an toàn cho thread, còn ArrayList thì không. Nếu yêu cầu không đề cập đến bộ sưu tập an toàn của thread, thì nên chọn ArrayList làm hiệu suất hoạt động đồng bộ. Các mảng ArrayList không đồng bộ rất nhanh.

2. Tăng trưởng dữ liệu: Cả ArrayList và các phần tử vector đều được lưu trữ dưới dạng mảng, nhưng các vectơ có kích thước mặc định là 10 và ArrayList không có kích thước mặc định. Khi người ta thêm một phần tử cho một ArrayList hoặc vector, có một cơ hội mà cả hai lớp đều có thể chạy ra khỏi phòng. Trong trường hợp này, mặc định Vector tăng gấp đôi kích thước của nó trong khi kích thước ArrayList tăng 50%. Bạn có thể đặt một giá trị gia tăng trong trường hợp vectơ mà không thể cho ArrayList.

3. Traversing các yếu tố: ArrayList có một lợi thế ở đây vì bạn có thể truy cập các yếu tố của nó bằng cách đơn giản sử dụng một chỉ mục. Trong trường hợp vectơ, bạn cần phải tạo ra một vòng lặp để đi qua các phần tử của nó.