Reading Time: 14 minutes

Java Collections Framework là một trong những phần cốt lõi của ngôn ngữ lập trình Java. Các Collections được sử dụng trong hầu hết trong mọi ngôn ngữ lập trình và phần lớn các ngôn ngữ lập trình hỗ trợ nhiều loại collection khác nhau như Danh sách (List), Tập hợp (Set), Hàng đợi (Queue), Ngăn xếp (Stack),…

Java Collections Framework là gì?

Collections giống như những “container” (vật chứa) dùng để nhóm nhiều phần tử lại trong một đơn vị duy nhất. Ví dụ như một hũ socola, hay một danh sách tên,..

Từ khi Java ra đời, ngôn ngữ này đã tích hợp sẵn một số lớp Collection cơ bản như Vector, Stack, Hashtable, Array.

Từ Java 1.2, Collections Framework chính thức được ra mắt. Đây là kiến trúc chuẩn để biểu diễn và thao tác với các Collection trong Java một cách chuẩn hóa. Java Collections Framework bao gồm các thành phần sau:

1. Interface (Giao diện)

Giao diện Java Collections Framework cung cấp kiểu dữ liệu trừu tượng để biểu diễn các collection. Trong đó:

  • java.util.Collection là giao diện gốc, đứng đầu trong hệ thống phân cấp Collections. Nó chứa một số phương thức quan trọng như size(), iterator(), add(), remove(), clear() mà mọi lớp collection phải triển khai
  • Các giao diện quan trọng khác gồm:
    • List
    • Set
    • Queue
    • Map (đặc biệt: không kế thừa Collection nhưng vẫn thuộc Collections Framework)

Toàn bộ các giao diện trong Collections Framework đều nằm trong gói java.util.

2. Implementation Classes (Lớp triển khai)

Java Collections Framework cung cấp các lớp hiện thực (implementation classes) cho các interface cốt lõi của Collection. Chúng ta có thể sử dụng các lớp này để tạo ra các collection khác nhau trong chương trình Java.

Một số lớp phổ biến gồm:

  • ArrayList
  • LinkedList
  • HashMap
  • TreeMap
  • HashSet
  • TreeSet

Các lớp này giải quyết hầu hết các nhu cầu lập trình nhưng nếu cần một collection đặc biệt, bạn có thể mở rộng chúng để để tạo ra lớp collection tùy chỉnh của riêng mình.

Java 1.5 ra mắt các lớp collection an toàn trong môi trường đa luồng (thread-safe), cho phép sửa đổi các collection trong khi đang lặp qua chúng. Một số lớp tiêu biểu là: :

  • CopyOnWriteArrayList
  • ConcurrentHashMap
  • CopyOnWriteArraySet

Tất cả các lớp này đều có trong gói java.util và java.util.concurrent.

3. Algorithms (Thuật toán)

Thuật toán là phương pháp hữu ích để cung cấp một số tiện ích phổ biến như tìm kiếm, sắp xếp và xáo trộn.

Sơ đồ lớp Collections Framework

Biểu đồ bên dưới hiển thị hệ thống phân cấp của Collections Framework. Để dễ hình dung, dưới đây chỉ là mối quan hệ kế thừa giữa các giao diện và lớp thường dùng.

java collection

Lợi ích của Java Collections Framework

Khung Java Collections có những lợi ích sau:

  • Tiết kiệm công sức phát triển: Java Collections Framework hỗ trợ sẵn hầu hết các kiểu tập hợp và phương thức thao tác dữ liệu, từ đó giúp bạn tập trung vào logic nghiệp vụ thay vì phải thiết kế API bộ sưu tập riêng
  • Chất lượng cao: Sử dụng các lớp Collection cốt lõi được kiểm tra kỹ lưỡng thay cho cấu trúc dữ liệu tự phát triển vì vậy đảm bảo được chất lượng chương trình ở mức ổn định
  • Khả năng tái sử dụng và tương thích tốt
  • Giảm công sức bảo trì: Mọi người đều quen thuộc với Collection API nên việc đọc hiểu và bảo trì mã nguồn cũng trở nên dễ dàng hơn.

