Tối ưu hóa mã trong Java
Pavlos Kosmetatos
Lead Engineer @Wealthyhood
Giờ ta đã biết độ phức tạp thời gian và không gian!
Áp dụng hiểu biết này để viết mã hiệu quả hơn như thế nào?
Bằng cách chọn đúng cấu trúc dữ liệu!
Ta xây dựng hệ thống quản lý người dùng
Cần kiểm tra với một tên người dùng 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: $O(1)$ thời gian trung bình 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ỉ mục của username cần tìmhashcode() để chuyển đối tượng thành chỉ mục có thể trapavlos.2020 -> 35189
HashMap và HashSet dùng một mảng nền tảnghashCode() trên phần tử để lấy 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!
LinkedList cho bucketChọn cấu trúc dữ liệu như chọn đúng dụng cụ cho công việc — búa (ArrayList) hợp với đinh nhưng tệ với vít (lúc này Set hợp hơn).

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