example - stringbuilder java 8
¿Cómo puedo borrar o vaciar un StringBuilder? (9)
Creo que a muchas de las respuestas aquí les puede faltar un método de calidad incluido en StringBuilder
: .delete(int start, [int] end)
. Sé que esta es una respuesta tardía; sin embargo, esto debería darse a conocer (y explicarse un poco más a fondo).
Digamos que tiene una tabla de StringBuilder - que desea modificar dinámicamente, a lo largo de su programa (en la que estoy trabajando ahora mismo), por ejemplo
StringBuilder table = new StringBuilder();
Si recorre el método y modifica el contenido, use el contenido, luego desea descartar el contenido para "limpiar" el StringBuilder
para la próxima iteración, puede eliminar su contenido, por ejemplo
table.delete(int start, int end).
Comience y termine siendo los índices de los caracteres que desea eliminar. ¿No sabes la longitud en caracteres y quieres eliminar todo?
table.delete(0, table.length());
AHORA, para el pateador. StringBuilders
, como se mencionó anteriormente, tienen una gran sobrecarga cuando se modifican con frecuencia (y pueden causar problemas de seguridad con respecto al enhebrado); por lo tanto, use StringBuffer
- igual que StringBuilder
(con algunas excepciones) - si su StringBuilder
se usa con el propósito de interactuar con el usuario.
Esta pregunta ya tiene una respuesta aquí:
Estoy usando un StringBuilder en un bucle y cada x iteraciones quiero vaciarlo y comenzar con un StringBuilder
vacío, pero no puedo ver ningún método similar al .NET StringBuilder.Clear en la documentación, solo el método de delete que Parece demasiado complicado.
Entonces, ¿cuál es la mejor manera de limpiar un StringBuilder
en Java?
Debe usar sb.delete(0, sb.length())
o sb.setLength(0)
y NO crear un nuevo StringBuilder ().
Vea esta publicación relacionada para el rendimiento: ¿Es mejor reutilizar un StringBuilder en un bucle?
Dos formas que funcionan:
- Utilice
stringBuilderObj.setLength(0)
. - Asigne uno nuevo con el
new StringBuilder()
lugar de borrar el búfer.
Hay básicamente dos alternativas, usar setLength(0)
para restablecer el StringBuilder o crear uno nuevo en cada iteración. Ambos pueden tener pros y contras dependiendo del uso.
Si conoce de antemano la capacidad esperada del StringBuilder, crear una nueva cada vez debería ser tan rápido como establecer una nueva longitud. También ayudará al recolector de basura, ya que cada StringBuilder tendrá una vida relativamente corta y el gc está optimizado para eso.
Cuando no conoce la capacidad, reutilizar el mismo StringBuilder puede ser más rápido. Cada vez que excede la capacidad al agregar, se debe asignar una nueva matriz de respaldo y se debe copiar el contenido anterior. Al reutilizar el mismo StringBuilder, alcanzará la capacidad necesaria después de algunas iteraciones y no habrá ninguna copia posterior.
Si el rendimiento es la principal preocupación ... la ironía (IMO) es que las construcciones de Java para formatear el texto que ingresa en el búfer consumirán mucho más tiempo en la CPU que la asignación / realloc / recolección de basura ... bueno, posiblemente no el GC dependiendo de cuántos constructores crees y descartes.
Pero simplemente agregar una cadena compuesta ("Hello World of" + 6E9 + "earthlings") al búfer es probable que haga que todo el asunto sea intrascendente.
Y, realmente, si StringBuilder está involucrado, el contenido es complejo y largo y más largo que un simple String str = "Hi";
(No importa Java, probablemente use un constructor en segundo plano de todos modos).
Personalmente, trato de no abusar del GC. Entonces, si es algo que se va a usar mucho en un escenario de incendio rápido, como, por ejemplo, escribir mensajes de salida de depuración ... Supongo que declararlo en otro lugar y ponerlo en cero para su reutilización.
class MyLogger {
StringBuilder strBldr = new StringBuilder(256);
public LogMsg( String stuff ) {
strBldr.setLength(0);
// ... prepend status level
strBldr.append("Info");
// ... prepend timestamp
strBldr.append(" " + getTimestamp());
// ... user msg
strBldr.append(":" + msg);
log.write(strBldr.toString());
}
}
Si observa el código fuente de un StringBuilder o StringBuffer, la llamada a setLength () simplemente restablece un valor de índice para la matriz de caracteres. IMHO utilizando el método setLength siempre será más rápido que una nueva asignación. Deberían haber llamado al método ''clear'' o ''reset'' para que sea más claro.
delete
no es demasiado complicado:
myStringBuilder.delete(0, myStringBuilder.length());
También puedes hacer:
myStringBuilder.setLength(0);
sb.setLength(0);
por sb.setLength(0);
no solo porque es una llamada de función, sino porque en realidad no copia la matriz en otra matriz como sb.delete(0, builder.length());
. Simplemente llena los caracteres restantes para ser 0 y establece la variable de longitud a la nueva longitud.
Puede echar un vistazo a su implementación para validar mi punto desde here en la función delete0
y la función delete0
.
StringBuilder s = new StringBuilder();
s.append("a");
s.append("a");
// System.out.print(s); is return "aa"
s.delete(0, s.length());
System.out.print(s.length()); // is return 0
es la forma mas facil