Cập nhật nội dung chi tiết về Tổng Quan Về Collections Trong Java mới nhất trên website Honggaitour.com. Hy vọng thông tin trong bài viết sẽ đáp ứng được nhu cầu ngoài mong đợi của bạn, chúng tôi sẽ làm việc thường xuyên để cập nhật nội dung mới nhằm giúp bạn nhận được thông tin nhanh chóng và chính xác nhất.
1. Giới thiệu Java Collection Framework
Bất kì lập trình viên nào đã từng làm việc với Java hay Android có lẽ đề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ị. 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.
Framework phải là hiệu năng cao. Sự triển khai cho các tập hợp cơ bản (các mảng động, linked list, tree và hashtable) được sử dụng với hiệu quả cao.
Framework phải cho phép các kiểu tập hợp khác nhau để làm việc theo một cách tương tự như nhau với độ phân hóa ở mức cao.
Kế thừa và/hoặc tìm hiểu với các tập hợp phải là dễ dàng. Một collections framework là một cấu trúc thống nhất để biểu diễn và thao tác các collection. Tất cả collections framework đều chứa:
Interface: Đây là các kiểu dữ liệu abstract mà biểu diễn collection. Interface cho phép collection được thao tác một cách độc lập theo phép biểu diễn của chúng. Trong ngôn ngữ hướng đối tượng, các interface nói chung cấu tạo nên một hierarchy.
Sự triển khai: ví dụ như các Class Đây là sự triển khai cụ thể của collection interface. Về bản chất, chúng là những cấu trúc dữ liệu có thể tái sử dụng.
Thuật toán: Đây là các phương thức thực hiện các trình tính toán hữu ích, như tìm kiếm và xếp thứ tự phân loại, trên các đối tượng mà triển khai collection interface. Các thuật toán được xem như là đa hình: đó là, cùng một phương thức có thể được sử dụng trên nhiều sự triển khai khác nhau của collection interface thích hợp.
Ngoài ra, framework định nghĩa một số map interfaces và class. Map lưu giữ các cặp key/value. Mặc dù các map không là collections về khái niệm, nhưng chúng hoàn toàn tương thích với collection. Để 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
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.
http://vietjack.com/java/collection_trong_java.jsphttps://docs.oracle.com/javase/8/docs/technotes/guides/collections/overview.htmlhttp://that2u.com/java-collection-framework-phan-1-gioi-thieu-chung/http://o7planning.org/vi/10165/huong-dan-su-dung-nen-tang-tap-hop-trong-java#a12326
All Rights Reserved
Tìm Hiểu Về Collections Framework Trong Java
Trong bài này, chúng ta sẽ tìm hiểu về các interface khác nhau của collections framework trong Java.
Nền tảng Java bao gồm một collections framework. Framework cung cấp một bộ các interface và các class để thực hiện các cấu trúc dữ liệu và thuật toán khác nhau.
Ví dụ, class LinkedList của collections framework thực hiện cấu trúc dữ liệu danh sách liên kết đôi.
1. Interface của collections framework
Collections framework trong Java có nhiều interface khác nhau. Các interface này bao gồm nhiều hàm để thực hiện các toán tử khác nhau với collections.
Trong các chương sau , chúng ta sẽ tìm hiểu về các interface nói trên, các interface con của chúng và cách triển khai trong các class một cách chi tiết. Còn trong hướng dẫn này, chúng ta hãy tìm hiểu sơ qua về các interface thường được sử dụng.
2. Collection Interface trong Java
Collection Interface là một root Interface có trong collections framework.
Java không cung cấp việc triển khai trực tiếp Collection interface nhưng lại triển khai các interface con của nó như List, Set, và Queue.
3. Collections Framework Và Collection Interface
Mọi người thường bị nhầm lẫn giữa collections framework và Collection Interface. Collection Interface là Interface có trong collections framework. Framework cũng bao gồm các interface khác là Map và Iterator. Các interface này cũng có thể có interface con.
4. Interface con của Collection Interface
Như đã đề cập trước đó, Collection interface bao gồm các interface con được triển khai bởi các class trong Java.
Tất cả các hàm của Collection interface cũng có mặt trong các interface con của nó.
List Interface
List interface là một collection có trật tự cho phép ta thêm vào và loại bỏ các phần tử như ở trong mảng.
Set interface
Các Set interface cho phép ta lưu trữ các phần tử trong các set khác nhau, các set này tương tự như các set ở trong toán học. Nó không thể có các phần tử trùng lặp.
Queue Interface
Các Queue interface được sử dụng khi chúng ta muốn để lưu trữ và truy cập tới các phần tử theo cách First In First Out (nhập trước thì xuất trước).
Map Interface trong Java
Iterator Interface trong Java
Trong Java, Iterator interface cung cấp các phương thức được sử dụng để truy cập các phần tử của collection.
Tại sao có tên gọi Collections Framework?
Các collections framework trong Java cung cấp các cấu trúc dữ liệu và thuật toán khác nhau có thể được sử dụng trực tiếp. Điều này có hai ưu điểm chính:
Chúng ta sẽ không phải viết code để thực hiện các cấu trúc dữ liệu và thuật toán theo cách thủ công.
Code của chúng ta sẽ hiệu quả hơn nhiều vì collections framework có tính tối ưu hóa cao.
Nếu ta muốn dữ liệu của mình là duy nhất, thì ta có thể sử dụng Set interface trong collections framework.
Để lưu trữ dữ liệu theo các cặp key/value , chúng ta có thể sử dụng Map interface.
Lớp ArrayList học cung cấp các chức năng khác nhau của các mảng có sự biến thiên về độ dài (mảng có thể thay đổi độ dài).
Ví dụ: Class ArrayList trong Collections
Trước khi kết thúc bài học này, hãy lấy một ví dụ về Class ArrayList trong collections framework.
Lớp ArrayList cho phép chúng ta tạo ra các mảng có thể thay đổi độ dài. Class này triển khai List interface (là interface con của Collection interface).
/** * chúng tôi - Kênh thông tin IT hàng đầu Việt Nam * * @author cafedevn * Contact: cafedevn@gmail.com * Fanpage: https://www.facebook.com/cafedevn * Instagram: https://instagram.com/cafedevn * Twitter: https://twitter.com/CafedeVn * Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/ */ import java.util.ArrayList; class Main { public static void main(String[] args){ animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("ArrayList: " + animals); } }Kết quả:
ArrayList: [Dog, Cat, Horse]Trong các bài sau, chúng ta sẽ tìm hiểu về collections framework (interface và các class của nó) một cách chi tiết và kèm theo đó là các ví dụ.
Tổng Quan Về Mock Trong Unit Test
Unit Test là một công cụ giúp cho chúng ta có thể đảm bảo đoạn code mà chúng ta viết ra đúng chính xác những gì chúng ta muốn. Trong quá trình làm việc với Unit Test, một vấn đề mà chúng ta thường gặp đó là code của chúng ta sẽ gọi tới những phương thức của các class khác, bên ngoài class, phương thức mà chúng ta đang viết. Chúng ta có thể khởi tạo những class bên ngoài đó để gọi phương thức mà chúng ta muốn, nhưng đâu ai biết được là các phương thức của những class bên ngoài đó lại gọi những phương thức của các class bên ngoài nữa và câu hỏi đặt ra là có cần thiết phải quan tâm đến những class bên ngoài đó khi chúng ta đang test phương thức của class này bởi vì những class bên ngoài đó cũng sẽ có Unit Test riêng.
Câu trả lời theo mình là không các bạn? Unit Test là chúng ta test những đoạn code nhỏ, sẽ có Unit Test để đảm bảo logic cho những external dependencies, việc chúng ta chỉ là đảm bảo cho code hiện tại chúng ta đã test mà thôi. Trong trường hợp này, một vấn đề đặt ra là nếu phương thức chúng ta đang gọi tới phương thức của class bên ngoài thì sẽ xử lý như thế nào, làm thế nào để khi code chúng ta gọi đến những phương thức đó, kết quả trả về sẽ giúp chúng ta cover được logic trong Unit Test?
Đầu tiên, mình sẽ tạo mới một Maven project để làm ví dụ:
Với JUnit 5, để chạy được Unit Test với Maven, chúng ta cần khai báo plugin maven-surefire-plugin của Maven với latest version như sau:
Và compile source với target sử dụng Java 8 trở đi:
Bây giờ mình sẽ tạo một ứng dụng nhỏ, cho phép người dùng truyền vào 2 số, chúng ta sẽ tính tổng 2 số đó, từ kết quả này sẽ trả về true nếu kết quả lớn hơn 10, ngược lại sẽ là false. Cụ thể, code sẽ như sau:
Chúng ta có một class để tính tổng 2 số:
Một class chính của ứng dụng trong đó nó có một phương thức để kiểm tra kết quả việc tính tổng và trả về true, false dựa vào kết quả đó:
Kết quả khi chạy như sau:
Mình sẽ tạo class CalculationTest để test cho class Calculation với nội dung như sau:
Unit Test cho class Calculation đơn giản phải không các bạn?
Đến Unit Test cho class Application, phương thức main() là phương thức để chạy ứng dụng nên chúng ta không cần test. Chỉ có phương thức check() chúng ta mới cần test mà thôi.
Bình thường, mình có thể viết Unit Test cho phương thức check() này như sau:
Thế nhưng nếu xem xét kỹ, các bạn sẽ thấy đoạn code sau trong phương thức check() của class Application:
chúng ta đã test trong class CalculationTest ở trên, nên sẽ không cần phải test nữa. Cái chúng ta chỉ cần test trong phương thức check() này chỉ là đoạn code return mà thôi.
Đầu tiên, các bạn cần sử dụng Mockito để tạo ra Mock object cho class Calculation trước:
Sau khi đã có Mock object của class Calculation thì các bạn có thể set mock object này để sử dụng trong class Application như sau:
Bây giờ thì chúng ta sẽ giả lập hành vi của đối tượng Calculation trong class Application bằng cách sử dụng đối tượng Mock của nó.
Giả sử bây giờ, mình muốn khi class Application gọi đến phương thức sum() của 2 số 2 và 12 trong class Calculation, mình sẽ trả về là 14 mà không cần quan tâm đến logic của phương thức sum() thì mình sẽ mock như sau:
Toàn bộ code testCheck() lúc này sẽ như sau:
Kết quả:
thì kết quả sẽ như sau:
Như các bạn thấy, sử dụng Mock trong Unit Test giúp chúng ta có thể quyết định kết quả trả về của những class bên ngoài mà không cần quan tâm đến việc xử lý của chúng. Chỉ cần đảm bảo cho code mà chúng ta đang Unit Test là được rồi phải không các bạn? 🙂
Hướng Dẫn Sử Dụng Nền Tảng Tập Hợp Trong Java (Java Collection Framework)
1- Giới thiệu
Tập hợp chính là một ý tưởng cơ bản của chương trình và của ngôn ngữ lập trình.Một ứng dụng thường xuyên phải làm việc với tập hợp ví dụ như việc lưu trữ thông tin các nhân viên, tập hợp các ảnh ,… Java cũng như các ngôn ngữ khác hỗ trợ mảng (array) như một tập hợp cơ bản nhất, xong việc làm việc với mảng là không thuận tiện trong nhiều trường hợp bởi vì trong thời gian sống của mảng việc tăng thêm phần tử hoặc xóa các phần tử của mảng rất khó khăn và phải trả giá đắt về hiệu năng chương trình nếu cố tình làm điều đó .
Trước hết chúng ta làm một ví dụ với LinkedList, nó là một danh sách mà số phần tử có thể thay đổi, không bị giới hạn như mảng.
package org.o7planning.tutorial.javacollection.helloworld; import java.util.LinkedList; public class HelloLinkedList { public static void main(String[] args) { list.add("F"); list.add("B"); list.add("D"); list.add("E"); list.add("C"); list.addLast("Z"); list.addFirst("A"); list.add(1, "A2"); System.out.println("Original contents of list: " + list); list.remove("F"); list.remove(2); System.out.println("Contents of list after deletion: " + list); list.removeFirst(); list.removeLast(); System.out.println("List after deleting first and last: " + list); Object val = list.get(2); list.set(2, (String) val + " Changed"); System.out.println("List after change: " + list); } }Ví dụ với HashMap. Đây là một đối tượng chứa các cặp khóa và giá trị (Key-Value). Chẳng hạn như một danh bạ điện thoại, trong đó số điện thoại là khóa, còn thông tin chủ thuê bao là giá trị. Các khóa thì không được trùng nhau.
package org.o7planning.tutorial.javacollection.helloworld; import java.util.HashMap; public class HelloHashMap { public static void main(String[] args) { salaryMap.put("E01", 1000f); salaryMap.put("E02", 12000f); salaryMap.put("E03", 12300f); salaryMap.put("E04", 1000f); salaryMap.put("E05", 300.5f); Float salary= salaryMap.get("E01"); System.out.println("Salary of employee E01 = "+ salary); salaryMap.put("E05", 400f); System.out.println("Salary of employee E05 = "+ salaryMap.get("E05")); } } 3.1- Mảng – một kiểu tập hợp cơ bản.
Mảng rất cơ bản và quen thuộc .
lưu trữ các kiểu tham chiếu, các kiểu nguyên thủy
int[] myArray=new int[]{1,4,3};
Object[] myArrayObj =new Object[]{“Object”,new Integer(100)};
Mảng có kích cỡ và số chiều cố định.
Khó khăn cho việc mở rộng mảng
Các phần tử được đặt và tham chiếu một cách liên tiếp nhau trong bộ nhớ.
Khó khăn cho việc xóa một phần tử ra khỏi mảng .
3.2- Xóa phần tử ra khỏi mảngCác phần tử của một mảng được đặt liên tiếp nhau trong bộ nhớ điều đó là khó khăn khi bạn cố tình bỏ đi một phần tử nào đó trong mảng, nó mất tính liên tiếp.Thông thường một kỹ thuật mà thường sử dụng là tạo một mảng mới lưu trữ các đối tượng của mảng ban đầu và bỏ đi các phần tử không cần thiết, nhưng điều này làm giảm hiệu năng của chương trình. Với trường hợp mở rộng mảng cũng với kỹ thuật tương tự là khởi tạo một mảng mới với kích cỡ lớn hơn sau đó thì copy các phần tử mảng cũ sang cho mảng mới.
Rõ ràng mảng không phải là một cách tốt cho nhiều trường hợp của ứng dụng .
3.3- Danh sách có kết nốiDanh sách có kết nối ( Linked List) là một trong các cách quản lý danh sách dữ liệu khắc phục được các nhược điểm của mảng. Tất nhiên để quản lý danh sách trong Java có nhiều cách khác ví dụ ArrayList.
Hãy xem các đặc điểm của LinkedList:
Các phần tử trong danh sách này có thể nằm cách ly nhau (không liên tục) trong bộ nhớ .
Nó thực sự là một liên kết có tính hai chiều giữa các phần tử.
Mỗi phần tử trong danh sách cầm giữ một tham chiếu đến đối phần tử đằng trước nó và tham chiếu đến phần tử ngay sau nó.
LinkedList thực sự là một liên kết 2 chiều.
Phần tử Link là một đối tượng nó chứa dữ liệu bạn cần quản lý (data), và nó có 2 tham chiếu tới phần tử Link phía trước và phần tử Link phía sau nó.
Cũng giống như một nhóm người xếp hàng, mỗi người chỉ cần nhớ người đứng trước họ là ai, và người đứng sau họ là ai.
Xóa một phần tử ra khỏi LinkedList
Xóa một phần tử ra khỏi LinkedList cũng giống bỏ một người ra khỏi hàng đang sắp xếp, hai người đứng gần người này phải cập nhập lại thông tin người đứng trước, đứng sau họ là ai.
Thêm phần tử vào LinkedList (Thêm vào cuối hoặc trèn vào giữa danh sách)
Chú ý: LinkedList là một trong các giải pháp giải quyết hạn chế của mảng, ArrayList cũng là cách quản lý tập hợp dữ liệu, giải quyết được các hạn chế của mảng, nhưng cách thức quản lý dữ liệu của nó khác.
Thấy được các giới hạn của mảng ngay từ phiên bản 1.0 java đã đưa vào class java.util.Vector một class lưu trữ danh sách động của các đối tượng.Và java.util.Hashtable là class lưu trữ các cặp key/value (khóa/giá trị) .Sau đó Java2 platform tiếp tục giới thiệu các cách tiếp cận các tập hợp , được gọi là Collections Framework (Nền tảng các tập hợp) . java.util.Vector, java.util.Hashtable vẫn tồn tại và bây giờ là một phần trong nền tảng lớn đó. Các kiểu tập hợp này được xây dựng trên cơ sở một số interface trong bójava.util. Và được phân chia ra làm 2 hệ thống phân cấp dẫn đầu bởi 2 interfacejava.util.Collection chứa danh sách các đối tượng và chúng tôi chứa các cặp key/value.
4.1- Các interface trong nền tảng tập hợp Java (Java Collections Framework)Hình trên là các interface quan trọng của Java Collections Framework.Chúng ta sẽ nói về mục đích sử dụng của các interface đó và phân chia chúng theo mục đích và cách sử dụng.Trong bójava.util các class thi hành một hoặc nhiều interface này. Chính vì vậy một class nào đó trongjava.util có thể có nhiều tính năng khác nhau .Ví dụ java.util.HashMap:
4.2- Hai hệ thống phân cấp dẫn đầu bởi 2 interface Collection và Map – Cách thức chứa dữ liệu
Nhóm Collection lưu trữ các đối tượng.
Có 3 nhánh con trong nhóm Collection: Queue, List, Set .
Các phần tử có thể giống nhau hoặc không phụ thuộc vào thuộc nhánh nào trong 3 nhánh kể trên. (Sẽ được nói đến sau) .
Nhóm Map lưu trữ các cặp key/value
Các cặp key/value chứa trong Map (bản đồ) là luôn có key khác nhau giữa các cặp
Nếu biết key có thể lấy ra giá trị value trong Map ứng với key này .
Nhóm Collection lưu trữ các dữ liệu là các kiểu tham chiếu, nhómMap lưu trữ các cặp key/value.
c.add("One"); Integer key=new Integer(123); String value="One two three"; m.put(key,value); System.out.println(m.get(new Integer(123)); 4.3- Interface Iterator và interface RandomAccess – Cách thức lấy dữ liệu
java.util.Iterator
Giống như một máy lặp để lấy dữ liệu,cách truy cập lần lượt từ phần tử này đến phần tử khác.
java.util.RandomAccess
Cách truy cập ngẫu nhiên, ví dụ cho vị trí phần tử và lấy ra phần tử đó trong tập hợp
Ví dụ lớp java.util.Vector thực hiện interface này có thể lấy phần tử ngẫu nhiên vector.get(int index).
Theo trên Vector thuộc nhómCollection, bạn có thể truy cập các phần tử của nó thông quaIterator và cũng có thể truy cập ngẫu nhiên thông qua phương thứcget(index).
Chú ý: Đối với các đối tượng trong nhóm List bạn cũng có thể lấy ra đối tượngListIterator, bộ lặp này cho phép bạn lùi và tiến vị trí con trỏ trên tập hợp thay vì chỉ có thể tiến như củaIterator.
5.1- Các interface trong nhóm Collection3 interface con trực tiếp của Collection làQueue,List,Set trong đóQueue được đưa vào từ phiên bản 1.5 nó có ý nghĩa như một hàng đợi.Queue cũng có interface con làBlockingQueue xong interface này nằm trong bójava.util.concurrent, trong bài này chúng ta không đề cập đến.Queue là một interface có nhiều khái niệm và cách thức tổ chức các phần tử đáng phải quan tâm nhiều nhất. Ba interfaceQueue ,List ,Set có thể coi là 3 nhánh trong nhómCollection , trước khi đi vào chi tiết từng nhóm bạn hãy xem tổng quan về interfaceCollection.
5.2- java.util.Collection Interface 5.3- Duyệt các phần tử của tập hợpIterator là cách để bạn duyệt trên các phần tử của tập hợp
Ví dụ sử dụng Iterator để truy cập các phẩn tử củaCollection.
5.4- Các nhánh con của CollectionNhư trên đã đề cập Collection có 3 interface con làQueue ,List vàSet. Và điểm khác nhau giữa chúng là cách thức lưu trữ dữ liệu
java.util.Queuejava.util.List chúng tôiCho phép chứa các phần tử trùng lặp
Cho phép chứa các phần tử trùng lặp
Không cho phép chứa các phần tử trùng lặp
Không cho phép chứa các phần tử null
Cho phép chứa nhiều phần tử null
Tùy theo class thi hành Set hỗ trợ chứa phần tử null hay không .Nếu có hỗ trợ thì chỉ chứa nhiều nhất 1 phần tử null nếu có.
List
Queue
Set
Set là một tập hợp không tuần tự, và nó không cho phép trùng lặp. Bạn không thể nói về phần tử thứ N thậm chí là phần tử đầu tiên, vì nó không có sự tuần tự. Bạn có thể thêm hoặc xóa các phần tử, và có thể tìm ra nếu thực sự nó tồn tại (Ví dụ “7 có nằm trong tập hợp này không?”).
Chú ý:SortedSet là một interface con củaSet nó có thể chứa các phần tử có thứ tự.
5.5- chúng tôi InterfaceList là một interface con củaCollection nó có đầy đủ các tính năng củaCollection đồng thời có thêm một số tính chất đặc biệt:
Cho phép phần tử trùng lặp
Cho phép 0 hoặc nhiều phần tử null.
Là một tập hợp có tuần tự.
Đồng thời ngoài cách truy cập bằng Iterator có thể truy cập bằng cách sử dụngListIterator.ListIterator cho phép tiến hoặc lùi vị trí con trỏ. 5.6- chúng tôi Interface
Set là một Interface con củaCollection, nó có đầy đủ các tính năng củaCollection, và có thêm một số tính năng:
Mô tả một tập hợp không cho phép chứa các phần tử trùng lặp
Có cho phép phần tử null, nếu có phần tử null thì chỉ có 1.
5.7- java.util.Queue InterfaceQueue (hàng đợi) là một Interface con củaCollection, nó có đầy đủ các tính năng củaCollection, nó khá giống vớiList, tuy nhiên mục đích sử dụng hơi khác nhau.Queue được thiết kế để bạn chỉ có thể truy cập phần tử ở đầu hàng đợi, và khi loại bỏ phần tử nó loại phần tử đứng đầu hàng đợi. Nó giống như hàng người xếp hàng ở siêu thị, chỉ người đứng đầu hàng đợi mới được phục vụ, người mới đến sẽ được trèn vào hàng đợi, vị trí được trèn vào có thể không phải là cuối hàng. Vị trí phần từ được trèn vào phụ thuộc vào loại hàng đợi và độ ưu tiên của phần tử.
Là tập hợp cho phép các phần tử trùng lặp.
Không cho phép phần tử null.
java.util.LinkedList
java.util.PriorityQueue
LinkedList là một hàng đợi khá chuẩn. Nhưng nhớ rằng LinkedList thi hành cả 2 interfaceList vàQueue.
PriorityQueue lưu trữ các phần tử trong nội bộ theo trật tự tự nhiên của các phần tử (nếu các phần tử này là kiểuComparable), hoặc theo mộtComparator (bộ so sánh) được sét đặt cho PriorityQueue.
Chú ý rằng, một class có thể thi hành cả 2 interface List vàQueue, chính vì vậy bạn không cần quan tâm tới các phần tử sắp xếp thế nào trong nội bộ của đối tượng class trên, nếu bạn coi nó như một hàng đợi, hãy xem cách thức truy cập vào phần tử của hàng đợi. Hãy xem các phương thức đặc trưng củaQueue, nó mô phỏng hàng đợi giống hàng người xếp hàng ở siêu thị.
Ném ra ngoại lệTrả về giá trị cụ thể Trènadd(e)offer(e) Loại bỏremove()poll() Xem xételement()peek()boolean add(E)
Trèn một phần tử vào hàng đợi nếu có thể làm điều này ngay lập tức mà không bị giới hạn bởi kích thước hàng đợi, trả về true nếu thành công, ngược lại nó sẽ ném ra ngoại lệ IllegalStateException khi hàng đợi không còn chỗ.
boolean offer(E)
Trèn phần tử vào hàng đợi nếu có thể làm điều đó ngay lập tức nếu không bị giới hạn bởi kích thước hàng đợi. Khi sử dụng hàng đợi có kích thước giới hạn, phương thức này khá giống với add(E), tuy nhiên phương thức này không ném ra ngoại lệ khi không trèn được phần tử vào hàng đợi, mà nó trả vềfalse trong tình huống đó.
E remove()
Lấy ra và loại bỏ luôn phần tử đầu tiên của hàng đợi. Phương thức này chỉ khác với poll() ở chỗ nếu hàng đợi không có phần tử ngoại lệ sẽ bị ném ra.
E poll()
Lấy ra và loại bỏ phần tử đầu tiên trong hàng đợi, hoặc trả về null nếu hàng đợi không có phần tử nào.
E element()
E peek()
Lấy ra, nhưng không loại bỏ phần tử đầu tiên trong hàng đợi, hoặc trả về null nếu hàng đợi không có phần tử nào.
Nhận xét:
Các phương thức hàng đợi ở trên không có phương thức nào cho phép bạn truy cập các phần tử khác trong hàng đợi ngoài phần tử đầu tiên, bạn cũng không thể chỉ định vị trí phần tử sẽ được trèn vào.
Ví dụ với một hàng đợi có ưu tiên PriorityQueue. Hàng đợi này lưu trữ các phần tử trong nội bộ theo trật tự tự nhiên của phần tử (nếu các phần tử đó so sánh được với nhau – thi hànhComparable) hoặc một bộ so sánhComparator được sét đặt cho PriorityQueue.
String là một class thi hành interfaceComparable, chúng có thể so sánh được với nhau, và sắp xếp theo thứ tự alphabet.
5.8- Quan hệ thừa kế các lớp trong nhóm CollectionHash Table
Resizable Array
Balanced Tree
Linked List
Hash Table + Linked List
InterfacesSetHashSet
TreeSet
LinkedHashSet
ListArrayList
5.9- java.util.ArrayListArrayList có đầy đủ tính năng của interfaceList. Đồng thời nó có khả năng truy cập phần tử ngẫu nhiên (Do thừa kế từ interfaceRandomAccess)
Về cơ bản nó giống với class Vector, khác biệt là các method của Vector được đồng bộ, còn ArrayList thì không. ArrayList phù hợp cho các ứng dụng 1 luồng (1 Thread).
5.10- java.util.VectorLà một class có tính năng tương tự ArrayList. Khác biệt là các method của Vector được đồng bộ hóa, còn ArrayList thì không.
Các method của Vector được đồng bộ hóa, vì vậy sử dụng tốt trong các ứng dụng đa luồng (Multiple Thread)
Vector có thêm một số method các method này vốn là di sản từ phiên bản 1.0. Trước khi có khái niệm về nền tảng tập hợp trong Java.
public E elementAt(int index) public E get(int index) public void setElementAt(int index, E element); public E set(int index, E element) 5.11- java.util.SortedSetSortedSet là interface con của interfaceSet, nó có đầy đủ tính năng củaSet.SortedSet là một tập hợp có sắp xếp, các phần tử được thêm mới vào tập hợp tự động được đứng tại một vị trí phù hợp để đảm bảo tập hợp vẫn được sắp xếp (tăng dần hoặc giảm dần).
Chính vì vậy các phần tử của tập hợp phải so sánh được với nhau, chúng phải là đối tượng của java.lang.Comparable (Có thể so sánh được), Nếu bạn thêm vào tập hợp một phần tử không phải đối tượng củaComparable, bạn sẽ nhận một ngoại lệ.
Một trong các class thi hành Interface SortedSet là TreeSet.
Hãy xem class Player (Người chơi), bao gồm các thông tin: họ tên, số huy chương vàng, số huy chương bạc, số huy chương đồng.
Các Player có thể so sánh với nhau theo nguyên tắc:
Ai nhiều huy chương vàng hơn thứ hạng cao hơn.
Nếu hai người cùng số huy chương vàng, thì ai nhiều huy chương bạc hơn sẽ xếp thứ hạng cao hơn.
Nếu hai người cùng số huy chương vàng, bạc, thì ai nhiều huy chương đồng hơn sẽ xếp thứ hạng cao hơn.
Còn lại coi là cùng thứ hạng.
Class Player sẽ thi hành interfacejava.lang.Comparable.
Kết quả chạy class SortedSetDemo:
6.1- Các Interface trong nhóm MapNhóm Map dẫn đầu bởi interface java.util.Map. Interface này có 2 interface con làjava.util.SortedMap và java.util.concurrent.ConcurrentMap .ConcurrentMap không thuộc bójava.util nó được đưa vào từ phiên bản java1.5, chúng ta không đề cập tới nó trong tài liệu này. NhómMap đặc trưng bởi việc lưu trữ dữ liệu qua các cặp key/value.
6.2- Các class trong nhóm Map 6.3- chúng tôi Interface TT Phương thức và mô tả1
void clear( )
Loại bỏ tất cả các cặp key/value ra khỏi map.(optional operation).
4
5
11
Các phương thức tùy chọn (Optional operation) có thể được hỗ trợ trên class thi hành nó hoặc không, trong trường hợp không hỗ trợ nó có thể ném ra ngoại lệ UnsupportedOperationException:
import java.util.Collection; import java.util.Map; import java.util.Set; ..... @Override public void clear() { throw new java.lang.UnsupportedOperationException(); } }Như vậy là class MyMap không hỗ trợ ý nghĩa thực tế của methodclear(). Người dùng cố tình sử dụng method này của MyMap sẽ nhận một ngoại lệ .
6.4- java.util.SortedMap InterfaceInterface SortedMap là interface con củaMap. Nó đảm bảo rằng các cặpkey/value được sắp xếp theo thứ tự tăng dần theo key.
Chỉ có một class trong bó java.util thi hành interfaceSortedMap, đó là TreeMap.
TT Phương thức và mô tả1
Comparator comparator( )
Trả về bộ so sánh (Comparator) sử dụng để sắp xếp. Nếu thứ tự tự nhiên được sử dụng cho map (key implements Comparable), null sẽ được trả về.
3
SortedMap headMap(Object end)
Trả về một SortedMap con, với các cặp key/value mà key được đánh giá nhỏ hơn hoặc bằng end.
5
SortedMap subMap(Object start, Object end)
Trả về một SortedMap con, chứa các cặp key/value mà key được đánh giá lớn hơn hoặc bằng start và nhỏ hơn hoặc bằng end.
6
SortedMap tailMap(Object start)
Trả về một SortedMap con, chứa các cặp key/value mà key của nó được đánh giá lớn hơn hoặc bằng start.
Bạn đang đọc nội dung bài viết Tổng Quan Về Collections Trong Java trên website Honggaitour.com. Hy vọng một phần nào đó những thông tin mà chúng tôi đã cung cấp là rất hữu ích với bạn. Nếu nội dung bài viết hay, ý nghĩa bạn hãy chia sẻ với bạn bè của mình và luôn theo dõi, ủng hộ chúng tôi để cập nhật những thông tin mới nhất. Chúc bạn một ngày tốt lành!