Otimização de Código em Java
Pavlos Kosmetatos
Lead Engineer @Wealthyhood
Agora você já conhece complexidade de espaço e tempo!
Como aplicar isso para escrever código mais eficiente?
Escolhendo a estrutura de dados certa!
Estamos criando um sistema de gerenciamento de usuários
Para um nome de usuário, precisamos verificar se o usuário existe
Usando uma lista: complexidade $O(n)$
public boolean usernameExists(ArrayList<String> users, String newUsername) {
for (String username : users) {
if (username.equals(newUsername)) {
return true;
}
}
return false;
}
Solução aprimorada do sistema de usuários:
public class UserRegistry {
private HashSet<String> users = new HashSet<>();
public boolean userExists(String username) {
return users.contains(username); // O(1) tempo médio
}
}
HashMap: $O(1)$ de tempo médio por operaçãopublic class UserCache {
private HashMap<String, UserProfile> userProfiles = new HashMap<>();
public UserProfile getUser(String username) {
return userProfiles.get(username); // O(1) tempo médio
}
}
hashCode()ArrayList, não sabíamos o índice do nome a buscarhashcode(), dá para converter um objeto em um índice pesquisávelpavlos.2020 -> 35189
HashMap e HashSet usam um array por baixohashCode() no elemento para obter um inteiroExemplo:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
"optimizingCodeInJava" -> 1406313774 // Implementado pelo Java
1406313774 % 16 = 14 <- esse é o nosso bucket!
LinkedList para o bucketEscolher a estrutura de dados é como escolher a ferramenta certa: um martelo (ArrayList) é ótimo para pregos, mas péssimo para parafusos (onde um Set funciona melhor).

Otimização de Código em Java