Collection là một trợ thủ đắc lực cho lập trình viên Java trong việc quản lý và thao tác với nhóm dữ liệu. Bài viết này sẽ cung cấp cho bạn cái nhìn tổng quan về Collection trong Java là gì và cách Java sử dụng công cụ này để phân cấp dữ liệu kiểu tập hợp.
Collection là gì?
Collection là một root interface trong Collection framework của Java, được định nghĩa trong java.util package với nhiệm vụ đại diện cho một tập hợp các phần tử riêng lẻ. Collection interface cung cấp các method thiết yếu để thao tác với dữ liệu tập hợp, bao gồm: add, delete, clear, size, contains,… List, Queue, Set là 3 sub-interfaces chính kế thừa từ Collection, mỗi giao diện mang đặc điểm và thứ tự sắp xếp riêng cho các phần tử trong tập hợp.
Để sử dụng Collection trong Java hiệu quả, bạn cần phân biệt rõ ràng giữa 2 khái niệm: Collection và Collections. Đây là 2 thành phần quan trọng trong Java Collection Framework, được cung cấp từ java.util package và giúp lập trình viên quản lý, thao tác với tập dữ liệu hiệu quả. Tuy nhiên, trong khi Collection là root interface thì Collections là utility class (lớp tiện ích) cung cấp static method để thực hiện thao tác trên các collection như tìm kiếm, chèn, xóa,…
Ví dụ về Collection trong Java:
Tạo một ArrayList (1 class triển khai của Collection interface):
Creating an object of List<String>
List<String> arrlist = new ArrayList<String>();
So sánh Collection vs Collections
Trong Java, “Collection” và “Collections” là hai khái niệm hoàn toàn khác nhau thuộc Java Collections Framework.
Collection là một giao diện (interface) trong Java, đóng vai trò là cơ sở cho hệ thống phân cấp các lớp tập hợp trong Java. Collection định nghĩa các phương thức chung để làm việc với các tập hợp đối tượng, chẳng hạn như thêm, xóa, tìm kiếm và duyệt qua các phần tử.
Collections là một lớp tiện ích (utility class) trong Java, cung cấp các phương thức tĩnh (static methods) để thực hiện các thao tác phổ biến trên các đối tượng Collection, chẳng hạn như sắp xếp, tìm kiếm, đảo ngược, xáo trộn và đồng bộ hóa.
Java Collection Framework là gì?
Java Collection Framework (JCF) là một kho thư viện cung cấp nhiều class (lớp), interface (giao diện) và algorithm (thuật toán) được thiết kế sẵn để giúp lập trình viên có thể dễ dàng thực hiện các thao tác như thêm, xóa, tìm kiếm, lọc,… dữ liệu dạng tập hợp và đồ thị.
Các thành phần chính của Java Collection Framework là:
- Interface: Định nghĩa các phương thức thao tác với dữ liệu kiểu tập hợp, ví dụ như List, Set, Map,…
- Class: Triển khai các interface, cung cấp các cấu trúc dữ liệu cụ thể như ArrayList, LinkedList, HashMap,…
- Algorithm: Các hàm xử lý dữ liệu thông dụng như sort(), search(), filter(),…
Java Collection Framework mang đến nhiều lợi ích nổi bật cho người dùng:
- Đơn giản hóa việc lưu trữ, truy cập, quản lý và thao tác dữ liệu dạng tập hợp và đồ thị.
- Nâng cao hiệu suất, giúp giảm thiểu thời gian cần thiết để xây dựng ứng dụng.
- Lập trình viên dễ dàng tái sử dụng code cho các dự án khác nhau.
Hệ thống phân cấp của Java Collection Framework
Java Collection Framework là một thư viện cốt lõi trong Java, cung cấp một hệ thống các interface, lớp và thuật toán mạnh mẽ để lưu trữ, quản lý và xử lý các tập hợp dữ liệu một cách hiệu quả. Framework này không chỉ giúp đơn giản hóa việc làm việc với các cấu trúc dữ liệu phức tạp như danh sách, tập hợp và hàng đợi, mà còn tối ưu hóa hiệu suất và tăng tính tái sử dụng của code.
Hệ thống phân cấp của Collection Framework:
Hệ thống phân cấp của Collection Framework được chia thành hai nhánh chính:
- Interface Collection: Đại diện cho một nhóm các đối tượng (elements). Các interface con của Collection như List, Set và Queue định nghĩa các đặc điểm và hành vi cụ thể cho từng loại tập hợp.
- Interface Map: Đại diện cho một tập hợp các cặp key-value, trong đó mỗi key ánh xạ tới một value duy nhất.
Các lớp triển khai phổ biến:
- ArrayList: Triển khai interface List, cho phép truy cập ngẫu nhiên nhanh chóng đến các phần tử.
- LinkedList: Triển khai interface List, cho phép chèn và xóa phần tử ở giữa danh sách một cách hiệu quả.
- HashSet: Triển khai interface Set, không cho phép các phần tử trùng lặp và không đảm bảo thứ tự.
- TreeSet: Triển khai interface Set, sắp xếp các phần tử theo thứ tự tự nhiên hoặc theo một Comparator được chỉ định.
- HashMap: Triển khai interface Map, không đảm bảo thứ tự của các cặp key-value.
- TreeMap: Triển khai interface Map, sắp xếp các cặp key-value theo thứ tự tự nhiên của key hoặc theo một Comparator được chỉ định.
3 lớp trong Collection
Chắc hẳn bạn đã từng nghe qua về “Collection” trong lập trình, nhưng bạn có biết rằng chúng được cấu trúc từ 3 lớp chính không? Ba lớp này đóng vai trò nền tảng, giúp cho việc quản lý và thao tác dữ liệu trở nên dễ dàng và hiệu quả hơn. Tiếp theo, chúng ta sẽ cùng nhau khám phá chi tiết về từng lớp, từ đó hiểu rõ hơn về cách chúng tương tác và tạo nên sức mạnh cho Collection.
1. List (Danh sách)
List là một collection dành cho dữ liệu dạng list, cho phép lưu trữ và quản lý nhiều phần tử (trùng lặp) một cách hiệu quả. Điểm đặc biệt của List so với các kiểu dữ liệu khác là quyền kiểm soát vị trí của từng phần tử và truy cập chúng dễ dàng bằng chỉ số.
3 class con triển khai phổ biến nhất của List interface là:
- ArrayList: Đây là loại List phổ biến nhất, sử dụng mảng để lưu trữ dữ liệu. Nhờ sử dụng index, ArrayList giúp lập trình viên truy cập và thao tác với từng phần tử nhanh chóng.
- LinkedList: Sử dụng địa chỉ bộ nhớ để liên kết các phần tử với nhau giúp việc lưu trữ danh sách có nhiều phần tử dễ dàng hơn. Tuy nhiên, việc truy cập ngẫu nhiên vào các phần tử trong LinkedList có thể chậm hơn so với ArrayList.
- Vector: Vector cũng sử dụng mảng để lưu trữ dữ liệu như ArrayList nhưng trong môi trường đa luồng. Nghĩa là khi nhiều luồng cùng truy cập vào Vector, chỉ có một luồng được phép thực hiện thao tác tại một thời điểm.
2. Queue (Hàng đợi)
Queue là một collection trong đó các phần tử được lưu trữ và xử lý theo nguyên tắc FIFO (First In – First Out). Điều này có nghĩa là khi một phần tử mới được thêm vào cuối hàng đợi thì đồng thời phần tử cũ nhất sẽ được xóa khỏi đầu hàng đợi. Hiểu đơn giản hơn, phần tử nào được thêm vào hàng đợi trước sẽ là phần tử được xử lý trước.
Tuy nhiên, Java còn cung cấp một interface khác kế thừa Queue là Deque (Double Ended Queue). Deque mở rộng chức năng của Queue bằng cách hỗ trợ thêm nguyên tắc LIFO (Last in, First out). Như vậy, phần tử có thể được thêm vào – lấy ra linh hoạt ở cả đầu và cuối hàng đợi.
2 class để triển khai Queue phổ biến trong Java có thể kể đến là:
- PriorityQueue: Là hàng đợi ưu tiên, trong đó phần tử có mức độ ưu tiên cao hơn sẽ được xử lý trước.
- ArrayDeque: Sử dụng mảng động để lưu trữ dữ liệu và có cách thức hoạt độ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 giá trị duy nhất và không theo thứ tự xác định. Khi bạn thêm một phần tử vào Set, nếu phần tử đó đã tồn tại thì sẽ không có gì thay đổi trong Set. Điều này giúp đảm bảo rằng mỗi phần tử trong Set chỉ xuất hiện một lần. SortedSet là sub-interface kế thừa từ Set, bổ sung khả năng sắp xếp các phần tử theo thứ tự được xác định.
Các class triển khai phổ biến của Set interface là HashSet, LinkedHashSet và TreeSet. Nổi bật trong số đó là TreeSet, kế thừa từ SortedSet và sử dụng TreeMap (class triển khai Map interface) để lưu trữ và sắp xếp thứ tự hiệu quả.
Các thuật toán cơ bản của Collection trong Java
Các thuật toán trong Collections là các phương thức tĩnh (static methods) được cung cấp bởi lớp java.util.Collections, cho phép thực hiện các thao tác phổ biến trên các đối tượng Collection một cách tiện lợi và hiệu quả.
Phương thức sắp xếp Java Collections
Sắp xếp (Sorting) là một thao tác quan trọng khi làm việc với Java Collections Framework, cho phép bạn sắp xếp các phần tử trong một Collection (như List) theo một thứ tự cụ thể. Java cung cấp nhiều phương thức và công cụ để thực hiện việc sắp xếp một cách linh hoạt và hiệu quả.
Các phương thức sắp xếp:
Collections.sort(list)
: Sắp xếp mộtList
theo thứ tự tự nhiên (tăng dần) của các phần tử. Nếu các phần tử là các đối tượng, chúng cần phải triển khai interfaceComparable
hoặc bạn cần cung cấp mộtComparator
để xác định thứ tự sắp xếp.Collections.sort(list, comparator)
: Sắp xếp mộtList
theo thứ tự tùy chỉnh được xác định bởiComparator
.list.sort(comparator)
: (Java 8 trở lên) Sắp xếp mộtList
trực tiếp bằng phương thứcsort()
của chính List đó.
Ví dụ:
List<String> ten = Arrays.asList("Bình", "An", "Minh");
Collections.sort(ten); // Sắp xếp theo thứ tự bảng chữ cái: An, Bình, Minh
List<Integer> so = Arrays.asList(5, 2, 8, 1);
Collections.sort(so); // Sắp xếp theo thứ tự tăng dần: 1, 2, 5, 8
List<SinhVien> sinhVien = ... // Danh sách sinh viên
Collections.sort(sinhVien, Comparator.comparing(SinhVien::getTuoi)); // Sắp xếp theo tuổi tăng dần
Phương thức tìm kiếm Java Collections
Tìm kiếm là một thao tác quan trọng trong Java Collections Framework, giúp truy xuất hiệu quả các phần tử trong tập hợp và danh sách dựa trên tiêu chí cụ thể. Framework này cung cấp nhiều phương thức tìm kiếm khác nhau, phù hợp với từng loại Collection và yêu cầu cụ thể.
Các phương thức tìm kiếm trong List:
contains(Object o)
: Kiểm tra xem một đối tượng có tồn tại trong danh sách hay không.indexOf(Object o)
: Trả về chỉ số (index) của lần xuất hiện đầu tiên của đối tượng trong danh sách, nếu không tìm thấy trả về -1.lastIndexOf(Object o)
: Trả về chỉ số (index) của lần xuất hiện cuối cùng của đối tượng trong danh sách, nếu không tìm thấy trả về -1.
Ví dụ:
List<String> fruits = new ArrayList<>(Arrays.asList("apple", "banana", "orange"));
boolean containsBanana = fruits.contains("banana"); // true
int indexOfBanana = fruits.indexOf("banana"); // 1
Phương thức xóa Java Collections
Trong Java, Collections
không chỉ được sử dụng để lưu trữ và quản lý các đối tượng, mà còn cung cấp các phương thức để xóa một hoặc nhiều phần tử khỏi tập hợp khi cần thiết.
Các phương thức xóa phổ biến:
remove(Object o)
: Xóa lần xuất hiện đầu tiên của đối tượngo
khỏi Collection.remove(int index)
: Xóa phần tử tại vị tríindex
khỏi List.removeAll(Collection<?> c)
: Xóa tất cả các phần tử có trong Collectionc
khỏi Collection hiện tại.retainAll(Collection<?> c)
: Chỉ giữ lại các phần tử có trong Collectionc
trong Collection hiện tại.clear()
: Xóa tất cả các phần tử khỏi Collection.
Ví dụ:
List<String> numbers = new ArrayList<>(Arrays.asList("one", "two", "three"));
Iterator<String> iterator = numbers.iterator();
while (iterator.hasNext()) {
String number = iterator.next();
if (number.equals("two")) {
iterator.remove(); // Xóa phần tử "two" một cách an toàn
}
}
Phương thức thêm Java Collections
Phương thức add()
là một trong những phương thức cơ bản nhất trong Java Collections Framework, được sử dụng để thêm một phần tử vào một tập hợp (collection). Phương thức này được định nghĩa trong interface Collection
, và được triển khai bởi các lớp con như ArrayList
, LinkedList
(đối với List), HashSet
, TreeSet
(đối với Set) và PriorityQueue
(đối với Queue).
Ví dụ:
List<String> danhSach = new ArrayList<>();
danhSach.add("Java");
danhSach.add("Python");
Set<Integer> tapHop = new HashSet<>();
tapHop.add(1);
tapHop.add(2);
tapHop.add(1); // Phần tử 1 không được thêm vào vì Set không cho phép trùng lặp
Queue<String> hangDoi = new LinkedList<>();
hangDoi.add("Task 1");
hangDoi.add("Task 2");
Câu hỏi thường gặp
Phát triển phần mềm ở Việt Nam, các Collection nào được sử dụng phổ biến nhất? Vì sao?
Java Collection Framework là bộ công cụ phổ biến nhất trong giới lập trình Java Việt Nam bởi khả năng cung cấp nhiều Collection hữu ích như ArrayList, HashMap, HashSet, LinkedList,… Mỗi Collection sở hữu điểm mạnh và điểm yếu riêng, phù hợp cho nhu cầu tối ưu hóa hiệu suất cụ thể của từng dự án. Ví dụ, ArrayList tối ưu cho truy cập ngẫu nhiên, trong khi HashMap lại ưu việt trong việc tìm kiếm theo key.
Sự khác biệt giữa Collection, Set và List trong Java là gì?
Collection, Set và List là 3 interface phổ biến nhất trong Collection Framework. Mỗi interface sở hữu những đặc điểm riêng biệt:
– Collection: Là interface root, cung cấp các method cơ bản để thao tác với dữ liệu kiểu tập hợp. Collection cho phép phần tử trùng lặp và không cần tuân theo thứ tự nhất định.
– Set: Là sub-interface kế thừa từ Collection, đảm bảo tính duy nhất của các phần tử (không trùng lặp).
– List: Là sub-interface kế thừa từ Collection, duy trì thứ tự của phần tử khi được thêm vào và cho phép truy cập phần tử theo vị trí (index). List có thể chứa phần tử trùng lặp.
Garba Collection trong Java là gì?
Garbage Collection trong Java là một tính năng tự động giúp tối ưu hóa việc quản lý bộ nhớ Heap – khu vực dành riêng để lưu trữ đối tượng được tạo ra khi vận hành chương trình. Khi đối tượng không còn được sử dụng thì sẽ tự động được giải phóng, ngăn chặn tình trạng tràn bộ nhớ.
Lời kết
Trên đây là toàn bộ thông tin mà bạn cần nắm về Collection trong Java – một công cụ vô cùng mạnh mẽ giúp lập trình viên dễ dàng lưu trữ, quản lý và thao tác với dữ liệu tập hợp. Mong rằng qua đó, bạn có thể áp dụng những kiến thức này vào lập trình, xây dựng ứng dụng Java trong thực tế.