Trong bài viết trước đây, Stringee đã giới thiệu tới bạn LinkedList - một cấu trúc dữ liệu thông dụng và rất quan trọng khi phát triển phần mềm sử dụng ngôn ngữ Java. Nhưng bạn có biết không, trong bộ Collection của Java còn rất nhiều cấu trúc dữ liệu khác cũng được sử dụng nhiều không kém. Sẽ quả là một thiếu sót khi nhắc đến LinkedList nhưng lại quên đi những ArrayList, SetVector phải không nào. Trong bài viết này, chúng ta sẽ cùng tìm hiểu về các cấu trúc dữ liệu này cũng như điểm khác biệt giữa chúng nhé.

1. ArrayList trong Java

ArrayList là một phần của framework Collection và nằm trong package java.util. Nó là một hiện thực của interface List. Như cái tên của nó, ArrayList sử dụng một mảng động có kích thước không cố định như mảng thông thường. Vì nó là một phần của framework Collection nên có nhiều tính năng không khả dụng như một mảng.

Ví dụ về ArrayList

class ArrayListExample {

    public static void main(String[] args) {

        int n = 5;

        // Declaring the ArrayList with initial size n

        ArrayList<Integer> arrList1 = new ArrayList<Integer>(n);

        // Declaring the ArrayList

        ArrayList<Integer> arrList2 = new ArrayList<Integer>();

        // Printing the ArrayList

        System.out.println("List 1:" + arrList1);
        System.out.println("List 2:" + arrList2);

        // Appending new elements

        for (int i = 1; i <= n; i++) {
            arrList1.add(i);
            arrList2.add(i);
        }

        // Printing the ArrayList
        System.out.println("List 1:" + arrList1);
        System.out.println("List 2:" + arrList2);

    }

}

Output của chương trình

List 1:[]
List 2:[]
List 1:[1, 2, 3, 4, 5]
List 2:[1, 2, 3, 4, 5]

Xem thêm bài viết về ngôn ngữ lập trình Java:

<a href=""https://stringee.com/vi/blog/post/Linkedlist-trong-java"" target=""_blank"" rel=""noopener noreferrer"">- LinkedList trong java và ví dụ cụ thể
<a href=""https://stringee.com/vi/blog/post/mang-trong-java"" target=""_blank"" rel=""noopener noreferrer"">- Khai báo và sử dụng mảng các đối tượng trong Java
<a href=""https://stringee.com/vi/blog/post/rang-buoc-trong-sql"" target=""_blank"" rel=""noopener noreferrer"">- Tìm hiểu về ràng buộc (Constraint) trong SQL
<a href=""https://stringee.com/vi/blog/post/phuong-thuc-main-trong-java"" target=""_blank"" rel=""noopener noreferrer"">- Phương thức main trong Java và những điều bạn cần biết

2. Set trong Java

Set là một interface thuộc framework Collection và nằm trong package java.util. Set là một tập hợp các đối tượng không trùng nhau và không duy trì thứ tự điền các phần tử. Nó là một interface implements tập hợp trong toán học. Vì set được kế thừa từ Collection Framework nên nó bao gồm nhiều phương thức của interface này, cùng với đó là các tính năng cho phép giới hạn việc điền thêm các phần tử trùng lặp.

Ví dụ về Set:

Vì Set là một interface nên ở đây chúng ta sẽ tạo ra một ví dụ về một hiện thực của nó là HashSet

public class SetSample {

    public static void main(String[] args) {

        // Declare a set with generic type is String

        Set<String> hashSet = new HashSet<String>();

        // Adding elements to the Set using add() method

        hashSet.add("Welcome");
        hashSet.add("to");
        hashSet.add("Stringee");
        hashSet.add("Stringee");

        // Printing elements of HashSet object

        System.out.println(hashSet);

    }

}

Output của chương trình

[Stringee, Welcome, to]

3. Vector trong Java

Vector trong Java là một loại lưu trữ tương tự như mảng động và hoàn toàn có thể thay đổi kích thước (như tăng hoặc giảm) của mảng đó. Vector không giống như các mảng thông thường, mà thay vào đó Vector hoàn toàn cho phép lưu trữ N phần tử bên trong mảng mà không phải giới hạn kích thước mảng.

