Java 程式碼最佳化
Pavlos Kosmetatos
Lead Engineer @Wealthyhood
你現在已經了解空間與時間複雜度了!
要如何運用這些觀念來寫更高效的程式碼?
選對資料結構就對了!
我們正在打造使用者管理系統
需要檢查給定的使用者名稱是否存在
若用 list:複雜度為 $O(n)$
public boolean usernameExists(ArrayList<String> users, String newUsername) {
for (String username : users) {
if (username.equals(newUsername)) {
return true;
}
}
return false;
}
改良版使用者管理系統:
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)$public class UserCache {
private HashMap<String, UserProfile> userProfiles = new HashMap<>();
public UserProfile getUser(String username) {
return userProfiles.get(username); // O(1) average time
}
}
hashCode()ArrayList 範例中,我們不知道要找的使用者名稱索引hashcode() 方法可把物件轉成可查找的索引pavlos.2020 -> 35189
HashMap 與 HashSet 內部以陣列儲存hashCode() 以取得整數範例:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
"optimizingCodeInJava" -> 1406313774 // Implemented by Java
1406313774 % 16 = 14 <- that's our bucket!
LinkedList 連結選資料結構就像選工具——錘子(ArrayList)敲釘子很好用,但鎖螺絲就很差(這時 Set 可能更適合)。

Java 程式碼最佳化