Các Interface trong Java Collections API

Các interface của collection trong Java là nền tảng cốt lõi của Java Collections Framework. Lưu ý rằng tất cả các interface chính đều được thiết kế theo kiểu generic, ví dụ giao diện công khai Collection<E>. Cú pháp <E> dành cho Generics và khi khai báo Collection, bạn nên sử dụng nó để chỉ định loại đối tượng nó có thể chứa. Nó giúp giảm lỗi thời gian chạy bằng cách kiểm tra kiểu đối tượng tại thời điểm biên dịch.

Để quản lý số lượng giao diện cốt lõi, nền tảng Java không cung cấp các giao diện riêng cho từng biến thể của từng collection. Thay vào đó, nếu gọi phải một thao tác không được hỗ trợ, implementation (lớp triển khai) của collection đó sẽ ném ra một ngoại lệ có tên là UnsupportedOperationException.

1. Giao diện Collection

Đây là gốc (giao diện cha) của toàn bộ hệ thống collection. Một collection biểu diễn một nhóm các đối tượng được gọi là các phần tử (elements). Nền tảng Java không cung cấp bất kỳ triển khai trực tiếp nào cho giao diện này.

Giao diện có các phương thức cho biết có bao nhiêu phần tử trong collection (size, isEmpty), để kiểm tra xem một đối tượng nhất định có trong collection hay không (contains), để thêm và xóa một phần tử khỏi collection (add, remove) và để cung cấp một trình lặp qua collection (iterator).

Giao diện Collection cũng cung cấp các phương thức hoạt động hàng loạt như containsAll, addAll, removeAll, retainAll, clear.

Các phương thức toArray cũng được cung cấp để chuyển đổi giữa collection và các API cũ sử dụng mảng làm đầu vào.

2. Giao diện lặp

Giao diện lặp cung cấp các phương thức để lặp đi lặp lại các phần tử trong Collection. Có thể lấy phiên bản lặp lại bằng phương thức iterator(). Iterator thay thế cho Enumeration trong Java Collections Framework. Iterator cho phép ra lệnh xóa các phần tử khỏi collection cơ bản trong quá trình lặp. Iterator trong các lớp collection triển khai mẫu thiết kế lặp.

3. Giao diện Set

Set là một tập hợp không cho phép chứa các phần tử trùng lặp. Giao diện này mô hình hóa tập hợp toán học và được sử dụng để biểu diễn các tập hợp, chẳng hạn như bộ bài.

Nền tảng Java cung cấp ba lớp triển khai Set phổ biến:

  • HashSet
  • TreeSet
  • LinkedHashSet

Giao diện Set không cho phép truy cập ngẫu nhiên vào một phần tử trong Collection. Bạn có thể sử dụng iterator hoặc vòng lặp foreach để duyệt qua các phần tử của Set.

4. Giao diện List

List là một tập hợp được sắp xếp và có thể chứa các phần tử trùng lặp. Bạn có thể truy cập bất kỳ phần tử nào từ chỉ mục của nó. List giống như mảng có độ dài linh động hơn. List là một trong những kiểu Collection được sử dụng nhiều nhất. ArrayListLinkedList là các lớp triển khai của giao diện List.

Giao diện List cung cấp các phương thức hữu ích để thêm một phần tử tại một chỉ mục cụ thể, xóa/thay thế phần tử dựa trên chỉ mục và lấy một danh sách con bằng cách sử dụng chỉ mục.

Lớp Collections cung cấp một số thuật toán hữu ích cho List như sắp xếp, xáo trộn, đảo ngược, binarySearch,…

List strList = new ArrayList<>();

//add at last
strList.add(0, "0");

//add at specified index
strList.add(1, "1");