Vector có tính đồng bộ và hỗ trợ đa luồng. Hơn nữa, do là một legacy class nên nó bao gồm một số legacy methods(Enumeration, Iterator) không có trong Collection Framework.

Ví dụ về Vector

class VectorSample {

    public static void main(String[] args){

        // Size of the Vector
        int n = 5;

        // Declaring the Vector with initial size n
        Vector<Integer> vector = new Vector<Integer>(n);

        // Appending new elements
        for (int i = 1; i <= n; i++){
            vector.add(i);
        }

        // Printing elements
        System.out.println("Initial vector");
        System.out.println(vector);

        // Remove element at index 3
        vector.remove(3);

        // Displaying the vector after deletion
        System.out.println("Vector after deletion");
        System.out.println(vector);

        // Travel across the vector using for loop
        for (int i = 0; i < vector.size(); i++){
            // Printing elements one by one
            System.out.print(vector.get(i) + " ");
        }

    }

}

Output của chương trình

Initial vector
[1, 2, 3, 4, 5]
Vector after deletion
[1, 2, 3, 5]
1 2 3 5 

4. Phân biệt giữa List và Set

  • List cho phép lưu các phần tử trùng lặp
  • Set lưu các phần tử không trùng lặp

5. Phân biệt giữa ArrayList và Vector

Tiêu chíArrayListVector
Tính đồng bộArrayList là non-synchronizedVector là synchronized
Tốc độ xử lýArrayList là nhanh hơn vì nó không hỗ trợ đồng bộ hóaVector chậm hơn do nó là synchronized. Tức là, trong môi trường đa luồng, các thread giữ nó ở trong trạng thái runnable hoặc non-runnable cho đến khi thread hiện tại giải phóng đối tượng đó.
Phương thức duyệtDuyệt bởi IteratorDuyệt bởi Enumeration và Iterator
Khả năng thay đổi kích thướcKhông thể chủ động thay đổi kích thước hiện tại của ArrayList. Kích thước ArrayList chỉ được thay đổi khi thêm hoặc xóa phần tử.Có thể chủ động thay đổi kích thướng của Vector bằng phương thức setSize().
Khả năng thay đổi kích thướcArrayList tăng 50% kích thước hiện tại nếu số phần tử vượt quá khả năng chứa của nó.Vector tăng 100% nghĩa là tăng gấp đôi kích thước hiện tại nếu số phần tử vượt quá khả năng chứa của nó.
Cấu hình đồng bộChúng ta có thể làm cho ArrayList đồng bộ bằng cách gọi phương thức: Collections.synchronizedList();Vector được đồng bộ nội bộ và không thể hủy đồng bộ hóa.
Ứng dụngArrayList được ưa thích trong các ứng dụng đơn luồng (single-thread). Nếu bạn muốn sử dụng HashMap trong ứng dụng đa luồng (multi-thread), có thể thực hiện bằng cách sử dụng phương thức Collections. synchronizedList().Mặc dù Vector có để sử dụng trong các ứng dụng đa luồng (multi-thread), nhưng ngày nay nó ít được sử dụng. Bởi vì, Collections. synchronizedList() là lựa chọn tốt hơn Vector.

Lời kết

Trong bài viết này, Stringee đã cùng bạn tìm hiểu về điểm khác biệt giữa ArrayList, Set và Vector trong Java. Mỗi cấu trúc đều có đặc điểm riêng, việc sử dụng cấu trúc nào phụ thuộc vào yêu cầu và mục đích của ứng dụng.

Stringee API cung cấp các tính năng như gọi thoại, gọi video, tin nhắn chat, SMS hay tổng đài chăm sóc khách hàng (CSKH) có thể được nhúng trực tiếp vào các ứng dụng/website của doanh nghiệp nhanh chóng. Điều này giúp tiết kiệm đến 80% thời gian và chi phí cho doanh nghiệp, trong khi nếu tự phát triển các tính năng này có thể mất từ 1 - 3 năm.