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 deString
clase.- ¿Es cierto que cada lista de caracteres contenida entre
""
es considerado como un objeto derivado de la clase String?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 deStringBuilder
para añadir el dos cuerdaspero 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 deStringBuilder
a añadir las dos cuerdas.- Entonces, ¿cuál es el enfoque utilizado en el segundo ejemplo?
Respuestas
1 para la respuesta № 1"+" 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.