//replace
strList.set(1, "2");

//remove
strList.remove("1");

5. Giao diện Queue

Queue là một bộ sưu tập được sử dụng để giữ nhiều phần tử trước khi xử lý. Ngoài các thao tác cơ bản của Collection, Queue cung cấp các hoạt động chèn, trích xuất và kiểm tra bổ sung.

Queue thường sắp xếp các phần tử theo phương thức FIFO (nhập trước, xuất trước) nhưng không phải lúc nào cũng vậy. Một ngoại lệ là PriorityQueue (hàng đợi ưu tiên), trong đó các phần tử được sắp xếp dựa trên một comparator do người dùng cung cấp hoặc theo thứ tự tự nhiên của chính các phần tử đó.” Dù cách sắp xếp là gì, phần tử đầu hàng (head) là phần tử sẽ bị loại bỏ nếu gọi remove() hoặc poll() Trong một hàng đợi FIFO, tất cả các phần tử mới đều được chèn vào cuối hàng (tail).

6. Giao diện Deque

Đây là bộ sưu tập tuyến tính hỗ trợ chèn và xóa phần tử ở cả hai đầu. Tên deque là viết tắt của “double-ended queue” và thường được phát âm là “deck”. Hầu hết các triển khai Deque không đặt giới hạn cố định về số lượng phần tử mà chúng có thể chứa, nhưng giao diện này hỗ trợ các deque bị hạn chế về dung lượng cũng như các deque không có giới hạn kích thước cố định.

Giao diện này định nghĩa các phương thức để truy cập phần tử ở cả hai đầu của deque. Các phương thức được cung cấp để chèn, xóa và kiểm tra phần tử.

7. Giao diện Map

Java Map là một đối tượng ánh xạ (gán) các khóa với các giá trị. Một map không thể chứa các khóa trùng lặp: Mỗi khóa chỉ có thể ánh xạ tới nhiều nhất một giá trị.

Nền tảng Java cung cấp ba lớp triển khai Map phổ biến là HashMap, TreeMap và LinkedHashMap.

Các thao tác cơ bản của Map bao gồm: put (thêm phần tử), get (lấy giá trị theo khóa), containsKey (kiểm tra sự tồn tại của khóa), containsValue (kiểm tra sự tồn tại của giá trị), size (lấy số lượng phần tử), và isEmpty (kiểm tra map có rỗng hay không).

8. Giao diện ListIterator

Một iterator dành cho danh sách (list) cho phép lập trình viên duyệt qua danh sách theo cả hai chiều, sửa đổi danh sách trong quá trình lặp và lấy vị trí hiện tại của trình lặp trong danh sách.

Java ListIterator không có phần tử hiện tại cụ thể, vị trí con trỏ của nó luôn nằm giữa phần tử sẽ được trả về khi gọi previous() và phần tử sẽ được trả về khi gọi next().

9. Giao diện SortedSet

SortedSet là một Set duy trì các phần tử của nó theo thứ tự tăng dần. Nó cung cấp thêm một số thao tác để tận dụng lợi thế của việc sắp xếp này. Sorted sets được sử dụng cho các tập hợp được sắp xếp tự nhiên, chẳng hạn như danh sách từ vựng hoặc danh sách thành viên.

10. Giao diện SortedMap

Map là một kiểu dữ liệu duy trì các cặp ánh xạ (key/value) theo thứ tự tăng dần của key. Đây là bản đồ tương tự SortedSet. Sorted maps được sử dụng cho các bộ sưu tập được sắp xếp tự nhiên có các cặp khóa/giá trị, chẳng hạn như từ điển và danh bạ điện thoại.

Các lớp Java Collections

