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
, Set
và Vector
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í | ArrayList | Vector |
---|---|---|
Tính đồng bộ | ArrayList là non-synchronized | Vector là synchronized |
Tốc độ xử lý | ArrayList là nhanh hơn vì nó không hỗ trợ đồng bộ hóa | Vector 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ệt | Duyệt bởi Iterator | Duyệt bởi Enumeration và Iterator |
Khả năng thay đổi kích thước | Khô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ước | ArrayList 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ụng | ArrayList đượ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.