Java: So sánh ArrayList và Vector


Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên

Cả ArrayList và Vector đều thực thi từ interface List và cả hai đều sử dụng các mảng (có thể thay đổi kích thước động) cho cấu trúc dữ liệu bên trong của chúng, giống như sử dụng một mảng thông thường.

Cú pháp:

ArrayList: ArrayList<T> al = new ArrayList<>();

Vector: Vector<T> v = new Vector<>();

Vector so với ArrayList trong Java

STT ArrayList Vector
1. ArrayList không được đồng bộ hóa. Vector được đồng bộ hóa.
2. ArrayList tăng 50% kích thước mảng hiện tại nếu số phần tử vượt quá dung lượng hiện tại. Vector tăng 100% có nghĩa là tăng gấp đôi kích thước mảng nếu tổng số phần tử vượt quá dung lượng của nó.
3. ArrayList không phải là một lớp kế thừa. Nó được giới thiệu trong JDK 1.2. Vector là một lớp kế thừa.
4. ArrayList nhanh vì nó không được đồng bộ hóa. Vector chậm vì nó được đồng bộ hóa, tức là trong môi trường đa luồng, nó giữ các luồng khác ở trạng thái chạy được hoặc không chạy được cho đến khi luồng hiện tại giải phóng khóa của đối tượng.
5. ArrayList sử dụng interface Iterator để duyệt qua các phần tử. Vector có thể sử dụng interface Iterator hoặc giao diện Enumeration để duyệt qua các phần tử.

Sự khác biệt đáng kể giữa ArrayList và Vector:

  • Đồng bộ hóa (Synchronization): Vector được đồng bộ hóa, có nghĩa là chỉ một luồng tại một thời điểm có thể truy cập mã, trong khi ArrayList không được đồng bộ hóa, có nghĩa là nhiều luồng có thể hoạt động trên ArrayList cùng một lúc. Ví dụ: nếu một luồng đang thực hiện thao tác thêm, thì có thể có một luồng khác thực hiện thao tác xóa trong môi trường đa luồng. Nếu nhiều luồng truy cập ArrayList đồng thời, thì chúng ta phải đồng bộ hóa khối mã sửa đổi cấu trúc danh sách hoặc cho phép sửa đổi phần tử đơn. Sửa đổi cấu trúc có nghĩa là thêm hoặc xóa (các) phần tử khỏi danh sách. Đặt giá trị của một phần tử hiện có không phải là một sửa đổi cấu trúc.

ArrayList so với Vector Java

  • Hiệu suất: ArrayList nhanh hơn. Vì nó không được đồng bộ hóa, trong khi các hoạt động Vector cho hiệu suất chậm hơn vì chúng được đồng bộ hóa (an toàn cho chuỗi), nếu một chuỗi hoạt động trên một Vector, nó đã có một khóa trên đó, điều này buộc bất kỳ chuỗi nào khác muốn hoạt động trên đó phải đợi cho đến khi khóa được phát hành.
  • Tăng trưởng dữ liệu: ArrayList và Vector đều phát triển và thu nhỏ động để duy trì việc sử dụng bộ nhớ tối ưu - nhưng cách chúng thay đổi kích thước là khác nhau. ArrayList tăng 50% kích thước mảng hiện tại nếu số phần tử vượt quá dung lượ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 qua các phần tử vector, trong khi ArrayList chỉ có thể sử dụng Iterator để duyệt.
  • Ứng dụng: Trong hầu hết các tình huống, các lập trình viên thích ArrayList hơn Vector vì ArrayList có thể được đồng bộ hóa rõ ràng bằng Collections.synchronizedList.

Lưu ý: ArrayList được ưu tiên hơn khi không có yêu cầu cụ thể nào về việc sử dụng vector.

Ví dụ:

import java.util.*;

public class Test1 {
  public static void main(String[] args) {
    // tạo một ArrayList
    ArrayList<String> al = new ArrayList<>();

    // thêm các phần tử vào ArrayList
    al.add("Java");
    al.add("ReactJS");
    al.add("PHP");
    al.add("Python");

    // duyệt các phần tử sử dụng Iterator
    System.out.println("ArrayList elements are:");
    Iterator it = al.iterator();
    while (it.hasNext())
      System.out.println(it.next());

    // tạo một Vector
    Vector<String> v = new Vector<>();
    v.addElement("Practice");
    v.addElement("quiz");
    v.addElement("code");

    // duyệt các phần tử sử dụng Enumeration
    System.out.println("\nVector elements are:");
    Enumeration e = v.elements();
    while (e.hasMoreElements())
      System.out.println(e.nextElement());
  }
}

Kết quả:

ArrayList elements are:
Java
ReactJS
PHP
Python

Vector elements are:
Practice
quiz
code

 

Lựa chọn giữa ArrayList và Vector

  • ArrayList không được đồng bộ hóa và không an toàn cho luồng, trong khi Vectors thì có. Chỉ một luồng có thể gọi các phương thức trên một Vector, điều này hơi tốn kém nhưng hữu ích khi an toàn là mối quan tâm. Do đó, trong trường hợp đơn luồng, ArrayList là lựa chọn hiển nhiên, nhưng khi liên quan đến đa luồng, các vectơ thường được ưu tiên hơn.
  • Nếu ta không biết sẽ có bao nhiêu dữ liệu nhưng biết tốc độ phát triển của nó, thì Vector có lợi thế hơn vì ta có thể đặt giá trị gia tăng trong Vector.
  • ArrayList mới hơn và nhanh hơn. Nếu không có bất kỳ yêu cầu rõ ràng nào để sử dụng một trong hai, ta sẽ sử dụng ArrayList thay vì vector.
» Tiếp: Tổng quan về Generics
« Trước: Phương thức Collections.synchronizedList() và ví dụ
Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên
Copied !!!