Optimalizace kódu v Javě
Pavlos Kosmetatos
Lead Engineer @Wealthyhood
Teď už známe prostorovou a časovou složitost!
Jak tyto znalosti využít k psaní efektivnějšího kódu?
Výběrem správné datové struktury!
Vytváříme systém pro správu uživatelů
Potřebujeme pro dané uživatelské jméno zjistit, jestli uživatel existuje
Při použití seznamu: složitost $O(n)$
public boolean usernameExists(ArrayList<String> users, String newUsername) {
for (String username : users) {
if (username.equals(newUsername)) {
return true;
}
}
return false;
}
Vylepšené řešení systému pro správu uživatelů:
public class UserRegistry {
private HashSet<String> users = new HashSet<>();
public boolean userExists(String username) {
return users.contains(username); // O(1) average time
}
}
HashMap: průměrná časová složitost operací $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 jsme neznali index hledaného uživatelského jménahashcode() můžeme převést objekt na index, podle kterého vyhledávámepavlos.2020 -> 35189
HashMap a HashSet mají uvnitř polehashCode() na daný prvek, aby získala celé čísloPříklad:
[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!
LinkedListVýběr datové struktury je jako výběr správného nástroje na danou práci – kladivo (ArrayList) je skvělé na hřebíky, ale na šrouby se moc nehodí (tam by mohla lépe posloužit Set).

Optimalizace kódu v Javě