Interface Collection<E>

Interface Collection<E> là giao diện gốc trong hệ thống phân cấp của framework Collection trong Java. Nó đại diện cho một nhóm các đối tượng, được gọi là phần tử (elements). Collection<E> mở rộng từ Iterable<E>, nghĩa là tất cả các lớp triển khai Collection đều có thể lặp qua các phần tử của chúng bằng cách sử dụng vòng lặp "for-each".

Đặc điểm của Interface Collection<E>

↳ Tập hợp các đối tượng: Collection<E> đại diện cho một tập hợp các đối tượng (elements). Một số loại collection cho phép các phần tử trùng lặp, trong khi số khác không. Một số collection có thứ tự, trong khi số khác không có thứ tự.

↳ Không có triển khai trực tiếp: Java không cung cấp các lớp triển khai trực tiếp cho interface Collection<E>. Thay vào đó, Java cung cấp các lớp triển khai cho các subinterface cụ thể của Collection<E>, như Set<E>, List<E>, và Queue<E>.

Hạn chế về phần tử (Element Restrictions)

↳ Null elements: Một số triển khai của Collection không cho phép chứa các phần tử là null. Nếu bạn cố gắng thêm phần tử null vào những collection này, chúng sẽ ném ra ngoại lệ không kiểm tra, thường là NullPointerException.

↳ Hạn chế về kiểu phần tử: Một số collection có giới hạn về kiểu dữ liệu của các phần tử mà chúng có thể chứa. Nếu bạn thêm một phần tử không hợp lệ (không đúng kiểu), nó sẽ ném ra ngoại lệ như ClassCastException.

↳ Truy vấn phần tử không hợp lệ: Khi cố gắng kiểm tra sự hiện diện của một phần tử không hợp lệ trong một collection, có thể xảy ra hai trường hợp:

↳ Collection có thể ném một ngoại lệ.

↳ Hoặc chỉ đơn giản trả về false.

↳ Các hành vi này có thể thay đổi tùy theo từng triển khai cụ thể của Collection.

Chính sách đồng bộ hóa

↳ Đồng bộ hóa không bắt buộc: Các collection trong Java không bắt buộc phải được đồng bộ hóa. Mỗi collection có thể tự quyết định liệu nó có cần được đồng bộ hóa hay không. Điều này có nghĩa là, nếu không có sự đồng bộ hóa rõ ràng từ việc triển khai, có thể xảy ra các vấn đề nếu nhiều luồng (threads) cố gắng thay đổi collection cùng một lúc.

↳ Hành vi không xác định: Nếu một phương thức (ví dụ như thêm hoặc xóa phần tử) được gọi trên một collection đang bị thay đổi đồng thời bởi một luồng khác, kết quả có thể không thể đoán trước. Điều này cũng đúng nếu bạn đang sử dụng một iterator để duyệt qua collection đó, và collection bị thay đổi bởi một luồng khác trong khi bạn đang duyệt.

↳ Nếu bạn không đồng bộ hóa việc truy cập vào một collection khi nhiều luồng sử dụng nó, có thể dẫn đến các lỗi không mong muốn hoặc kết quả không xác định. Việc này đặc biệt quan trọng khi sử dụng collection trong môi trường đa luồng.

Các phương thức chính của Collection<E>

Collection<E> là giao diện gốc trong hệ thống Collection của Java, đại diện cho một tập hợp các phần tử. Khả năng lặp qua (iterable) là một đặc tính vốn có của mọi Collection do nó mở rộng từ Iterable. Tiếp theo, chúng ta sẽ xem xét tất cả các phương thức chính mà giao diện này cung cấp:

↳ boolean add(E e): Đảm bảo rằng bộ sưu tập chứa phần tử đã cho (tùy chọn).

↳ boolean addAll(Collection<? extends E> c): Thêm tất cả các phần tử trong bộ sưu tập đã cho vào bộ sưu tập này (tùy chọn).

↳ void clear(): Xóa tất cả các phần tử khỏi bộ sưu tập này (tùy chọn).

↳ boolean contains(Object o): Trả về true nếu bộ sưu tập chứa phần tử đã cho.

↳ boolean containsAll(Collection<?> c): Trả về true nếu bộ sưu tập này chứa tất cả các phần tử trong bộ sưu tập đã cho.

↳ boolean equals(Object o): So sánh đối tượng đã cho với bộ sưu tập này để kiểm tra xem chúng có bằng nhau hay không.

↳ int hashCode(): Trả về giá trị mã băm cho bộ sưu tập này.

↳ boolean isEmpty(): Trả về true nếu bộ sưu tập này không chứa phần tử nào.

↳ Iterator<E> iterator(): Trả về một iterator duyệt qua các phần tử trong bộ sưu tập.

↳ default Stream<E> parallelStream(): Trả về một luồng có thể song song với bộ sưu tập này làm nguồn.

↳ boolean remove(Object o): Xóa một thể hiện duy nhất của phần tử đã cho khỏi bộ sưu tập này, nếu có (tùy chọn).

↳ boolean removeAll(Collection<?> c): Xóa tất cả các phần tử của bộ sưu tập này cũng có trong bộ sưu tập đã cho (tùy chọn).

↳ default boolean removeIf(Predicate<? super E> filter): Xóa tất cả các phần tử của bộ sưu tập này thỏa mãn điều kiện cho trước.

↳ boolean retainAll(Collection<?> c): Chỉ giữ lại các phần tử trong bộ sưu tập này cũng có trong bộ sưu tập đã cho (tùy chọn).

↳ int size(): Trả về số lượng phần tử trong bộ sưu tập.

↳ default Spliterator<E> spliterator(): Tạo một Spliterator duyệt qua các phần tử trong bộ sưu tập.

↳ default Stream<E> stream(): Trả về một luồng tuần tự với bộ sưu tập này làm nguồn.

↳ Object[] toArray(): Trả về một mảng chứa tất cả các phần tử trong bộ sưu tập.

↳ <T> T[] toArray(T[] a): Trả về một mảng chứa tất cả các phần tử trong bộ sưu tập; kiểu thời gian chạy của mảng được trả về là kiểu của mảng đã cho

Hy vọng với phần giải thích chi tiết này, bạn đã hiểu rõ hơn về các phương thức cốt lõi của giao diện Collection. Đây là những công cụ không thể thiếu khi bạn làm việc với các tập hợp dữ liệu trong Java.

Câu Nói Truyền Cảm Hứng

“Không ai sinh ra đã giỏi. Mọi thành công đều bắt đầu từ một bước nhỏ.” – Lao Tzu

Không Gian Tích Cực

“Chúc bạn một ngày mới đầy năng lượng và sự sáng tạo, luôn tiến về phía trước.”