Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

477
Vistas
Cómo evitar el "aviso: 'StringBuilder sb' se puede reemplazar con 'String'" en intellij-idea

cuando uso el IDE - "IDEA 14.03", siempre me da este aviso. aviso: 'StringBuilder sb' se puede reemplazar con 'String'

Aquí están los detalles, cuando defino un objeto llamado "sb", y la clase de objeto es "StringBuilder". Aquí hay un fragmento de código que probé:

 StringBuilder sb = new StringBuilder("status=").append(status).append(" ,msg=").append(msg); System.out.println(sb);

Solo quiero saber cuáles son los beneficios si cambio el "StringBuilder" a "String". ¿Y por qué el IDE siempre me notifica que cambie el tipo de clase?

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Creo que para comprender por qué su IDE le dice que cambie StringBuilder a String, debe comprender las diferencias entre String, StringBuffer y StringBuilder.

La cadena es inmutable. Eso significa que si desea cambiar algo de su cadena, la cadena original no se eliminará sino que se creará una nueva, que incluye sus cambios. StringBuffer y StringBuilder son mutables. Eso significa que con sus cambios, la cadena original se cambiará en consecuencia.

La otra diferencia principal entre ellos es que String y StringBuffer son seguros para subprocesos, mientras que StringBuilder no lo es. También hay otras diferencias, eche un vistazo a este sitio para obtener más información sobre las diferencias.

Si compara String con StringBuilder, en la mayoría de los casos, usar String es más práctico y lógico, si no sabe, qué hace con su cadena.

No siempre es mejor concatenar cadenas con el signo más (+). Por ejemplo, el método de adición de StringBuilder es más lógico si cambia su cadena en un bucle debido a su mutabilidad. Lea los comentarios en el código;

 String a; StringBuilder b; for(int i=0; i<5; i++) { a += i; //String is immutable and in each iteration, a new object will be created b.append(i); //StringBuilder is mutable and in each iteration, the existing string will be used. }

Lo que hace su IDE es simplemente mostrarle las mejores prácticas. Por eso, se llama como recomendación.

Si quiere seguir su camino de todos modos y no quiere que Intellij le advierta al respecto; puede desactivar la advertencia como;

ingrese la descripción de la imagen aquí

EDITAR

Es importante tener en cuenta el comentario de @CrazyCoder aquí.

IDE es realmente muy inteligente aquí, sugiere que lo cambie para una mejor legibilidad del código, ya que el compilador interno generará exactamente el mismo código de bytes y su código tendrá el mismo rendimiento y el mismo uso de memoria, pero será más fácil de leer. Obtiene un beneficio de legibilidad sin comprometer el rendimiento. Se hizo una pregunta similar y se respondió en el foro IntelliJ IDEA hace algún tiempo.

over 4 years ago · Santiago Trujillo Denunciar

0

Sé que es una pregunta antigua que ya se respondió con una muy buena respuesta, pero solo un pequeño comentario no relacionado: en tales casos, en aras de la legibilidad (y dado que el compilador hace lo mismo de todos modos como lo mencionó Ad) usaría String .formato. en vez de

 StringBuilder sb = new StringBuilder("status=").append(status).append(" ,msg=").append(msg);

Encuentro esto más legible:

 String.format("status=%s, msg=%s", status, msg);
over 4 years ago · Santiago Trujillo Denunciar

0

Aunque el código es más fácil de leer con la concatenación de cadenas, para Java 8 y versiones anteriores, esto se implementa con un StringBuilder, por lo que, en la superficie, parece que solo se está lastimando.

Sin embargo, StringBuilder tiene una capacidad predeterminada de 16. Si profundiza en el código fuente de StringBuilder, verá que la realloc utiliza:

 int newCapacity = (value.length << 1) + 2;

Entonces, básicamente duplicas cada vez. Entonces, para una cadena arbitraria de longitud, digamos 100, terminará asignando espacio y copiando 4 veces con capacidades de 16, 32, 64 y finalmente 128.

Sin embargo, podrías hacer algo como:

 new StringBuffer(128).sb.append("status=").append(status).append(" ,msg=").append(msg).toString();

Y se ha ahorrado 3 asignaciones y copias de matrices.

Según tengo entendido, Java 9+ tiene una solución mucho mejor. Entonces, sabiendo que esto se solucionará, generalmente uso Strings a menos que sepa que el rendimiento es una preocupación y luego revierto el StringBuilder. Este es definitivamente el caso si está trabajando en sistemas integrados o Android, ya que los recursos son escasos. En un servidor en la nube, no tanto.

En cuanto al inspector de IntelliJ, lo apagué, pero generalmente agrego una etiqueta JAVA10 en un comentario, para poder encontrarlos más tarde y revertirlos cuando migremos a 10. Tal vez, solo necesito recordar volver a habilitar el inspector en su lugar. :)

PD: Me gusta la respuesta de Udi. Veré la implementación.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda