IS216 - LẬP TRÌNH JAVA Chương 3 (tt) GENERICS & COLLECTIONS Nội dung 1. Collections 2 GENERICS Generics ● Xét phương thức cộng hai số nguyên kiểu int public static int Cong(int a, int b) { return a + b; } ● Nhận xét: ● Không thể dùng phương thức Cong trên để thực hiện cộng hai số kiểu long, float hoặc double. ● Để cộng được các số kiểu long, float hoặc double cần viết code riêng cho từng kiểu dữ liệu. ● Để sử dụng chung code cho nhiều kiểu dữ liệu, khi khai báo phương thức hoặc class có thể khai báo một kiểu dữ liệu chung, được gọi là kiểu Generic.
4 Generics ● Generics trong Java (Java Generics): là dạng tham số hóa kiểu dữ liệu. Là tham số kiểu hoặc tham số biến hoặc kiểu dữ liệu tổng quát. ● Cho phép tạo và sử dụng lớp, interface hoặc phương thức với nhiều kiểu dữ liệu khác nhau theo từng ngữ cảnh khác nhau. ● Xuất hiện từ Java 5.
● Tham số biến có thể là các kiểu dữ liệu (trừ các kiểu dữ liệu cơ sở Primary type: int, float, char…) ● Khi sử dụng, thay thế tham số biến bằng các kiểu dữ liệu cụ thể. ● Có 2 loại generic: lớp Generic và phương thức Generic. 5 Generics ● Có thể sử dụng bất kỳ kí tự, viết hoa hoặc thường cho các tham số generic. Tuy nhiên, có một số quy ước đặt tên : ● E – Element (phần tử, sử dụng trong Collection Framework) ● K – Key (khóa) ● V – Value (giá trị) ● N – Number (kiểu số: Interger, Long, Float, Double…) ● T – Type (Kiểu dữ liệu bất kỳ, thuộc kiểu lớp bao: String, Interger, Long, Float…) ● S, U, V… được sử dụng cho các kiểu loại T thứ 2, 3, 4.
6 Generics ● Ký tự Diamond <>: từ Java 7, có thể thay thế các đối số kiểu dữ liệu để gọi hàm khởi tạo của một lớp Generic bằng cặp dấu <>. // Trước Java 7 List<Integer> listInt = new ArrayList<Integer>(); // Sử dụng cặp dấu <> từ phiên bản Java 7 List<Integer> listInt = new ArrayList<>(); 7 Generics 8 Generics ● Ưu điểm của Generics: ● Kiểm tra kiểu dữ liệu trong thời điểm biên dịch để đảm bảo tính chặt chẽ của kiểu dữ liệu. 9 Generics 10 Generics ● Loại bỏ việc ép kiểu dữ liệu. 11 Generics ● Cho phép thực hiện các xử lý tổng quát: thực hiện các thuật toán tổng quát với các kiểu dữ liệu tùy chọn khác nhau.
12 Generic Class ● Generic Class là dạng class có một hoặc nhiều tham số biến sử dụng trong class. ● Một class có thể tham chiếu bất kỳ kiểu đối tượng nào. ● Cú pháp Generic class: class Tên_Class<T1,T2,…,Tn> {} ● Khi sử dụng, khai báo <T> với kiểu dữ liệu cụ thể nào thì trong generic class sẽ chỉ xử lý kiểu dữ liệu đó. 13 Generic Class ● Phạm vi và ý nghĩa của kiểu T sẽ là trong toàn class ● Sử dụng generic class khi: ● Khi xây dựng class, chưa xác định được kiểu dữ liệu của biến thành viên, thuộc tính hoặc biến cục bộ của phương thức.
● Khi nhiều class có cùng chung về mặt logic (các biến, các phương thức) chỉ khác biệt về kiểu dữ liệu. 14 Generics class 15 Generics class 16 Generic Method ● Generic method (generic phương thức) là dạng phương thức có một hoặc nhiều tham số biến. ● Phương thức có thể được gọi với nhiều kiểu dữ liệu khác nhau. ● Cú pháp generic phương thức: Tiền tố <T1,T2,…,Tn> Kiểu trả về Tên_Method([tham số]){} ● Khi sử dụng, khai báo <T> với kiểu dữ liệu cụ thể nào thì trong generic method sẽ chỉ xử lý kiểu dữ liệu đó.
● Phạm vi và ý nghĩa của kiểu T sẽ là toàn bộ trong method. Hai tham biến cùng kiểu dữ liệu chỉ cần khai báo một kiểu dữ liệu giả T. ● Thao tác trên kiểu dữ liệu <T> giống như là một kiểu dữ liệu bình thường. 17 Generic Method ● Kiểu <T> có thể được sử dụng làm kiểu trả về của phương thức.
● Sử dụng generic method khi logic của phương thức giống nhau và chỉ khác biệt nhau về kiểu dữ liệu thì có thể cài đặt phương thức theo generic. ● VD1: 18 Generic Method 19 Ký tự đại diện Generic ● Ký tự đại diện <?> (wildcard): đại diện cho một kiểu không xác định. ● Có thể được sử dụng trong nhiều tình huống: tham số, biến cục bộ, thuộc tính hoặc có thể là một kiểu trả về. ● Không sử dụng như là một đối số cho lời gọi một phương thức generic, khởi tạo đối tượng class generic, hoặc kiểu cha.
● VD: Collection<?> coll = new ArrayList<String>(); Pair<String,?> pair = new Pair<String,Integer>(); ● Tham số ký tự đại diện không thể tham gia trong toán tử new List<? extends Object> list= new ArrayList <? extends Object>(); //Lỗi 20 Ký tự đại diện Generic Ký tự đại diện Generic ● Có thể dùng để hạn chế kiểu dữ liệu của các tham số: <? extends type>: kiểu dữ liệu kế thừa từ type hoặc đối tượng của type. <? super type>: kiểu dữ liệu là kiểu cha type hoặc đối tượng của type 22 Hạn chế của Generic ● Không thể khởi tạo generic với kiểu dữ liệu cơ sở ● Không tạo được đối tượng của kiểu T ● Không là kiểu static trong class 23 Hạn chế của Generic ● Có thể khai báo một mảng generic nhưng không thể khởi tạo mảng Generic 24 Hạn chế của Generic ● Không thể tạo class ngoại lệ là generic 25 Ví dụ mảng Generic 26 COLLECTIONS Collections ● Collections là đối tượng có khả năng chứa các đối tượng khác. Là tập hợp các đối tượng riêng lẻ được biểu diễn như một đơn vị duy nhất. ● Các thao tác thông thường trên collections ○ Thêm/Xoá đối tượng vào/khỏi collections ○ Kiểm tra một đối tượng có ở trong collections không ○ Lấy một đối tượng từ collections ○ Duyệt các đối tượng trong collections ○ Xoá toàn bộ collections 28 Collections Framework ● Là tập hợp các interface và các lớp hỗ trợ thao tác trên tập hợp các đối tượng (các collection).
● Hỗ trợ thực hiện các thao tác trên dữ liệu: tìm kiếm, sắp xếp, phân loại, thêm, sửa, xóa… ● Cung cấp các thành phần sau: ● Interface: là kiểu dữ liệu abstract biểu diễn collection; cho phép các collection thao tác độc lập. ● Implementations (triển khai): là việc triển khai cụ thể của collection interface. ● Algorithms (thuật toán): là các phương thức để thực thi các phép toán (tìm kiếm, sắp xếp…) trên các đối tượng đã triển khai các interface collection. 29 Collections Framework ● Các collection đầu tiên của Java: ○ Mảng ○ Vector: Mảng động ○ Hastable: Bảng băm ● Collections Framework (từ Java 1.2) ○ Là một kiến trúc hợp nhất để biểu diễn và thao tác trên các collection.
○ Giúp cho việc xử lý các collection độc lập với biểu diễn chi tiết bên trong của chúng. 30 Collections Framework ● Một số lợi ích của Collections Framework ○ Giảm thời gian lập trình ○ Tăng cường hiệu năng chương trình ○ Dễ mở rộng các collection mới ○ Khuyến khích việc sử dụng lại mã chương trình 31 Collection Framework ● Thuộc package java. ● Gồm 2 loại chính: Interface Collections, Class Collections. ● Ngoài ra, còn có Map Interface và các class của Map lưu trữ theo cặp key/value 32 Collection Framework 33 34 35 Collection Framework ● Interface Collections: ○ Là tập hợp đại diện cho nhóm các đối tượng.
Trong collection interface có các interface chính như: List interface, Set, SortedSet, Map và SortedMap ○ Một số interface cho phép lưu trữ các phần tử giống nhau hoặc không giống nhau. ○ Tùy từng loại collection, các phần tử có thể có thứ tự hoặc không. ○ Bao gồm các phương thức: thêm (add), xóa (clear), so sánh (compare), duy trì (retaining) đối tượng. ○ Kế thừa lớp Iterable interface, có thể sử dụng Iterator để duyệt từng phần tử.
36 Collection Framework ● Class Collections: là các lớp tiêu chuẩn dùng để thực thi các Interface Collections. ○ Trước JDK 1.5 là dạng non-generic; về sau là dạng generic. ○ Non-generic: ArrayList arr = new ArrayList(); ○ Generic: ArrayList<String> arr = new ArrayList<String>(); 37 Collection Framework ● Iterable interface: chứa phương thức tạo ra một Iterator. ● Iterator interface: ○ Là đối tượng có trạng thái lặp.
○ Truy xuất các phần tử từ đầu đến cuối của một collection. ○ Xóa phần tử khi lặp một collection. ○ Có 3 phương thức trong Iterator: Phương thức Mô tả public boolean hasNext() True nếu iterator còn phần tử kế tiếp phần tử đang duyệt. public object next() Trả về phần tử hiện tại và di chuyển con trỏ trỏ tới phần tử tiếp theo.
public void remove() Loại bỏ phần tử cuối được trả về bởi Iterator. 38 Interface Collections ● Các Interface và Class Collections: ○ List: cấu trúc dữ liệu tuyến tính, các phần tử được sắp xếp theo thứ tự xác định và giá trị có thể trùng nhau. Gồm các class: ■ ArrayList: kiểu danh sách sử dụng cấu trúc mảng (có kích thước thay đổi được) để lưu trữ phần tử; thứ tự các phần tử dựa theo thứ tự lúc thêm vào, giá trị có thể trùng nhau và không phân biệt kiểu dữ liệu của từng phần tử. ■ LinkedList: danh sách liên kết đôi (double-linked list), duy trì thứ tự các phần tử được thêm vào và giá trị có thể giống nhau.
■ Vector: tương tự ArrayList; kích thước có thể thay đổi được; là dạng synchronized (đồng bộ). ■ Stack: lưu trữ trên cơ sở cấu trúc dữ liệu ngăn xếp (stack) LIFO. 39 Interface Collections ○ Set: mỗi phần tử chỉ xuất hiện một lần (giá trị các phần tử không được giống nhau). Gồm các class: ■ HashSet: các phần tử được lưu trữ dưới dạng mảng băm (hash table); thứ tự các phần tử không dựa theo lúc thêm vào mà được sắp xếp ngẫu nhiên và giá trị các phần tử không trùng nhau.
■ LinkedHashSet: kế thừa lớp HashSet và implement interface Set; chứa các phần tử duy nhất, đảm bảo thứ tự phần tử được thêm vào, cho phép chứa phần tử Null. ○ SortedSet: dạng riêng của Set Interface; giá trị các phần tử mặc định được sắp xếp tăng dần. ■ TreeSet: các phần tử mặc định sắp xếp tăng dần và giá trị của các phần tử là duy nhất. 40 Interface Collections ○ Queue: được thực thi theo kiểu FIFO; có các loại queue: priority queue (queue có ưu tiên), interface deque (queue 2 chiều)… ■ LinkedList: là LinkedList trong interface List.
■ PriorityQueue: các phần tử được sắp xếp theo trật tự tự nhiên (các phần tử so sánh được với nhau – thi hành Comparable) hoặc theo một bộ so sánh Comparator được cung cấp cho PriorityQueue. ■ ArrayDeque: là dạng queue 2 chiều; thực thi dựa trên mảng. 41 Interface Collections ○ Map (đồ thị/ánh xạ): dữ liệu của phần tử được quản lý theo dạng cặp key/value; key là duy nhất và ứng với mỗi key là một value. Không kế thừa từ Collection Interface.