numeros manejo funciones declarar concatenar como caracteres cadenas cadena java string compiler-construction string-concatenation

manejo - ¿La concatenación de cadenas en Java siempre lleva a que se creen nuevas cadenas en la memoria?



funciones de cadena en java (3)

¿La concatenación de cadenas en Java siempre lleva a que se creen nuevas cadenas en la memoria?

No, no siempre hace eso.

Si la concatenación es una expresión constante en tiempo de compilación, entonces la realiza el compilador, y la cadena resultante se agrega a la agrupación de constantes de las clases compiladas. En tiempo de ejecución, el valor de la expresión es la String internada que corresponde a la entrada de la agrupación constante.

Esto sucederá en el ejemplo de tu pregunta.

Tengo una cadena larga que no se ajusta al ancho de la pantalla. Por ejemplo.

String longString = "This string is very long. It does not fit the width of the screen. So you have to scroll horizontally to read the whole string. This is very inconvenient indeed.";

Para que sea más fácil de leer, pensé en escribirlo de esta manera:

String longString = "This string is very long." + "It does not fit the width of the screen." + "So you have to scroll horizontally" + "to read the whole string." + "This is very inconvenient indeed.";

Sin embargo, me di cuenta de que la segunda forma utiliza la concatenación de cadenas y creará 5 nuevas cadenas en la memoria y esto podría llevar a un impacto en el rendimiento. ¿Es este el caso? ¿O sería el compilador lo suficientemente inteligente como para darse cuenta de que todo lo que necesito es realmente una sola cadena? ¿Cómo podría evitar hacer esto?


Me di cuenta de que la segunda forma utiliza la concatenación de cadenas y creará 5 nuevas cadenas en la memoria y esto podría llevar a un impacto en el rendimiento.

No, no lo hará. Dado que estos son literales de cadena, se evaluarán en tiempo de compilación y solo se creará una cadena . Esto se define en la Especificación del lenguaje Java # 3.10.5 :

Un literal de cadena larga siempre se puede dividir en partes más cortas y escribirse como una expresión (posiblemente entre paréntesis) utilizando el operador de concatenación de cadenas +
[...]
Además, un literal de cadena siempre se refiere a la misma instancia de la clase String.

  • Las cadenas calculadas por expresiones constantes (§15.28) se calculan en tiempo de compilación y luego se tratan como si fueran literales.
  • Las cadenas calculadas por concatenación en tiempo de ejecución se crean nuevamente y, por lo tanto, son distintas.

Prueba:

public static void main(String[] args) throws Exception { String longString = "This string is very long."; String other = "This string" + " is " + "very long."; System.out.println(longString == other); //prints true }

Sin embargo, la situación a continuación es diferente, ya que utiliza una variable: ahora hay una concatenación y se crean varias cadenas:

public static void main(String[] args) throws Exception { String longString = "This string is very long."; String is = " is "; String other = "This string" + is + "very long."; System.out.println(longString == other); //prints false }


Por favor revise el siguiente fragmento de código basado en sus entradas:

String longString = "This string is very long. It does not fit the width of the screen. So you have to scroll horizontally to read the whole string. This is very inconvenient indeed."; String longStringOther = "This string is very long. " + "It does not fit the width of the screen. " + "So you have to scroll horizontally " + "to read the whole string. " + "This is very inconvenient indeed."; System.out.println(" longString.equals(longStringOther) :"+ longString.equals(longStringOther)); System.out.println(" longString == longStringother : " + (longString == longStringOther ));

Salida:

longString.equals (longStringOther): true
longString == longStringother: true

1er caso : ambas cadenas son iguales (tienen el mismo contenido)

Segundo caso : muestra que solo hay una cadena después de la concatenación. Así que solo se crea una cadena.