Luego me preguntaron cuántas cadenas generaría este programa, suponiendo que la recolección de basura no ocurra. Mis pensamientos para n = 3 fueron (7)
Las cadenas 1 ( ""
) y 2 ( "a"
) son las constantes en el programa, no se crean como parte de las cosas sino que se 'internan' porque son constantes que el compilador conoce. Lea más sobre esto en String interning en Wikipedia.
Esto también elimina las cadenas 5 y 7 del recuento, ya que son lo mismo "a"
que la Cadena # 2. Esto deja las cadenas # 3, # 4 y # 6. La respuesta es "se crean 3 cadenas para n = 3" utilizando su código.
El recuento de n 2 obviamente es incorrecto porque en n = 3, esto sería 9 e incluso por su respuesta en el peor de los casos, eso fue solo 7. Si sus cadenas no internadas eran correctas, la respuesta debería haber sido 2n + 1.
Entonces, la pregunta de cómo debe hacer esto?
Como la cadena es inmutable , desea algo mutable, algo que pueda cambiar sin crear nuevos objetos. Ese es el StringBuilder .
Lo primero a tener en cuenta son los constructores. En este caso, sabemos cuánto tiempo durará la cadena, y hay un constructor, lo StringBuilder(int capacity)
que significa que asignamos exactamente lo que necesitamos.
A continuación, "a"
no necesita ser una cadena , sino que puede ser un personaje 'a'
. Esto tiene un aumento de rendimiento menor cuando se llama append(String)
vs append(char)
: con el append(String)
método, necesita descubrir cuánto tiempo dura la cadena y hacer algo de trabajo en eso. Por otro lado, char
siempre tiene exactamente un carácter de largo.
Las diferencias de código se pueden ver en StringBuilder.append (String) vs StringBuilder.append (char) . No es algo de lo que preocuparse demasiado , pero si está tratando de impresionar al empleador, es mejor utilizar las mejores prácticas posibles.
Entonces, ¿cómo se ve esto cuando lo juntas?
public String foo(int n) {
StringBuilder sb = new StringBuilder(n);
for (int i = 0; i < n; i++) {
sb.append('a');
}
return sb.toString();
}
Se han creado un StringBuilder y un String. No se necesitan cadenas adicionales para ser internado.
Escriba algunos otros programas simples en Eclipse. Instala pmd y ejecútalo en el código que escribes. Tenga en cuenta de qué se queja y arregle esas cosas. Hubiera encontrado la modificación de una Cadena con + en un bucle, y si la hubiera cambiado a StringBuilder, tal vez habría encontrado la capacidad inicial, pero ciertamente detectaría la diferencia entre .append("a")
y.append('a')