Java StringBuilder.setLength () - ¿es la complejidad del tiempo O (1)?

Estoy planeando realizar muchas eliminaciones del último personaje en StringBuilders. La solución para usar se sb.setLength(sb.length() - 1);ve bien para mí. Sin embargo, dado que estas eliminaciones estarán en un bucle, necesito saber su complejidad.

Según tengo entendido, esta operación simplemente disminuye algún atributo privado de mi objeto StringBuilder y no realiza ninguna copia / clonación / duplicación de los propios caracteres, por lo tanto, es O (1) a tiempo y debería funcionar rápidamente.

Estoy en lo cierto?

Respuesta 1

De la documentación:

Establece la longitud de la secuencia de caracteres. La secuencia se cambia a una nueva secuencia de caracteres cuya longitud se especifica mediante el argumento. Para cada índice no negativo k menor que newLength, el carácter en el índice k en la nueva secuencia de caracteres es el mismo que el carácter en el índice k en la secuencia anterior si k es menor que la longitud de la secuencia de caracteres anterior; de lo contrario, es el carácter nulo '\ u0000'. En otras palabras, si el argumento newLength es menor que la longitud actual, la longitud se cambia a la longitud especificada. Si el argumento newLength es mayor o igual que la longitud actual, se agregan suficientes caracteres nulos ('\ u0000') para que la longitud se convierta en el argumento newLength.

El argumento newLength debe ser mayor o igual que 0.

Yo diría que sí. Pero no lo vería desde el punto de vista de la complejidad del tiempo. La razón por la que usamos StringBuilder en lugar de String en un bucle es porque las cadenas son inmutables. Por lo tanto, siempre se creará un nuevo objeto de cadena cuando intentemos cambiarlo. Cuando cambia la longitud de un objeto StringBuilder, no se crea ningún objeto nuevo.

Respuesta: 2

Es O (1) si la nueva longitud es menor que la anterior, que es en su caso.

El código fuente del JDK está disponible en línea, por lo que puede verificarlo usted mismo. El uso de Java 8 como ejemplo setLengthse implementa en AbstractStringBuilder. Hace algunas cosas:

  • errores si la nueva longitud <0
  • asegura que el StringBuilder tenga suficiente capacidad para la nueva longitud (lo que tendrá, si acorta la longitud)
  • completa 0s para la longitud adicional, si está extendiendo la longitud (que no es así)
  • establece el this.countcampo a la longitud que especifique

Poniendolo todo junto:

  • Si está acortando la longitud, esto es O (1): algunas comprobaciones rápidas y luego una asignación de campo.
  • Si está aumentando la longitud, pero la capacidad anterior sigue siendo suficiente, entonces es O (N) donde N es la longitud adicional (por ejemplo, si tenía un constructor de 100 longitudes, la acortó a 10 y ahora lo están aumentando a 90, entonces N sería 90-10 = 80)
  • Si está aumentando la longitud de tal manera que la capacidad debe aumentarse, es O (N) donde N es la nueva capacidad
Respuesta: 3

Tengo un complemento Maven que tiene un groupId, artifactId y una versión en su configuración. Quiero poder descargar ese artefacto desde los repositorios remotos y copiar el archivo en el proyecto. ...

Estoy ejecutando una aplicación de procesamiento de transmisión en un entorno LocalStream (clúster de parpadeo integrado). Procesé un conjunto de datos específico usando mi código con éxito varias veces. Quería volver a ejecutar el ...

Cuando realiza una solicitud de descanso con RestAssured, parece esperar una respuesta. Necesito hacer una solicitud POST en RestAssured y luego, mientras espera una respuesta, necesito hacer una solicitud GET. YO'...

Por ejemplo, para un juego tengo algo de habilidad, que es un objeto de datos: habilidad de interfaz pública {public String getName (); } Public class Attack implementa Skill {public String getName () {return "Attack"; ...