java - programa - ¿Se almacena literalmente una cadena en la pila? ¿Hay una nueva cadena almacenada en la pila?
programa de parentesis balanceados (4)
El primero se llama como String Literal y se creó en el momento de la compilación del programa y el segundo es un objeto de cadena y se crea en el tiempo de ejecución.
A medida que utilizó la palabra clave nueva en el segundo caso, se asigna en el montón.
En el primer caso, los objetos se crean con el mecanismo llamado internamiento . Cuando intente crear otro literal de cadena que represente la misma secuencia de caracteres, en lugar de crear un nuevo compilador de objetos hará referencia a la cadena previa creada y almacenada en el grupo de cadenas
Posible duplicado:
diferencia entre el objeto de cadena y el literal de cadena
Digamos que tengo dos declaraciones.
String one = "abc";
String two = new String("abc");
¿Cuál es una memoria de pila y cuál está almacenada en montón?
¿Cuál es la diferencia entre estos dos?
¿Cuántos objetos se crean y cómo está la referencia en la memoria?
cual es la mejor practica?
En su caso, se crean 2 objetos String. En general, todos los objetos se crean en el montón. Sin embargo, dado que String one es un literal de cadena, se almacenará en el grupo de cadenas (en PermGen). También puede usar el método intern() para agregar una cadena al grupo de cadenas y obtener una referencia.
Si las declaraciones que publicaste están en un método, las referencias se almacenarán en la pila, pero no los objetos en sí.
En cuanto a la mejor práctica, creo que sería: String one = "abc"
Esto es por 2 razones:
- El código es más limpio
- Las cadenas internas se pueden comparar con ==, que es más rápido que igual. Pero necesitará internar () cualquier cadena que no sea literal antes de poder compararla.
EDITAR: Quizás le interese consultar este enlace: Escape Analysis en Java SE 7 . Presenta algunas optimizaciones relacionadas con HotSpot que afectan la asignación de objetos.
Solo las instancias de tipos primitivos (int, long, ...) se guardan en la pila. Todas las instancias de tipos de referencia ( String
, Integer
, Long
, YourTypeHere
, ...) se guardan en heap.
ACTUALIZACIÓN Como se señaló en los comentarios, las referencias a instancias de tipos de referencia (es decir, tipos no primitivos - Object
y sus ''descendientes) se pueden guardar en la pila. Estas son sus variables locales.
Esta no es una "mejor práctica", es la forma en que funciona JVM y no puede cambiarlo.
Todos los objetos se almacenan en el montón (incluidos sus atributos). 1
Las variables locales (incluidos los argumentos) siempre contienen valores primitivos o referencias y se almacenan en la pila. 1
Entonces, para tus dos líneas:
String one = "abc";
String two = new String("abc");
Tendrás dos objetos en el montón (dos objetos de cadena que contienen "abc"
) y dos referencias, una para cada objeto, en la pila (siempre que one
y two
sean variables locales).
(En realidad, para ser precisos, cuando se trata de cadenas internas como literales de cadena, se almacenan en el llamado grupo de cadenas).
¿Cuántos objetos se crean y cómo está la referencia en la memoria?
Es interesante que preguntes, porque las cadenas son especiales en el lenguaje Java.
Sin embargo, una cosa está garantizada : cada vez que use algo new
, obtendrá una nueva referencia. Esto significa que two
no se referirán al mismo objeto como one
que significa que tendrá dos objetos en el montón después de esas dos líneas de código.
1) Formalmente hablando, la Especificación del lenguaje Java no especifica cómo ni dónde se almacenan los valores en la memoria. Esto (o variaciones) es, sin embargo, cómo se hace generalmente en la práctica.