[Java] Java Collection Framework – Phần 1: Giới thiệu chung

Author: | Posted in Basic, Java, Library, Programming No comments
Rate this post!

Chắc hẳn bất kì lập trình viên nào đã từng làm việc với Java hay Android, thậm chí là cả các bạn đang học Java đều biết tới ArrayList – một class cực kì dễ dùng và tiện dụng. Nhưng có lẽ không nhiều người biết rằng ArrayList chỉ là một trong số rất nhiều class thuộc bộ thư viện Java Collection Framework của Java – 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ị. Chính vì vậy mình sẽ gửi tới các bạn 1 series các bài viết về Java Collection Framework với mong muốn đem lại cho các bạn một cái nhìn tổng quan, cùng với các sử dụng các chức năng cơ bản mà không kém phần mạnh mẽ của bộ thư viện này.

Trong bài viết mở đầu cho series bài viết về Java Collection Framework mình sẽ gửi tới các bạn cái nhìn tổng quan về bộ thư viện này và giới thiệu sơ lược về các class cũng như interface bên trong nó.

1. Giới thiệu về Java Collection Framework

Bắt đầu từ phiên bản Java 2, Java đã giới thiệu một cách tiếp cận mới cho các tập hợp, cách tiếp cận này được thực hiện thông qua Java Collection Framework (có thể gọi là nền tảng tập hợp) được xây dựng các interface đinh 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.

Cấu trúc Java Collection Framework

Java Collection Framework - Cấu trúc tổng quát

Một chút lưu ý là hình trên chỉ được dùng để minh họa cấu trúc của Java Collection Framework chứ không phải là cây kế thừa thực tế của bộ thư viện này.

Nhìn vào hình trên các bạn chắc là các bạn đã thấy được sự đồ sộ của bộ thư viện này phải không? Quả thật vậy Java Collection Framework cung cấp cho bạn hầu như tất cả những gì bạn cần khi muốn làm việc với các tập hợp hay là đồ thị, không chỉ vậy nó còn cho phép bạn mở rộng bằng các kế thừa từ các class hay interface có sẵn để tạo ra bộ thư viện phù hợp nhất với nhu cầu của bạn. Để làm rõ hơn mình sẽ đi luôn vào giới thiệu tới các bạn từng thành phần chính được của Java Collection Framework.

2. Collection Interface

Collection Interface định nghĩa những phương thức cơ bản khi làm việc với tập hợp, đây là gốc cũng là nền móng để từ đó xây dựng lên cả bộ thư viện Java Collection Framework. Collection Interface được kế thừa từ Iterable Interface nên các bạn có thể dễ dàng duyệt qua từng phần tử thông qua việc sử dụng Iterator.

3. Set Interface

Set (tập hợp) là kiểu dữ liệu mà bên trong nó mỗi phần tử chỉ xuất hiện duy nhất một lần (tương tự như tập hợp trong toán học vậy) và Set Interface cung cấp các phương thức để tương tác với set. Set Interface được kế thừa từ Collection Interface nên nó cũng có đầy đủ các phương thức của Collection Interface.

Một số class thực thi Set Interface thường gặp:

  • TreeSet: là 1 class thực thi giao diện Set Interface, trong đó các phần tử trong set đã được sắp xếp.
  • HashSet: là 1 class implement Set Interface, mà các phần tử được lưu trữ dưới dạng bảng băm (hash table).
  • EnumSet: là 1 class dạng set như 2 class ở trên, tuy nhiên khác với 2 class trên là các phần tử trong set là các enum chứ không phải object.

4. List Interface

List (danh sách) là cấu trúc dữ liệu tuyến tính trong đó các phần tử được sắp xếp theo một thứ tự xác định. List Interface định nghĩa các phương thức để tương tác với list cũng như các phần tử bên trong list. Tương tự như Set Interface, List Interface cũng được kế thừa và có đầy đủ các phương thức của Collection Interface.

