El montón y la pila son conceptos muy importantes en la estructura de datos de Java. Este artículo analiza la diferencia entre los dos con más detalle. Para su referencia. Los detalles son los siguientes:
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 libere explícitamente. El montón se recopila mediante recolección de basura. Responsable, la ventaja del montón es que puede asignar dinámicamente el tamaño de la memoria y no es necesario informarle al compilador la vida útil con anticipación, porque asigna memoria dinámicamente en tiempo de ejecución y el recolector de basura de Java recolectará automáticamente los que ya no se usan. datos, pero la desventaja es que debido a la necesidad de asignar memoria dinámicamente en tiempo de ejecución, la velocidad de acceso es lenta.
La ventaja de la pila es que la velocidad de acceso es más rápida que la del montón, solo superada por el registro, y los datos de la pila se pueden compartir. 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. La pila almacena principalmente algunos tipos básicos de variables (int, short, long, byte, float, double, boolean, char) y identificadores de objetos.
Una característica especial muy importante de la pila es que los datos almacenados en la pila se pueden compartir. Supongamos que también definimos:
int a = 3;
int b = 3;
El compilador primero procesa int a = 3; primero crea una referencia a la variable a en la pila y luego verifica si hay un valor de 3 en la pila. Si no lo encuentra, almacena 3 y luego apunta a. 3. Luego procese int b = 3; después de crear la variable de referencia de b, debido a que ya hay un valor de 3 en la pila, b apuntará directamente a 3. De esta manera, existe una situación en la que a y b apuntan a 3 al mismo tiempo.
En este momento, si a = 4 se establece nuevamente, el compilador volverá a buscar si hay un valor 4 en la pila. Si no, almacenará 4 y señalará 4, si ya existe. apuntará directamente a esta dirección. Por lo tanto, los cambios en el valor de a no afectarán el valor de b.
Cabe señalar que este tipo de intercambio de datos es diferente del intercambio de referencias de dos objetos que apuntan a un objeto al mismo tiempo, porque en este caso la modificación de a no afectará a b, la completa el compilador, que Es beneficioso para ahorrar espacio. Si una variable de referencia de objeto modifica el estado interno del objeto, afectará a otra variable de referencia de objeto.
La cadena es un tipo de datos contenedor especial. Se puede utilizar:
Cadena cadena = nueva Cadena ("abc"); Cadena cadena = "abc";
Hay dos formas de crearlo. La primera es usar new() para crear un nuevo objeto, que se almacenará en el montón. Se crea un nuevo objeto cada vez que se llama.
El segundo método es crear primero una variable de referencia de objeto str de la clase String en la pila y luego verificar si "abc" está almacenado en la pila. De lo contrario, almacene "abc" en la pila y haga que str apunte a "abc". ". Si ya existe "abc", apunte directamente str a "abc".
Al comparar si los valores en una clase son iguales, use el método igual (); cuando pruebe si las referencias de dos clases contenedoras apuntan al mismo objeto, use ==. El siguiente ejemplo ilustra 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"); System.out.println(str1==str2);
Usar new es generar diferentes objetos. Genera uno a la vez.
Por lo tanto, si utiliza el primer método para crear varias cadenas "abc", en realidad solo hay un objeto en la memoria. Esta forma de escribir es beneficiosa para ahorrar espacio en la memoria y puede mejorar la velocidad de ejecución. programa hasta cierto punto, porque la JVM determinará 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! En lugar de eso, 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 una variable String necesita cambiar su valor con frecuencia, debería considerar usar la clase StringBuffer para mejorar la eficiencia del programa.
Espero que lo que describe este artículo sea útil para que todos aprendan sobre programación Java.