Java Collections framework đi kèm với nhiều lớp lớp hiện thực (implementation class) cho các interface. Các triển khai phổ biến nhất là ArrayList, HashMap và HashSet. Từ phiên bản Java 1.5, các phiên bản hỗ trợ đa luồng (concurrent) cũng được thêm vào, ví dụ như ConcurrentHashMap và CopyOnWriteArrayList. Thông thường, các lớp Collection không an toàn trong môi trường đa luồng (not thread-safe) và iterator của chúng là “fail-fast”. Trong phần này, chúng ta sẽ tìm hiểu về các lớp collection thường được sử dụng nhất.

1. HashSet

Java HashSet là triển khai cơ bản của giao diện Set được hỗ trợ bởi HashMap. Nó không đảm bảo thứ tự lặp lại của tập hợp và cho phép phần tử null.

Lớp này cung cấp hiệu suất thời gian không đổi cho các hoạt động cơ bản (add, remove, containssize), giả sử hàm phân tán các phần tử đúng cách giữa các thùng. Bạn có thể đặt dung lượng ban đầu và hệ số tải cho bộ sưu tập này. Hệ số tải là thước đo mức độ đầy đủ của bản đồ được phép đạt được trước khi dung lượng của nó tự động tăng lên.

2. TreeSet

Một triển khai NavigableSet dựa trên TreeMap. Các phần tử được sắp xếp theo thứ tự tự nhiên của chúng hoặc theo Comparator được cung cấp tại thời điểm tạo tập hợp, tùy thuộc vào hàm tạo nào được sử dụng.

Triển khai này cung cấp chi phí thời gian log(n) được đảm bảo cho các hoạt động cơ bản (thêm, xóa và chứa).

Lưu ý rằng thứ tự được duy trì bởi một tập hợp (bất kể có cung cấp bộ so sánh rõ ràng hay không) phải nhất quán với equals nếu nó triển khai đúng giao diện Set. (Xem Comparable hoặc Comparator để biết định nghĩa chính xác về nhất quán với equals.) Điều này là do giao diện Set được định nghĩa theo hoạt động equals, nhưng một lớp TreeSet thực hiện tất cả các phép so sánh phần tử bằng phương thức compareTo (hoặc compare), do đó, hai phần tử được coi là bằng nhau theo phương thức này.

3. ArrayList

JJava ArrayList là một phiên bản danh sách (List) được triển khai bằng mảng có thể thay đổi kích thước. Nó thực hiện tất cả các hoạt động danh sách tùy chọn của List và cho phép tất cả các phần tử, bao gồm cả null. Ngoài việc triển khai giao diện List, lớp này cung cấp các phương thức để thao tác kích thước của mảng được sử dụng nội bộ để lưu trữ danh sách. (Lớp này gần như tương đương với Vector, ngoại trừ việc nó không được đồng bộ hóa.)

Các thao tác như: size, isEmpty, get, set, iterator và list iterator có thời gian thực thi hằng số (constant time). Thao tác addcó thời gian thực thi trung bình là hằng số (amortized constant time), tức là việc thêm n phần tử sẽ mất thời gian O(n). Các thao tác còn lại thường mất thời gian tuyến tính (linear time). Hệ số hằng trong tính toán hiệu suất của ArrayList thường thấp hơn so với LinkedList.

4. LinkedList

LinkedList triển khai danh sách liên kết đôi của giao diện List, Deque cũng như triển khai tất cả các hoạt động danh sách tùy chọn và cho phép tất cả các phần tử (bao gồm cả null).

Tất cả các hoạt động đều thực hiện như mong đợi đối với danh sách liên kết đôi. Các hoạt động lập chỉ mục vào danh sách sẽ duyệt danh sách từ đầu hoặc cuối, tùy theo vị trí đã gần với chỉ mục đã chỉ định.

5. HashMap

Triển khai giao diện Map dựa trên bảng băm (hash table). Lớp này cung cấp tất cả các hoạt động bản đồ tùy chọn và cho phép các giá trị null và khóa null. Lớp HashMap gần tương đương với Hashtable, ngoại trừ việc nó không được đồng bộ hóa và cho phép sử dụng giá trị null. Lớp này không đảm bảo thứ tự của các phần tử trong Map.

