¿StringBuilder.toString conserva la cadena construida?
Estoy creando un StringBuilder para recopilar cadenas que periódicamente descarga a un servidor. Si la descarga falla, quiero mantener las cadenas para intentar de nuevo la próxima vez, aunque en el tiempo podría obtener cadenas adicionales para enviar que debe ser añadido a StringBuilder.
Lo que quiero saber es cuál sería la manera más eficiente de hacer esto, ya que se está haciendo en una aplicación para Android, donde el uso de la batería y, por tanto, el uso de la CPU es una gran preocupación. ¿La función toString () de StringBuilder de llamada almacena la cadena resultante que devuelve internamente para que una llamada posterior no tenga que realizar el trabajo de copiar todas las cadenas originales? O si falla la llamada, ¿debería crear un nuevo StringBuilder inicializado con el valor devuelto de toString ()?
- ¿Cómo se muestra un diálogo de alerta sólo en la primera ejecución de mi aplicación?
- Cómo obtener la URL actual en un navegador de Android
- Motion Recognition Manager y motion-Service en android
- 'Org.apache.http.HttpEntity' está obsoleto. ¿Cómo solucionar este error en android studio?
- Subida de imágenes de Android / GoogleDrive
- Migrar de jack a Java nativo 8
- Manera eficiente de manipular los subprocesos RxJava
- Cuando ejecuto el subproceso segundo tiempo: java.lang.IllegalThreadStateException: El hilo ya comenzó
- Esta visión no está restringida
- ¿Es esta una buena técnica (Uso de titular de datos) para eliminar la clase anónima, para reducir el riesgo de pérdida de memoria
- No se puede encontrar la clase de símbolo "Generated" para Dagger 2
- Cómo convertir los segundos en este formato "HH: mm: ss"
- Resolver los errores de migración de Holoeverywhere 1.4
Aquí está el código fuente de OpenJDK para StringBuilder
:
public String toString() { // Create a copy, don't share the array return new String(value, 0, count); }
El origen del constructor String
con esos parámetros es:
public String(char value[], int offset, int count) { if (offset < 0) { throw new StringIndexOutOfBoundsException(offset); } if (count < 0) { throw new StringIndexOutOfBoundsException(count); } // Note: offset or count might be near -1>>>1. if (offset > value.length - count) { throw new StringIndexOutOfBoundsException(offset + count); } this.offset = 0; this.count = count; this.value = Arrays.copyOfRange(value, offset, offset+count); }
Así que sí, crea una nueva String
cada vez, y sí, hace una copia del char[]
cada vez.
Es importante tener en cuenta que esta es una implementación de toString
, y otra implementación puede ser obviamente diferente.
Sería un detalle de implementación. Dado que las cadenas de java son inmutables, una impl correcta puede elegir compartir o crear nuevas cadenas de StringBuilder.toString () incluso si no es necesario.
Como todo el mundo dice, puede probar para ver si esto es realmente un problema de rendimiento real para usted. Si se trata de una solución (torpe) es encapsular StringBuilder y almacenar en caché la cadena resultante. Puede utilizar un indicador sucio para indicar que el contenido se ha modificado.
StringBuilder.toString API dice que un nuevo objeto String está asignado e inicializado para contener la secuencia de caracteres representada actualmente por este objeto.