/ / Concatenación de dos cadenas Java [duplicadas] - java, cadena, concatenación

Concatenación de dos cadenas Java [duplicadas] - java, cadena, concatenación

  1. Cuando escribo el siguiente código

    int a = "Java";
    

    El compilador de java muestra el siguiente error:

    no se puede convertir de String a int

    Entonces la constante Java es considerado como un objeto derivado de String clase.

    - ¿Es cierto que cada lista de caracteres contenida entre "" es considerado como un objeto derivado de la clase String?

  2. Cuando trato de tener concatenación de dos cuerdas utilicé las dos siguientes ejemplos:

    String ch1 = "Java " ;
    String ch2 = "is cool";
    String ch3 = ch1 + ch2;
    

    despues de usar el comando javap -c En mi clase compilada encontré que el compilador utilice una instancia de StringBuilder para añadir el dos cuerdas

    pero con el otro ejemplo:

    String ch = "Java " + "is cool";
    

    Aunque las dos constantes "Java" y "es genial" son dos objetos derivados de String clase, el compilador no usa una instancia de StringBuilder a añadir las dos cuerdas.

    - Entonces, ¿cuál es el enfoque utilizado en el segundo ejemplo?

Respuestas

1 para la respuesta № 1

De aquí.

"+" crea un nuevo objeto String cada vez que concatena algo, excepto cuando la concatenación se realiza en tiempo de compilación.

Si bien esto no es una fuente confiable, por lo que recuerdo de mis libros de texto, esto suena correcto. Así que básicamente, aplicando esto a tu código:

String ch = "Java " + "is cool";

Sería manejado en tiempo de compilación ya que tienesdefinieron dos constantes y las concatenaron juntas, lo que implica que el resultado también es de hecho una constante y, por lo tanto, puede tratarse como tal y calcularse en el momento de la compilación. Sería interesante ver si compilaste ese código y luego lo descompilas para ver cómo se lee esa declaración, me imagino que puede leer:

String ch = "Java is cool";

En cuanto a la otra afirmación:

String ch1 = "Java " ;
String ch2 = "is cool";
String ch3 = ch1 + ch2;

Dado que ch3 se calcula a partir de ch1 y ch2, se realiza en tiempo de ejecución, ya que ch1 y ch2 son variables en lugar de constantes.

En cuanto a tu primera pregunta, no puedo encontrar ningunahace referencia exactamente, pero por lo que recuerdo sí, el "" implica una cadena, como "" implica un carácter. No estoy exactamente seguro de lo que está tratando de hacer con esa declaración, pero me imagino que podría convertir su cadena en una matriz de caracteres y luego convertirla en una matriz int.


0 para la respuesta № 2

No estoy seguro de cuál es tu segunda pregunta, pero para tu primera pregunta: "Java" es una cadena y usted está intentando almacenarla como un tipo int. No es un número entero. La variable a debe ser de tipo cadena.

   String a = "Java ";

0 para la respuesta № 3

En el primer ejemplo has creado 2 cadenas.vars, ch1 y ch2 que podrían usarse en otras partes del código para que ... cuando inicies ch3, se cree una nueva cadena en la memoria con el contenido de ambos vars (aquí es donde StringBuilder hace el trabajo). Esto es necesario porque puedes cambiar el valor de ch2 y ch3 no se cambiará.

En el segundo ejemplo, ambas cadenas son definitivas y nunca más se usan en el código, por lo que Java simplemente crea una cadena única "Java es genial".

No sé si lo he explicado bien.


0 para la respuesta № 4

Cuando hagas la siguiente linea

String ch1 = "Java " ;
String ch2 = "is cool";
String ch3 = ch1 + ch2;

Tanto ch1 como ch2 son literales y el compiladorcrearía una instancia de String usando StringBuilder. En los días anteriores (cuando el compilador no es lo suficientemente inteligente para hacer esto) estaríamos desperdiciando memoria para cada ejecución mediante una operación concat.

pero cuando usas esto

String ch = "Java " + "is cool";

El compilador entendió que String Literal "Java" + "es genial" no se puede modificar en ningún momento. Así que los compiladores traducirían esto a

String ch = "Java is cool";

como código de bytes. y solo un literal de cadena crearía tiempo de ejecución.