Triển khai này cung cấp hiệu suất thời gian hằng số (constant time) cho các hoạt động cơ bản (getput). Nó cung cấp các hàm tạo để đặt dung lượng ban đầu và hệ số tải cho bộ sưu tập.

6. TreeMap

Một triển khai NavigableMap dựa trên cây đỏ-đen (Red-Black tree). Map này sắp xếp các phần tử theo thứ tự tự nhiên của các khóa hoặc theo Comparator được cung cấp tại thời điểm tạo map, tùy thuộc vào constructor được sử dụng..

Triển khai này đảm bảo chi phí thời gian là log(n) cho các thao tác containsKey, get, put và remove. Thuật toán trong lớp này là sự điều chỉnh của các thuật toán Cormen, Leiserson và Rivest.

Lưu ý rằng thứ tự được duy trì bởi TreeMap, giống như bất kỳ SortedMap nào dù có cung cấp Comparator rõ ràng hay không, phải nhất quán với equals nếu muốn triển khai chính xác giao diện Map. (Xem Comparable hoặc Comparator để biết định nghĩa chính xác về nhất quán với equals.) Điều này là do giao diện Bản đồ được định nghĩa theo hoạt động equals, nhưng SortedMap lại sử dụng phương thức compareTo (hoặc compare) để so sánh khóa.

Do đó, hai khóa được xem là bằng nhau theo phương thức này thì đối với SortedMap, chúng là như nhau.

Hành vi của SortedMap vẫn được định nghĩa rõ ràng ngay cả khi thứ tự của nó không nhất quán với equals, nó chỉ không tuân theo quy tắc chung của giao diện Map.

7. PriorityQueue

Queue xử lý các phần tử của nó theo thứ tự FIFO nhưng đôi khi chúng ta muốn các phần tử được xử lý dựa trên mức độ ưu tiên của chúng. Bạn có thể sử dụng PriorityQueue trong trường hợp này và cần cung cấp triển khai Comparator trong khi khởi tạo PriorityQueue. PriorityQueue không cho phép các giá trị null và nó không bị giới hạn. Để biết thêm chi tiết, vui lòng truy cập Java Priority Queue, nơi bạn có thể kiểm tra cách sử dụng bằng một chương trình mẫu.

Lớp Collections

Lớp Collections trong Java chỉ bao gồm các phương thức tĩnh (static) hoạt động hoặc trả về các collection. Nó chứa các thuật toán đa hình (polymorphic algorithms) hoạt động trên collection, các “wrapper” trả về một collection mới được hỗ trợ bởi một collection đã cho, và một vài chức năng khác.

Lớp này bao gồm các phương thức cho các thuật toán trong framework collections như tìm kiếm nhị phân (binary search), sắp xếp (sorting), xáo trộn (shuffling), đảo ngược (reverse),…

Các lớp bao đồng bộ

Các trình bao đồng bộ (synchronization wrappers) thêm khả năng đồng bộ hóa tự động (an toàn trong môi trường đa luồng) cho bất kỳ collection nào. Sáu giao diện cốt lõi của collection là Collection, Set, List, Map, SortedSet, và SortedMap, đều có một phương thức static dạng factory.

public static  Collection synchronizedCollection(Collection c);
public static  Set synchronizedSet(Set s);
public static  List synchronizedList(List list);
public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m);
public static  SortedSet synchronizedSortedSet(SortedSet s);
public static <K,V> SortedMap<K,V> synchronizedSortedMap(SortedMap<K,V> m);

Mỗi phương thức này trả về một collection đã được đồng bộ hóa (an toàn luồng) được hỗ trợ bởi collection đã chỉ định.

Các lớp bao không thể chỉnh sửa 

