Optimizing Code in Java
Pavlos Kosmetatos
Lead Engineer @Wealthyhood
¡Ya conocemos la complejidad en espacio y tiempo!
¿Cómo aplicamos esto para escribir código más eficiente?
¡Eligiendo la estructura de datos adecuada!
Estamos creando un sistema de gestión de usuarios
Necesitamos comprobar, para un nombre de usuario dado, si el usuario existe
Usando una lista: complejidad $O(n)$
public boolean usernameExists(ArrayList<String> users, String newUsername) {
for (String username : users) {
if (username.equals(newUsername)) {
return true;
}
}
return false;
}
Solución mejorada del sistema de usuarios:
public class UserRegistry {
private HashSet<String> users = new HashSet<>();
public boolean userExists(String username) {
return users.contains(username); // O(1) tiempo medio
}
}
HashMap: complejidad media $O(1)$ para operacionespublic class UserCache {
private HashMap<String, UserProfile> userProfiles = new HashMap<>();
public UserProfile getUser(String username) {
return userProfiles.get(username); // O(1) tiempo medio
}
}
hashCode()ArrayList, no sabíamos el índice del nombre de usuario a buscarhashcode(), podemos convertir un objeto en un índice que buscarpavlos.2020 -> 35189
HashMap y HashSet tienen un array subyacentehashCode() sobre tu elemento para obtener un enteroEjemplo:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
"optimizingCodeInJava" -> 1406313774 // Implementado por Java
1406313774 % 16 = 14 <- ¡ese es nuestro bucket!
LinkedList para el bucketElegir una estructura de datos es como escoger la herramienta adecuada: un martillo (ArrayList) va genial para clavos, pero fatal para tornillos (ahí un Set puede ir mejor).

Optimizing Code in Java