¿Cuáles son las mecánicas detrás de Java que interpreta automáticamente los literales de cadena como objetos String, ya que no hay operadores sobrecargados y no hay compatibilidad predeterminada para los almacenamientos intermedios de cadenas de bajo nivel (sin incluir StringBuffer de alto nivel)? ¿Es este un contexto de lenguaje o máquina virtual?literal de cadena de Java interpretado automáticamente como objeto String, pero ¿cómo?
Respuesta
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.
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.
Quien rechazó esto ... ¿se preocupa por explicar por qué? –
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
@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). –
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 ...
No, '" Soy una cadena "' no es _ 'Nueva Cadena (" Soy una cadena ")'; si fuera así, obtendría llamadas infinitamente recursivas al constructor 'String'. –
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
@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. –
- 1. ¿Cómo convertirías un String a un literal de cadena Java?
- 2. diferencia de objeto "Cadena", y literal de cadena en JavaScript
- 3. Emparejar correctamente una cadena de Java literal
- 4. Recurso interpretado como Otro pero transferido con tipo MIME indefinido
- 5. Access como literal de cadena en PHP
- 6. Java obtener String CompareTo como objeto de comparación
- 7. Estado de escape dentro de un literal de cadena como argumento de `String # tr`
- 8. ¿Cómo utilizar el argumento de macro como cadena literal?
- 9. Java: literal cadenas
- 10. Cómo convertir String a DOM ¿Objeto de documento en Java?
- 11. Url Codificar Javascript objeto literal
- 12. Imprimir cadena Unicode literal como el carácter real
- 13. recurso interpretado como imagen pero transferido como texto/html mientras se trabaja con Google Maps
- 14. cadena literal Sizeof
- 15. ¿Java es un lenguaje de programación compilado o interpretado?
- 16. ¿Cómo usar una cadena literal JSON?
- 17. Concatenar literal de cadena con literal de char
- 18. Cómo eliminar " " de java string
- 19. Javascript objeto literal
- 20. Comparación de Literal de carácter a Std :: String en C++
- 21. Java: ¿Cómo convertir un objeto File a un objeto String en java?
- 22. Groovy/String de Java
- 23. Python prima cadena literal
- 24. Java: PrintStream a String?
- 25. Java RegEx que coincide con cualquier cosa PERO cadena literal 'NIL' o 'nil'
- 26. Cómo usar Razor como asp: ¿Literal?
- 27. literal de cadena en c
- 28. Cómo citar \ "(barra doble) en un literal de cadena?
- 29. Javascript: interpretar cadena como referencia de objeto?
- 30. Declaración de objeto como final en java
¿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
@TurtleToes: Sí, usando [Jasmin] (http://jasmin.sourceforge.net/). –
genial. gracias un montón. esto será interesante – TurtleToes