Các lớp bao không thể chỉnh sửa (unmodifiable wrappers) loại bỏ khả năng thay đổi collection bằng cách chặn tất cả các thao tác có thể làm thay đổi collection và ném ra UnsupportedOperationException. Các mục đích sử dụng chính của chúng là:

  • Biến collection thành bất biến sau khi đã được xây dựng: Trong trường hợp này, nên tránh giữ tham chiếu đến collection gốc, nhằm đảm bảo tuyệt đối tính bất biến.
  • Cung cấp quyền truy cập chỉ đọc cho một số đối tượng sử dụng (client): Bạn giữ tham chiếu tới collection gốc nhưng chỉ đưa cho client tham chiếu tới wrapper. Như vậy, client chỉ có thể đọc, còn bạn vẫn có thể sửa đổi đầy đủ.
public static  Collection unmodifiableCollection(Collection<? extends T> c);
public static  Set unmodifiableSet(Set<? extends T> s);
public static  List unmodifiableList(List<? extends T> list);
public static <K,V> Map<K, V> unmodifiableMap(Map<? extends K, ? extends V> m);
public static  SortedSet unmodifiableSortedSet(SortedSet<? extends T> s);
public static <K,V> SortedMap<K, V> unmodifiableSortedMap(SortedMap<K, ? extends V> m);

Các lớp Collection an toàn luồng

Gói java.util.concurrent trong Java 1.5 bao gồm các lớp collection an toàn luồng (thread-safe), cho phép collection được chỉnh sửa trong khi đang lặp (iteration). Theo mặc định, iterator là “fail-fast” và sẽ trả kết quả ConcurrentModificationException. Một số lớp tiêu biểu là: CopyOnWriteArrayList, ConcurrentHashMap, CopyOnWriteArraySet.

Thuật toán API của Collections

Java Collections Framework cung cấp các thuật toán phổ biến như sắp xếp và tìm kiếm. Các thuật toán này được cài đặt trong lớp Collections. Phần lớn các thuật toán này hoạt động trên List, nhưng một số có thể áp dụng cho mọi loại collection.

1. Sắp xếp

Thuật toán sort sẽ sắp xếp lại một List sao cho các phần tử theo thứ tự tăng dần. Có hai dạng:

  • Dạng đơn giản: nhận một List và sắp xếp theo thứ tự tự nhiên của các phần tử.
  • Dạng thứ hai: nhận thêm Comparator để sắp xếp theo logic tùy chỉnh.

2. Xáo trộn

Thuật toán shuffle phá vỡ mọi thứ tự sẵn có trong List. Nó tái sắp xếp danh sách một cách ngẫu nhiên sao cho mọi khả năng sắp xếp đều có xác suất bằng nhau (với nguồn ngẫu nhiên công bằng). Thuật toán này thường được sử dụng trong các trò chơi may rủi.

3. Tìm kiếm

Thuật toán binarySearch dùng để tìm kiếm phần tử trong danh sách đã sắp xếp. Có hai dạng:

  • Dạng đơn giản: nhận List và phần tử cần tìm (khóa tìm kiếm), giả định danh sách đã được sắp theo thứ tự tự nhiên.
  • Dạng thứ hai: thêm Comparator để tìm theo cách sắp xếp tùy chỉnh.

Cần sử dụng sort() trước khi dùng binarySearch() để đảm bảo danh sách đã được sắp xếp đúng.

4. Kiểm tra thành phần

Các thuật toán frequency và disjoint kiểm tra mối quan hệ giữa các collection:

  • frequency: đếm số lần một phần tử xuất hiện trong collection.
  • disjoint: xác định hai collection có phần tử chung hay không.

5. Giá trị nhỏ nhất và lớn nhất

Thuật toán min và max lần lượt trả về phần tử nhỏ nhất và lớn nhất trong một collection. Cả hai đều có hai dạng:

  • Dạng đơn giản: chỉ nhận Collection, sắp theo thứ tự tự nhiên.
  • Dạng có Comparator: sắp theo logic tùy chỉnh.

