2011-03-24 12 views

Respuesta

6

Es un poco de ambos.

La JVM tiene códigos de bytes para cargar literales de cadena en la pila de tiempo de ejecución, y estos códigos de operación se especifican en la especificación JVM para que funcionen empujando un objeto String adecuadamente construido a la pila cuyo contenido es igual a una cadena literal especificada en el archivo de clase. No hay ninguna especificación para la forma en que se hace esto, salvo que el objeto String debe ser internado, lo que significa que la transformación es específica de la implementación.

En el nivel de idioma, el compilador puede tratar cualquier literal String que vea como un objeto String completo con el objetivo de verificar los tipos, y puede simplemente escribir los códigos de bytes literales y apropiados en el archivo de clase.

+0

¿Hay alguna manera de escribir programas en código de bytes de Java (similar a una especie de lenguaje ensamblador) como el aprendizaje ¿ejercicio? – TurtleToes

+1

@TurtleToes: Sí, usando [Jasmin] (http://jasmin.sourceforge.net/). –

+0

genial. gracias un montón. esto será interesante – TurtleToes

3

Java realmente tiene algunos operadores sobrecargados. Por ejemplo, + se puede aplicar a objetos String, así como a int, float y otros tipos numéricos. En cada caso, el tipo de devolución se define por el tipo de expresión a cada lado del +. Sin embargo, todos los operadores sobrecargados están predefinidos en el idioma; los programadores no tienen ningún mecanismo en el lenguaje para definir otros. Vea el language specification para más detalles.

+0

Quien rechazó esto ... ¿se preocupa por explicar por qué? –

+0

No fui yo, lo siento. Bajé la votación por sugerir que alguien pause y reanude un hilo en lugar de destruirlo y hacer nuevas instancias del hilo, y nadie se acercó para explicar por qué. – TurtleToes

+0

@TurtleToes: Escribí un comentario explicando por qué tu respuesta fue terrible (pero no fui yo quien te votó negativamente, quizás se muestren o no). –

0

Básicamente, el compilador reescribe su código.

String x = "Some String"; 

para la concatenación, que es sólo azúcar sintáctica para StringBuffer append método, es decir esto:

z += " with some more in it"; 

se compila como:

z = new StringBuffer(z).append(" with some more in it").toString(); 

Ahora para un solo concat esto es un objeto llamadas creadas y 2 de método, por lo que si está creando una cadena muy larga dentro de un bucle, es mucho más eficiente escribir:

StringBuilder buf = new StringBuilder(); // Not synchronized so quicker than StringBuffer 
while (condition is true) 
    buf.append(...); 
String z = buf.toString(); 

en lugar de:

String z = ""; 
while (condition is true) 
    z += "..."; 

Editar: eliminado ejemplo de código incorrecto ...

+2

No, '" Soy una cadena "' no es _ 'Nueva Cadena (" Soy una cadena ")'; si fuera así, obtendría llamadas infinitamente recursivas al constructor 'String'. –

+1

Un detalle menor: todos los literales de cadena están internados, por lo que un literal de cadena no es exactamente lo mismo que crear una cadena nueva. Devolverá la instancia de String compartida por todos los literales de cadena con el mismo valor. – templatetypedef

+1

@templatetypedef: En realidad, es un detalle significativo. A veces escribo código que explota esa propiedad: por ejemplo, si sé que estoy comparando dos variables que sé que son literales de cadena o internados de otra manera, utilizo la comparación de identidad. –

Cuestiones relacionadas