Một số class thực thi List Interface thường sử dụng:

  • ArrayList: là 1 class dạng list được implement dựa trên mảng có kích thước thay đổi được.
  • LinkedList: là một class dạng list hoạt động trên cơ sở của cấu trúc dữ liệu danh sách liên kết đôi (double-linked list)
  • Vector: là 1 class thực thi giao diện List Interface, có cách thực lưu trữ như mảng tuy nhiên có kích thước thay đổi được, khá là tương tự với ArrayList, tuy nhiên điểm khác biệt là Vector là synchronized, hay là đồng bộ, có thể hoạt động đa luồng mà không cần gọi synchronize một cách tường minh
  • Stack: cũng là 1 class dạng list, Stack có cách hoạt động dựa trên cơ sở của cấu trúc dữ liệu ngăn xếp (stack) với kiểu vào ra LIFO (last-in-first-out hay vào sau ra trước) nổi tiếng.

5. Queue Interface

Queue (hàng đợi) là kiểu dữ liệu nổi tiếng với kiểu vào ra FIFO (first-in-first-out hay vào trước ra trước), tuy nhiên với Queue Interface thì queue không chỉ còn dừng lại ở mức đơn giản như vậy mà nó cũng cấp cho bạn các phương thức để xây dựng các queue phức tạp hơn nhiều như priority queue (queue có ưu tiên), deque (queue 2 chiều), … Và cũng giống như 2 interface trước, Queue Interface cũng kế thừa và mang đầy đủ phương thức từ Collection Interface.

Một số class về Queue thường sử dụng:

  • LinkedList: chính là LinkedList mình đã nói ở phần List
  • PriorityQueue: là 1 dạng queue mà trong đó các phần tử trong queue sẽ được sắp xếp.
  • ArrayDeque: là 1 dạng deque (queue 2 chiều) được implement dựa trên mảng

6. Map Interface

Map (đồ thị/ánh xạ) là kiểu dữ liệu cho phép ta quản lý dữ liệu theo dạng cặp key-value, trong đó key là duy nhất và tương ứng với 1 key là một giá trị value. Map Interface cung cấp cho ta các phương thức để tương tác với kiểu dữ liệu như vậy. Không giống như các interface ở trên, Map Interface không kế thừa từ Collection Interface mà đây là 1 interface độc lập với các phương thức của riêng mình.

Dưới đây là một số class về Map cần chú ý:

  • TreeMap: là class thực thi giao diện Map Interface với dạng cây đỏ đen (Red-Black tree) trong đó các key đã được sắp xếp. Class này cho phép thời gian thêm, sửa, xóa và tìm kiếm 1 phần tử trong Map là tương đương nhau và đều là O(log(n))
  • HashMap: là class thực thi giao diện Map Interface với  các key được lưu trữ dưới dạng bảng băm, cho phép tìm kiếm nhanh O(1).
  • EnumMap: cũng là 1 Map class nữa, tuy nhiên các key trong Map lại là các enum chứ không phải object như các dạng Map class ở trên.
  • WeakHashMap: tương tự như HashMap tuy nhiên có 1 điểm khác biệt đáng chú ý là các key trong Map chỉ là các Weak reference (hay Weak key), có nghĩa là khi phần tử sẽ bị xóa khi key được giải phóng hay không còn một biến nào tham chiếu đến key nữa.

Nếu vẫn còn thắc mắc liên quan đến Java Collection Framework thì các bạn có thể đặt câu hỏi bằng cách comment trên blog của mình, mình sẽ có gắng hết sức để trả lời câu hỏi của các bạn, ngoài ra các bạn có thể tham khảo thêm ở trang trainning về framework này của Oracle.

Một lưu ý nữa đó là các class, interface và thứ tự kế thừa của chúng được mình đưa ra trong bài viết dựa theo tài liệu của Oracle, nếu sử dụng OpenJDK hoặc Android thì sẽ có một vài điểm khác nhỏ, tuy nhiên nếu chỉ quan tâm về cách sử dụng thì sẽ không có sữ khác biệt nên các bạn có thể yên tâm.

Loading Facebook Comments ...

Add Your Comment