Tính năng mới của Collections API trong Java 8

Java 8 có những thay đổi đáng kể liên quan đến Collection API:

  • Giới thiệu Stream API cho xử lý tuần tự và song song (song song hoá).
  • Giao diện Iterable được mở rộng với phương thức mặc định forEach() để duyệt qua collection.
  • Biểu thức lambdafunctional interface đặc biệt hữu ích với các class trong Collection API.

Thay đổi Collections API trong Java 10

  • Thêm các phương thức List.copyOf, Set.copyOf, Map.copyOf để tạo các collection không thể thay đổi (immutable).
  • Lớp Collectors bổ sung các phương thức như toUnmodifiableList, toUnmodifiableSet, toUnmodifiableMapđể thu thập dữ liệu thành các collection bất biến.

Hãy cùng xem một ví dụ về cách sử dụng phương thức API trong Java 10 mới dưới đây.

package com.journaldev.collections;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class JDK11CollectionFunctions {

	public static void main(String[] args) {

		/*
		 * JDK 11 New Method in Collection interface
		 * default <T> T[] toArray(IntFunction<T[]> generator) {
		 * return toArray(generator.apply(0)); }
		 */

		List<String> strList = new ArrayList<>();
		strList.add("Java");
		strList.add("Python");
		strList.add("Android");

		String[] strArray = strList.toArray(size -> new String[size]);
		System.out.println(Arrays.toString(strArray));

		strArray = strList.toArray(size -> new String[size + 5]);
		System.out.println(Arrays.toString(strArray));

		strArray = strList.toArray(size -> new String[size * 3]);
		System.out.println(Arrays.toString(strArray));
	}

}

Thay đổi Collections API trong Java 11

  • Thêm phương thức mặc định toArray(IntFunction<T[]> generator) trong giao diện Collection, cho phép tạo mảng chứa các phần tử từ collection bằng cách dùng hàm sinh (generator function).

Kết quả:

[Java, Python, Android]
[Java, Python, Android, null, null]
[Java, Python, Android]

Tổng quan các lớp Collection

Bảng sau cung cấp thông tin cơ bản về các lớp collection phổ biến nhất.

Collection Ordering Random Access Key-Value Duplicate Elements Null Element Thread Safety
ArrayList
LinkedList
HashSet
TreeSet
HashMap
TreeMap
Vector
Hashtable
Properties
Stack
CopyOnWriteArrayList
ConcurrentHashMap
CopyOnWriteArraySet

Kết luận

Java Collections Framework là nền tảng quan trọng giúp lập trình viên quản lý và thao tác với dữ liệu một cách hiệu quả. Từ các lớp tiện ích như Collections, các wrapper đồng bộ và bất biến, đến các thuật toán phổ biến như sắp xếp, tìm kiếm hay trộn danh sách – tất cả đều được xây dựng để hỗ trợ việc phát triển ứng dụng rõ ràng, an toàn và dễ bảo trì.

Với những cải tiến mạnh mẽ qua các phiên bản Java 8, 10 và 11 như Stream API, lambda expression hay các phương thức tạo collection bất biến, Collections Framework ngày càng trở nên linh hoạt và hiện đại hơn. Việc hiểu rõ và vận dụng tốt hệ thống này sẽ giúp bạn viết mã ngắn gọn, tối ưu hiệu năng và dễ dàng mở rộng trong các dự án thực tế.

0 Bình luận

Đăng nhập để thảo luận

Chuyên mục Hướng dẫn

Tổng hợp các bài viết hướng dẫn, nghiên cứu và phân tích chi tiết về kỹ thuật, các xu hướng công nghệ mới nhất dành cho lập trình viên.

Đăng ký nhận bản tin của chúng tôi

Hãy trở thành người nhận được các nội dung hữu ích của CyStack sớm nhất

Xem chính sách của chúng tôi Chính sách bảo mật.