"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Asignación de memoria de cadenas en Java

Asignación de memoria de cadenas en Java

Publicado el 2024-11-12
Navegar:509

Memory Allocation of Strings in Java

En Java, las cadenas se almacenan en la memoria como objetos de la clase String.

Cuando se asigna memoria para cualquier programa Java, JVM (máquina virtual Java) divide la memoria asignada en dos partes. Una parte es Stack y la otra parte es Heap. En la memoria Heap, Java asigna algo de memoria, especialmente para los literales, esa memoria se denomina grupo constante de cadenas (SCP). SCP es el área predefinida dentro del montón. El grupo de cadenas ayuda a ahorrar mucho espacio para Java Runtime. La clase String usa SCP para almacenar literales de cadena únicos.

En la memoria de pila, se almacenan variables o referencias de variables o referencias a los objetos.

En la memoria Heap, se almacenan todos los objetos que se asignan dinámicamente. Para asignar memoria a un objeto utilizamos una nueva palabra clave.

Hay dos formas de crear objetos de cadena.

  1. Cadena literal

Cadena str1 = “MiCadena”;

Cada vez que creamos un literal de cadena, JVM primero verifica si el literal de cadena ya existe en el grupo de constantes de cadena. Si no está disponible, creará una nueva cadena literal en SCP.

En la imagen de arriba, str1 apunta a "MyString" en SCP. A continuación se detallan las formas en que se manejan los literales de cadena recién creados.

  1. Usando una nueva palabra clave

Cadena str2 = nueva Cadena(“MiCadena”); //Creando una instancia de la clase de cadena usando una nueva palabra clave

Cuando se crea un objeto de cadena usando una nueva palabra clave, se crearán dos objetos. Uno en SCP, otro en Heap y la variable de referencia se almacena en la pila.

Ya hemos creado el literal “MyString” usando

Cadena str1 = “MiCadena”;

Como no podemos tener duplicados en SCP, JVM no creará un objeto más en SCP, sino que devolverá la referencia existente a la variable str3 en la pila y creará un objeto en el montón. Str3 apuntará al objeto "MyString" en el montón pero no en SCP.

A continuación se muestran los diferentes casos de cómo se asigna la memoria para objetos de cadena.

Caso 1: Cómo se almacenan en la memoria los objetos de cadena definidos anteriormente.

cadenas de clase públicaStorageConcept

{

principal vacía estática pública (String[] args)

{

Cadena str1 = “MiCadena”;

Cadena str2 = nueva cadena(“MiCadena”);

System.out.println(str1 == str2); //Salida:Falso

System.out.println(str1.equals(str2)); //Salida:Verdadero

}

}

Cuando comparamos str1 y str2 usando el operador “==”, devuelve falso. Como sabemos, el operador “==” compara sus direcciones físicas. Aquí, en nuestro ejemplo, str1 apunta al objeto en SCP y str2 apunta al objeto en el montón. Entonces devuelve falso.
Pero en el caso de str1.equals(str2), como sabemos, la función "igual" comprueba que los caracteres individuales de str1 y str3 tengan el mismo valor almacenado y devuelve verdadero.

Caso 2: Otro literal de cadena

Cadena str3 = “MiCadena”;

Tanto str1 como str3 apuntarán al mismo literal de cadena en SCP.

cadenas de clase públicaStorageConcept

{

principal vacía estática pública (String[] args)

{

Cadena str1 = “MiCadena”;

Cadena str3 = “MiCadena”;

System.out.println(str1 == str2); //Salida:Verdadero

System.out.println(str1.equals(str2)); //Salida:Verdadero

}

}

s1 == s3 devuelve verdadero, ya que el operador “==” compara sus direcciones físicas pero no el contenido.
s1.equals(s3) devuelve verdadero y la función "igual" verifica los caracteres individuales en ambas variables de referencia.

Caso 3: se crea otro objeto de cadena usando una nueva palabra clave

Cadena str4 = nueva Cadena(“NuevaCadena”);

En este caso, JVM buscará esta cadena en SCP y no puede encontrar el objeto de cadena con el valor “NewString”, por lo que creará dos objetos uno en SCP y otro en Heap, la variable de referencia str4 se almacenará en la pila. Str4 tendrá la referencia al objeto en el montón.

Caso 4: Se crea otra cadena literal.

Cadena str5 = “NuevaCadena”;

En este caso, JVM verificará en SCP si este literal ya está disponible o no, aquí "NewString" ya está presente en SCP, por lo que JVM no creará un duplicado en SCP, sino que devolverá la referencia a la variable str5.

Caso 5: Asignar una cadena a otra cadena

Cadena str4 = nueva Cadena(“NuevaCadena”);

Cadena str6 = str4; //Asignando

Aquí str6 y str4 apuntarán al mismo objeto en Heap y no borrarán el valor en str4.

cadenas de clase públicaStorageConcept

{

principal vacía estática pública (String[] args)

{

Cadena str4 = nueva Cadena(“NuevaCadena”);

Cadena str6 = str4;

System.out.println(str4 == str6); //Salida:verdadero

}

}

JVM dará la referencia de "NewString" en el montón a la variable str6. Esa es la razón por la que str4 == str6 devuelve verdadero.

En conclusión, crear objetos de cadena usando un literal de cadena y mediante el operador 'nuevo' tiene sus ventajas y desventajas.

Al usar cadenas literales, podemos hacer que la memoria sea más eficiente al no crear duplicados. JVM crea un objeto único y la cadena permanece en el SCP para siempre. La desventaja de esto es que el grupo de cadenas tiene un tamaño fijo y se llenará en algún momento.
Pero al usar una nueva palabra clave, crea dos objetos, uno en SCP y el otro en Heap. En un montón, si no necesitamos el objeto, un recolector de basura lo borrará para hacer espacio. Pero la desventaja de esto es que con un operador 'nuevo', JVM siempre tendrá que crear un nuevo objeto y es una sobrecarga para JVM.

Declaración de liberación Este artículo se reproduce en: https://dev.to/soumya_deypersevere08_/memory-allocation-of-strings-in-java-1393?1 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3