Tối ưu hóa mã trong Java
Pavlos Kosmetatos
Lead Engineer @Wealthyhood
Giờ bạn đã nắm độ phức tạp về không gian và thời gian!
Làm sao áp dụng hiểu biết này để viết mã hiệu quả hơn?
Bằng cách chọn đúng cấu trúc dữ liệu!
Ta đang xây dựng hệ thống quản lý người dùng
Cần kiểm tra với một username cho trước, người dùng có tồn tại không
Dùng list: độ phức tạp $O(n)$
public boolean usernameExists(ArrayList<String> users, String newUsername) {
for (String username : users) {
if (username.equals(newUsername)) {
return true;
}
}
return false;
}
Giải pháp cải tiến cho quản lý người dùng:
public class UserRegistry {
private HashSet<String> users = new HashSet<>();
public boolean userExists(String username) {
return users.contains(username); // O(1) average time
}
}
HashMap: trung bình $O(1)$ cho các thao tácpublic class UserCache {
private HashMap<String, UserProfile> userProfiles = new HashMap<>();
public UserProfile getUser(String username) {
return userProfiles.get(username); // O(1) average time
}
}
hashCode()ArrayList, ta không biết chỉ số của username cần tìmhashcode(), ta có thể chuyển một đối tượng thành chỉ số để tra cứupavlos.2020 -> 35189
HashMap và HashSet dùng một mảng bên dướihashCode() trên phần tử để lấy một số nguyênVí dụ:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
"optimizingCodeInJava" -> 1406313774 // Implemented by Java
1406313774 % 16 = 14 <- đó là bucket của ta!
LinkedList cho bucketChọn cấu trúc dữ liệu giống như chọn đúng dụng cụ cho công việc - búa (ArrayList) hợp với đóng đinh nhưng tệ với vít (nơi Set phù hợp hơn).

Tối ưu hóa mã trong Java