Red de conocimiento informático - Aprendizaje de programación - La diferencia entre el montón y la pila de Java

La diferencia entre el montón y la pila de Java

El montón de Java es un área de datos en tiempo de ejecución desde la cual los objetos de clase asignan espacio. Estos objetos se crean mediante instrucciones como new, newaray, anewarray y multianewarray, y no requieren que el código del programa se publique explícitamente. El montón es responsable de la recolección de basura. La ventaja del montón es que puede asignar dinámicamente el tamaño de la memoria y no es necesario informar al compilador de la vida útil con anticipación, porque asigna memoria dinámicamente en tiempo de ejecución y el recolector de basura de Java lo hará automáticamente. recopile estos datos que ya no se utilizan, pero la desventaja es que debido a la asignación dinámica de memoria en tiempo de ejecución, la velocidad de acceso es más lenta.

La ventaja de la pila es que la velocidad de acceso es más rápida. Los datos de la pila se pueden compartir después del montón, pero la desventaja es que se debe determinar el tamaño y la vida útil de los datos almacenados en la pila, y hay una falta de flexibilidad. tipos básicos de variables (int, short, long, byte, float), double, boolean, char) y identificadores de objetos.

La pila tiene una característica especial muy importante, es decir, los datos almacenados en. la pila se puede compartir:

int a = 3;

int b = 3

El compilador primero procesa int a = 3; una referencia a la variable a en la pila, y luego busque Si hay un valor de 3 en la pila, si no lo encuentra, almacene 3 y luego apunte a 3. Luego procese int b = 3 después de crear la referencia; variable de b, debido a que ya hay un valor de 3 en la pila, entonces b apunta directamente a 3. De esta manera, a y b apuntan a 3 al mismo tiempo.

En este momento, si se establece a = 4, el compilador buscará nuevamente para ver si hay 4 en la pila, si no existe, almacenará 4 en ella y señalará 4, si ya existe, apunte a directamente; esta dirección. Por lo tanto, cambiar el valor de a no afectará el valor de b.

Cabe señalar que este tipo de intercambio de datos es diferente del tipo de intercambio en el que apuntan las referencias de dos objetos. a un objeto al mismo tiempo, porque en este caso la modificación de a no afectará a b, lo determina el compilador Completo, ayuda a ahorrar espacio Cuando una variable de referencia de objeto modifica el estado interno del objeto, afectará. otra variable de referencia de objeto.

String es una clase contenedora de datos especial que se puede utilizar:

String str = new String("abc"); str = "abc";

Dos formas para crear, la primera es. Si usa new() para crear un nuevo objeto, se almacenará en el montón. Se creará un nuevo objeto cada vez. se llama.

El segundo método es crear primero un objeto de la clase String en la pila. El objeto hace referencia a la variable str y luego verifica si "abc" está almacenado en la pila. , almacene "abc" en la pila y haga que str apunte a "abc". Si ya existe "abc", haga que str apunte directamente a "abc".

Al comparar si los valores en la clase son iguales, use el método igual (); cuando pruebe si las referencias de dos clases de empaquetado apuntan al mismo objeto, use ==. la teoría anterior.

Cadena str1 = "abc";

Cadena str2 = "abc";

System.out.println(str1==str2);

Se puede ver que str1 y str2 apuntan al mismo objeto.

Cadena str1 =nueva cadena ("abc");

Cadena str2 =nueva cadena ("abc"); ==str2); // false

Usar new es generar diferentes objetos. Genera uno a la vez.

Entonces, si usa el primer método para crear múltiples cadenas "abc", en realidad solo hay un objeto en la memoria. Esta forma de escribir es beneficiosa para ahorrar espacio en la memoria. Mejorar el programa hasta cierto punto. La velocidad de ejecución se debe a que la JVM decidirá automáticamente si es necesario crear un nuevo objeto en función de la situación real de los datos en la pila. Para el código de String str = new String("abc");, siempre se crean nuevos objetos en el montón, independientemente de si sus valores de cadena son iguales o si es necesario crear nuevos objetos, lo que aumenta la carga sobre el programa.

Por otro lado, tenga en cuenta: Cuando definimos una clase usando un formato como String str = "abc";, siempre asumimos que se crea el objeto str de la clase String. ¡Preocúpate por las trampas! ¡Es posible que el objeto no haya sido creado! Puede que simplemente apunte a un objeto creado previamente. Solo a través del método new() podemos asegurarnos de que se cree un nuevo objeto cada vez.

Debido a la naturaleza inmutable de la clase String, cuando la variable String necesita cambiar su valor con frecuencia, debería considerar usar la clase StringBuffer para mejorar la eficiencia del programa.