Tất tần tật về Collection trong Java

Collection là một phần cơ bản và quan trọng nhất trong bộ thư viện tiêu chuẩn của Java mà mọi anh em lập trình viên phải nắm vững. Nó cung cấp cho chúng ta hầu như tất cả những gì cần để làm việc với dữ liệu dạng tập hợp hay đồ thị và cho phép mở rộng để phù hợp với mục đích sử dụng. Để hiểu rõ hơn về cách mà Java phân cấp các kiểu dữ liệu tập hợp, bài viết hôm nay chúng ta cùng nhau tìm hiểu sâu hơn về khái niệm này nhé.

Collection là gì?

Collection là một interface có trong java.util package, nó được sử dụng để biểu diễn một nhóm các đối tượng riêng lẻ dưới dạng một đơn vị duy nhất (single unit). Collection cũng là một root interface trong collection framework mà Java cung cấp để làm việc với dữ liệu tập hợp.

Collection là gì?

Collection interface cũng chứa một số các methods quan trọng để thao tác với dữ liệu tập hợp như add, delete, clear, size hay contains. List, Queue, Set là những sub-interfaces chính của Collection.

Chúng ta cần phân biệt giữa CollectionCollections trong Java, đây là 2 khái niệm khác nhau. Collections là một lớp tiện ích (utility class) chứa các phương thức static dùng cho việc lưu trữ và thao tác với các tập dữ liệu như tìm kiếm, phân loại, chèn, xóa, … Cả Collection và Collections đều được cung cấp từ java.util package giúp chúng ta khởi tạo và thao tác với dữ liệu dạng tập hợp một cách hiệu quả nhất.

Ví dụ

  • Khởi tạo một ArrayList (1 lớp của Collection interface)
// Creating an object of List<String> 
      List<String> arrlist = new ArrayList<String>(); 
  • Thao tác thêm phần tử vào danh sách với phương thức có sẵn trong Collection là add
 // Adding elements to arrlist 
      arrlist.add("first"); 
      arrlist.add("second"); 
  • Sử dụng các phương thức tĩnh trong lớp Collections cung cấp để thao tác với danh sách
 //Adding all the specified elements to the specified collection 
      Collections.addAll(arrlist, "web", "site");

 //Sorting all the elements of the specified collection according to default sorting order 
      Collections.sort(arrlist); 

  Interface trong Java – Bạn đã hiểu đúng? Nếu chưa, mời đọc ngay

  Functional Interface là gì? Functional Interface API trong Java 8

Hệ thống phân cấp Collection Framework

Java Collection Framework là một bộ thư viện với rất nhiều class mạnh mẽ giúp bạn đơn giản hóa các thao tác khi làm việc với tập hợp và đồ thị. Nó xây dựng các interface định nghĩa các cách thao tác với tập hợp, các class cụ thể thực thi các interface và các giải thuật thông dụng thường xuyên được sử dụng với tập hợp. Thành phần trong framework bao gồm:

  • Interface: kiểu dữ liệu trừu tượng
  • Classes: các lớp triển khai interface, thể hiện các kiểu dữ liệu cụ thể
  • Algorithm: các thuật toán sử dụng trong các phương thức thao tác với dữ liệu

Hệ thống phân cấp của Collection Framework được phân chia ra làm 2 phần với interface Collection mình đã giới thiệu ở phần trên và interface Map chứa các loại dữ liệu dạng cặp key/ value.

Hệ thống phân cấp Collection Framework

Java thiết kế framework này với ưu điểm:

  • Giúp lưu trữ và quản lý các đối tượng dạng tập hợp hay đồ thị
  • Tối ưu hóa hiệu suất và tiết kiệm thời gian xây dựng source code
  • Tăng khả năng tái sử dụng source code

Tham khảo việc làm Java mới nhất trên TopDev

Các lớp trong Collection

Chúng ta sẽ cùng nhau đi sâu hơn vào các nhánh con triển khai Collection interface để hiệu được cách sử dụng của nó.

1. List – danh sách

List là một collection có thứ tự, có thể chứa các phần tử trùng lặp. Trong một list, chúng ta thường có quyền kiểm soát chính xác vị trí phần tử được chèn vào và có thể truy cập thông qua chỉ số. List interface trong Java chứa 3 class con triển khai gồm ArrayList, Linked List và Vector.

ArrayList

ArrayList là kiểu dữ liệu dạng mảng khá thân thuộc trong nhiều ngôn ngữ lập trình, nó sử dụng index để đánh chỉ số và truy cập đến từng phần tử một cách dễ dàng. Ngược lại thì LinkedList sẽ liên kết các phần tử với nhau thông qua địa chỉ bộ nhớ, giúp việc lưu trữ một danh sách mà không cần để tâm nhiều đến số lượng phần tử như ArrayList.

Tuy vậy thì đánh đổi ở đây là việc truy cập vào một phần tử trong LinkedList sẽ chậm hơn tương đối so với ArrayList. Với Vector thì nó khá giống với ArrayList nhưng được thiết kế để ở môi trường đa luồng, tại một thời điểm sẽ chỉ có một luồng được phép truy cập, thực thi thao tác trên danh sách đó.

2. Queue – hàng đợi

Queue là một collection được sử dụng để lưu trữ và quản lý các phần tử theo thứ tự FIFO (First in, Fist out), nghĩa là các phần tử mới sẽ được thêm vào cuối hàng đợi và phần tử cũ sẽ được xóa khỏi đầu hàng đợi. Java cũng cung cấp 1 interface kế thừa Queue là Deque (Double Ended Queue) với việc hỗ trợ sử dụng trong việc quản lý các phần tử bằng FIFO và LIFO (Last in, First out); điều này giúp tất cả các phần tử trong Deque có thể được chèn vào và lấy ra ở cả hai đầu.

Queue – hàng đợi

2 class triển khai Queue có sẵn trong Java là PriorityQueue – hàng đợi ưu tiên và ArrayDeque – sử dụng tương tự như cấu trúc dữ liệu Stack.

3. Set

Set là một collection lưu trữ các phần tử không trùng lặp và không có thứ tự cụ thể. Trường hợp khi thêm một phần tử đã tồn tại trong Set rồi thì sẽ không có tác động gì xảy ra đối với Set ban đầu.

Set cũng có 1 interface kế thừa là SortedSet với việc đảm bảo các phần tử trong tập hợp được sắp xếp có thứ tự. Những class triển khai interface Set bao gồm HashSet, LinkedHashSet và TreeSet. Trong đó TreeSet là một lớp thừa hưởng các đặc điểm từ interface SortedSet và ngoài ra nó sử dụng TreeMap (một lớp triển khai interface Map) để lưu trữ các phần tử.

Set

Kết bài

Collection đóng vai trò quan trọng trong Java, cung cấp một cách tổng quan nhất về cấu trúc dữ liệu dạng tập hợp cùng với các phương thức thao tác lên dữ liệu. Nắm vững được kiến thức về Collection sẽ giúp bạn sử dụng một cách linh hoạt và hiệu quả, tối ưu hiệu suất ứng dụng mà bạn viết. Hy vọng bài viết hữu ích dành cho bạn và hẹn gặp lại trong các bài viết tiếp theo của mình.

Tác giả: Phạm Minh Khoa

Có thể bạn quan tâm:

Đừng bỏ lỡ việc làm IT mọi cấp độ tại TopDev