int lastIndexOf(Object o)
3.9.2.2. Map (ánh xạ)
Map định nghĩa các ánh xạ các từ khóa (keys) vào các giá trị.
Lưu ý : Các khóa phải là duy nhất không cho phép lặp. Mỗi khóa được ánh xạ sang nhiều nhất 1 giá trị, được gọi là ánh xạ đơn
Giao diện Map khai báo những hàm sau:
- Object put (Object key,Object value): Chèn vào một cặp <key,value>
- Object get(Object key): Đọc giá trị được xác định bới key nếu có ánh xạ,ngược lại trả về null nếu không có ánh xạ tương ứng với key
- Object remove(Object key): Loại bỏ ánh xạ xác định bởi key
- boolean containsKey(Object key): Cho giá trị true nếu key được ánh xạ sang một giá trị nào đó, ngược lại là false.
Lớp HashMap và HashTable
Lớp này đặt giao diện Map và xây dựng trong java.lang. Chúng cho phép tạo ra các ánh xạ mới có thể rỗng hoặc có những kích thước tùy ý.
Ví dụ 3.31:
import java.util.*;
public class CollectionsDemo {
public static void main(String[] args) { Map m1 = new HashMap();
m1.put("Zara", "8");
m1.put("Mahnaz", "31");
m1.put("Ayan", "12");
m1.put("Daisy", "14"); System.out.println();
System.out.println(" Cac phan tu cua Map"); System.out.print("t" + m1);
}
}
Cho kết quả sau:
Các phần tử của Map
Ví dụ 3.32: Chương trình sau minh họa các phương thức được hỗ trợ bởi lớp HashMap trong Java:
import java.util.*; public class HashMapDemo {
public static void main(String args[]) {
// Tao mot hash map HashMap hm = new HashMap();
// Dat cac phan tu vao map hm.put("Zara", new Double(3434.34)); hm.put("Mahnaz", new Double(123.22)); hm.put("Ayan", new Double(1378.00)); hm.put("Daisy", new Double(99.22));
hm.put("Qadir", new Double(-19.08));
// Lay mot tap hop cac entry Set set = hm.entrySet();
// Lay mot iterator
Iterator i = set.iterator();
// Hien thi cac phan tu while(i.hasNext()) {
Map.Entry me = (Map.Entry)i.next(); System.out.print(me.getKey() + ": "); System.out.println(me.getValue());
}
System.out.println();
// Gui 1000 vao trong tai khoan cua Zara
double balance = ((Double)hm.get("Zara")).doubleValue(); hm.put("Zara", new Double(balance + 1000)); System.out.println("Balance hien tai cua Zara la: " + hm.get("Zara"));
}
}
Kết quả chạy chương trình:
3.9.3. Collection frame work
Collection Framework trong Java là một cấu trúc thống nhất để biểu diễn và thao tác với các tập hợp, cung cấp cho lập trình viên truy cập tới các cấu trúc dữ liệu đã đóng gói trước (Prepackage) cũng như các thuật toán để thao tác trên các cấu trúc dữ liệu này.
Các Class và Interface của Collection Framework nằm trong gói java.util.
Collection framework được thiết kế với mục đích như sau:
Framework 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 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ự nhau với độ phân hóa cao.
Kế thừa các tập hợp dễ dàng. Tất cả collections framework đều chứa:
Giao diện lõi (Core interface) cho phép các tập hợp được xử lý độc lập với cài đặt.
Tập các cài đặt của các giao diện: cung cấp cấu trúc dữ liệu cho các chương trình có thể sử dụng.
Tập các thuật toán được sử dụng để thực hiện các phép toán trên các tuyển tập.
3.9.3.1. Phần giao diện lõi
Một Collection framework định nghĩa trước vài loại interface. Các interface lõi là cơ sở phát triển, mở rộng thành các giao diện khác
Hình 3.1. Cấu trúc phân cấp theo quan hệ kế thừa của các giao diện lõi
Các giao diện lõi của cấu trúc Collection được mô tả trong các bảng sau:
Mô tả | |
Collection | Interface cơ sở định nghĩa tất cả các phép toán cơ bản cho các lớp cần duy trì thực hiện và cài đặt chúng. |
Set | Kế thừa từ Collection để cài đặt cấu trúc tập hợp, trong đó không có phần tử được lặp lại và không được săp xếp. |
SortedSet | Kế thừa từ Set để cài đặt cấu trúc tập hợp được sắp, trong đó không có phần tử được lặp và chúng không được săp xếp theo thứ tự. |
List | Kế thừa từ Collection để cài đặt cấu trúc danh sách, trong đó các phần tử được sắp xếp theo thứ tự và có lặp. |
Map | Interface cơ sở định nghĩa các phép toán để các lớp sử dụng và cài đặt các ánh xạ từ khóa sang các giá trị. |
SortedMap | Kế thừa từ Map để cài đặt các ánh xạ khóa theo thứ tự. |
Có thể bạn quan tâm!
- Công nghệ Java - 9
- So Sánh Giao Diện Và Lớp Trừu Tượng
- Các Ngoại Lệ Được Định Nghĩa Với Lệnh ‘Throw’ Và ‘Throws’
- Sử Dụng Phương Thức Isalive() Và Join()
- Xây Dựng Lớp Quanlysach Cài Đặt Các Phương Thức Thực Hiện Các Công Việc Sau:
- Công nghệ Java - 15
Xem toàn bộ 232 trang tài liệu này.
Trên cùng của cấu trúc phân cấp là Collection interface. Interface này chứa các phương thức size, isEmpty: cho biết thông tin về số phần tử tồn tại trong collection.
- contains: Dùng để kiểm tra một đối tượng nếu nó trong collection.
- add, remove: Thêm và loại bỏ phần tử khỏi collection.
- iterator: Duyệt các phần tử trong tập hợp.
Ví dụ 3.33:
public interface Iterator<E> {
boolean hasNext(); E next();
void remove(); //optional
}
Ngoài ra để duyệt các phần tử còn sử dụng for-each
Ví dụ 3.34:
for (Object obj : collection) System.out.println(obj);
3.9.3.2. Phần cài đặt
Gói java.util cung cấp tập các lớp collection tiêu chuẩn có thể triển khai các collection interface lõi, để tạo ra những cấu trúc dữ liệu thường sử dụng như: Vector, ArrayList, HashSet, LinkedList, TreeSet, vvv…Những lớp này và giao diện lõi được xây dựng theo cấu trúc phân cấp như trong hình 3.9.3.2
Hình 3.2. Các giao diện lõi và các lớp cài đặt chúng
3.9.3.3. Phần thuật toán
Lớp Java.util.Collection (khác với giao diện Collection) cung cấp một số hàm thực hiện những thuật toán cho những phép toán khác nhau trên tập hợp, kể cả sắp xếp, tìm kiếm và dịch chuyển các phần tử.
3.10. Thread
3.10.1.Thread là gì, Tạo Thread
Thread là một dòng các điều khiển trong một tiến trình hay một ứng dụng. Với Java có thể xây dựng các chương trình đa luồng. Mỗi luồng được gán một công việc cụ thể, chúng được thực thi đồng thời với các luồng khác.
Có hai cách tạo luồng
Cách 1: Tạo ra một lớp kế thừa từ lớp Thread và ghi đè phương thức run của lớp Thread như sau:
class MyThread extends Thread{ public void run(){
//Mã lệnh của luồng
}
}
Cách 2: Tạo ra một lớp triển khai từ giao diện Runnable, ghi đè phương thức Run:
class MyThread implements Runnable{ public void run(){
//Mã lệnh của luồng
}
}
3.10.2.Các trạng thái của Thread
Một thread đi qua các giai đoạn (trạng thái) khác nhau. Ví dụ, một thread được sinh ra, bắt đầu, chạy và sau đó hủy. Hình sau biểu diễn một vòng đời đầy đủ của một thread.
Hình 3.3. Các trạng thái của Thread
Giải thích:
New: Một thread mới bắt đầu vòng đời trong trạng thái new. Nó tồn tại trong trạng thái này tới khi chương trình bắt đầu thread.
Runnable: Sau khi một thread mới sinh ra được bắt đầu, thread trở thành runnable. Một thread trong trạng thái runable được xem như đang thực hiện tác vụ của nó.
Waiting: Thread rơi vào thái waiting (đợi) thread khác thực hiện một tác vụ nào đó. Một thread chuyển về trạng thái runnable chỉ khi thread khác ra hiệu cho thread đang đợi tiếp tục thực thi.
Timed waiting: Một thread trong trạng thái runnable có thể đi vào trạng thái timed waiting trong một khoảng thời gian nào đó. Một thread trong trạng thái này chuyển về trạng thái runnable khi khoảng thời gian chờ kết thúc hoặc khi sự kiện nó đang đợi xuất hiện.
Terminated: Một thread trong trạng thái runnable có thể đi vào trạng thái terminated khi hoàn thành tác vụ hoặc chấm dứt.
3.10.3.Các phương thức của lớp Thread
public static Thread currentThread()
- Đây là phương thức tĩnh, trả về một đối tượng của lớp Thread,có thể gọi ở bất kỳ đâu mà không cần tạo đối tượng của lớp Thread.
- Cú pháp : Thread.currentThread()
public long getId()
- Phương thức này trả về một số nguyên là định danh của thread. Con số này do máy ảo Java (JVM) tạo ra.
public final String getName()
- Phương thức này trả về tên của thread.
public final void setName(String name)
- Thay đổi tên của thread.
public Thread.State getState()
- Trả về trạng thái hiện tại của thread, là một hằng của lớp Thread.
- Các giá trị có thể là :
+NEW : thread chưa được khởi hoạt.
+RUNNABLE : thread đang hoạt động trong JVM.
+BLOCKED : thread chờ một monitor để unlock một đối tượng mà nó cần.
+WAITING : thread chờ không giới hạn cho đến khi một thread khác đánh thức
+ERMINATED : thread đã kết thúc công việc của nó.
public static void yield()
- Đây là phương thức tĩnh, tạm ngưng hoạt động thread hiện thời để nhường cho một thread khác.
public void start()
- Phương thức này chính thức tạo ra một đối tượng thread. Và JVM sẽ tự động gọi phương thức run của đối tượng
- Luồng được bắt đầu hoạt động sau khi phương thức này được gọi thành công.
public String toString()
- Trả về thể hiện dạng String của thread này: bao gồm tên, độ ưu tiên và nhóm.
public void run() Java gọi phương thức run ( ) để thực thi luồng thi hành.
public void interrupt() Gián đoạn luồng thi hành
public static boolean isInterrupt() Kiểm tra luồng có bị ngắt không
isDaemon() Kiểm tra một luồng là chạy ngầm hay không.
setDeamon(boolean on) Đánh dấu luồng là luồng chạy ngầm
3.10.4.Quản lý Thread
Java cung cấp các lớp điều khiển quản lý các chương trình đa luồng. Người dùng có thể phát triển một chương trình đa luồng bao gồm các giai đoạn: tạm ngưng, tiếp tục hoặc dừng hoàn toàn. Sử dụng các phương thức sau để quản lý và điều khiển luồng:
• public void stop()
Có chức năng ngưng luồng thi hành, phương thức này không an toàn, nên gán null vào biến Thread để để dừng luồng, thay vì sử dụng phương thức stop()
• public void suspend()
Có chức năng tạm ngừng luồng, trong Java 2, phương thức này ít được dùng vì không giải phóng tài nguyên, do vậy nguy cơ dẫn đến deadlock, thay vào đó dùng phương thức wait()
• public void resume()
Tiếp tục vận hành luồng nếu nó đang bị ngưng. Nếu luồng đang thi hành thì phương thức này bị bỏ qua, thông thường phương thức này dùng kết hợp với phương thức suspend(), kể từ Java 2 phương thức này cùng với phương thức suspend() không được sử dụng, do vậy nên dùng phương thức notify ()
• public static void sleep( long millis) Threadows InterruptedException
Đặt luồng thi hành vào trạng thái ngủ, trong khoảng thời gian xác định bằng mili giây. chú ý sleep() là phương thức tĩnh.
public void destroy() Hủy luồng đang thi hành
3.10.5.Luồng chạy ngầm (deamon)
Trong Java có hai loại luồng:
- Luồng người sử dụng : Do người dùng tạo ra