La piscina constante de Java generalmente se divide en dos tipos: piscina constante estática y grupo de tiempo constante
Grupo constante estático: un grupo constante en el archivo de clase. El grupo constante en el archivo de clase incluye valores literales de cadena (número), información de clase y método, que ocupa la mayor parte del espacio en el archivo de clase.
Grupo constante de tiempo de ejecución: después de que el JVM completa la carga de la clase, carga el grupo constante en el archivo de clase en la memoria y lo guarda en el área de método. De lo que normalmente hablamos es el grupo constante de la piscina constante de tiempo de ejecución en el área del método. Otra característica importante de su grupo constante en comparación con el archivo de clase es su dinámica. El lenguaje Java no requiere que se generen constantes solo durante el período de compilación, es decir, el contenido del grupo constante en el archivo de clase puede ingresar el grupo de tiempo de ejecución del área de método. Durante la carrera, también se pueden colocar nuevas constantes en la piscina. Esta característica es utilizada más comúnmente por los desarrolladores. El método interno () de la clase de cadena.
Contador del programa: es una tubería para la ejecución del programa, que indica qué comando ejecutar a continuación.
Pila de métodos locales: la pila utilizada por JVM para llamar a los métodos del sistema operativo.
Pila de máquina virtual: la pila utilizada por JVM para ejecutar el código Java
Machete virtual: donde se almacenan los objetos y todos los objetos que son nuevos en los programas Java se almacenan en el montón.
Área de método: almacenar constantes, información de clase y variables estáticas, que pueden entenderse como la ubicación donde el archivo de clase se almacena en la memoria.
Beneficios de la agrupación constante:
Se utilizan grupos constantes para evitar la creación y destrucción frecuentes de objetos que afectan el rendimiento del sistema, y se dan cuenta del intercambio de objetos.
Por ejemplo, se usa una piscina constante de cadena para colocar todos los literales de cadena en una piscina constante durante la etapa de compilación.
1. Guardar espacio de memoria: todas las constantes de cadena con el mismo valor literal en el grupo constante se fusionan, ocupando solo un espacio
2. Guarde el tiempo de ejecución: al realizar comparaciones de cadenas, == es más rápido que igual (). Para dos variables de referencia, simplemente use == para determinar si las referencias son iguales, por lo que puede determinar si los valores reales son iguales.
== Los significados de los tipos de datos básicos y las representaciones de objetos son diferentes.
Para el tipo de datos básicos: == La comparación es el valor del tipo de datos básicos para el objeto: == La comparación es la dirección de memoria del objeto en la memoria
8 Tipos básicos de datos clases de envoltura y grupos constantes
La mayoría de las clases de envoltura de tipos de datos básicos en Java implementan tecnologías de agrupación constantes, a saber, byte, corto, entero, largo, carácter y booleano.
Entero i1 = 40; entero i2 = 40; System.out.println (i1 == i2); // Verdadero
Byte, Short, Integer, Long, Carácter, estas cinco clases de envoltura crean datos de caché del tipo correspondiente de [-128, 127] de forma predeterminada y los almacenan en el grupo constante. Si excede este rango, aún se creará un nuevo objeto.
public static entero valor de (int i) {afirmar integercache.high> = 127; if (i> = integerCache.low && i <= integerCache.high) return integerCache.cache [i + (-intgerCache.low)]; devolver nuevo entero (i); }Entero i1 = 400; entero i2 = 400; System.out.println (i1 == i2); // falso
2. Los dos tipos de clases de envasado de número de punto flotante flotan y el doble no implementan tecnología de agrupación constante.
Doble d1 = 2.5; doble d2 = 2.5; System.out.println (d1 == d2); // falso
3. Escenarios para aplicar piscinas constantes
(1) .integeri1 = 40; Debido a que entero es una clase de envoltorio del tipo de datos básico int y es un objeto, Java realizará operaciones de boxeo automáticas al compilar y encapsulará directamente el código en integeri1 = integer.valueof (40), utilizando así objetos en el grupo constante
(2) .integeri1 = newInteger (40); En este caso, se creará un nuevo objeto
Entero i1 = 40; entero i2 = nuevo entero (40); System.out.println (i1 == i2); // falso
En este caso, el nuevo entero no realizará las constantes existentes de referencia de boxeo automático en el grupo constante, pero generará directamente un nuevo objeto en el montón.
4. Detalles enteros
Entero i1 = 40; Entero i2 = 40; Entero i3 = 0; Entero i4 = nuevo entero (40); Entero i5 = nuevo entero (40); Entero i6 = nuevo entero (0); Entero i7 = 128; Entero i8 = 128; System.out.println ("i1 = i2" + (i1 == i2)); System.out.println ("i1 = i2 + i3" + (i1 == i2 + i3)); System.out.println ("i1 = i4" + (i1 == i4)); System.out.println ("i4 = i5" + (i4 == i5)); System.out.println ("i4 = i5 + i6" + (i4 == i5 + i6)); System.out.println ("40 = i5 + i6" + (40 == i5 + i6)); System.out.println ("i7 = i8" + (i7 == i8));i1 = i2 trueI1 = i2+i3 trueI1 = i4 falsei4 = i5 falsei4 = i5+i6 true40 = i5+i6 trueI7 = i8 falso
Explicación: La declaración i4 == i5 + i6, porque el operador + no es aplicable a los objetos enteros. Primero, i5 e i6 realizan operaciones de unboxing automáticas y agregan valores, es decir, i4 == 40. Entonces el objeto entero no se puede comparar directamente con el valor numérico, por lo que i4 se une automáticamente y lo convierte en valor int -valor 40. Finalmente, esta declaración se convierte en 40 == 40 para la comparación numérica.
Clase de cadena y piscina constante
1. cómo crear un objeto de cadena
String S1 = "ABDCD"; String S2 = new String ("ABCD"); System.out.println (S1 == S2); // FalsoHay diferencias en los métodos de creación de estas dos formas diferentes. El primero es tomar objetos en la piscina constante, y el segundo es crear nuevos objetos en el espacio de memoria del montón.
Solo use nuevos objetos se creará en el montón.
2. Expresión de conconección+
(1). Solo se agregarán nuevos objetos generados por "+" entre los objetos de cadena creados usando "" que contiene texto al grupo constante de cadena.
(2). Para otras formas, como dos referencias de objetos, que están directamente conectadas a través de "+" u objetos creados a través de un nuevo modo, los nuevos objetos resultantes no se agregarán al grupo constante de cadena.
Cadena str1 = "str"; string str2 = "ing"; Cadena str3 = "str" + "ing"; string str4 = str1 + str2; system.out.println (str3 == str4); // false cadena str5 = "string"; system.out.println (str3 == str5); // true
Cadena final estática pública A = "AB"; // Cadena final de APublic STATIC APublic B = "CD"; // constante bpublic static void main (string [] args) {string s = a + b; // Inicializar S con + Cadena de concatenación T = "ABCD"; if (s == t) {system.out.println ("s es igual a t, son el mismo objeto"); } else {System.out.println ("S no es igual a T, no son el mismo objeto"); }} S es igual a t, son el mismo objetoA y B son ambas constantes, y los valores son fijos, por lo que el valor de S también se fija, lo que se determina cuando se compila la clase. En otras palabras: cadena S = a+b; equivalente a: cadena S = "AB"+"CD";
Cadena final estática pública A; // Cadena final estática APublic constante B; // constante bstatic {a = "ab"; B = "CD"; } public static void main (string [] args) {// Inicializar S con + Cadena de concatenación S = A + B; Cadena t = "abcd"; if (s == t) {system.out.println ("s es igual a t, son el mismo objeto"); } else {System.out.println ("S no es igual a T, no son el mismo objeto"); }} s no es igual a t, no son el mismo objetoAunque A y B se definen como constantes, ninguna de ellas se asigna de inmediato. Antes de calcular el valor de S, cuando se asignan y qué valor se asignan son variables. Por lo tanto, antes de asignarse A y B, sus propiedades son similares a una variable. Entonces S no se puede determinar durante el período de compilación, pero solo se puede crear en tiempo de ejecución.
3.strings1 = Newstring ("xyz"); ¿Cuántos objetos se han creado?
Considere la fase de carga de clase y la ejecución real.
(1) La carga de clase solo se realizará una vez en una clase. "XYZ" se crea y se reside cuando la clase se carga (si la cadena "XYZ" se ha residido antes de cargar la clase, no es necesario crear repetidamente la instancia "XYZ" para residirse). La cadena residida se coloca en una piscina constante de cadena compartida a nivel mundial.
(2) Cuando este código se ejecuta posteriormente, la instancia de cadena correspondiente al literal "XYZ" se fija y no se creará repetidamente. Entonces, este código copia una copia del objeto en el grupo constante y lo coloca en el montón, y entrega la referencia al objeto en el montón a S1 para sostener.
Esta declaración crea 2 objetos.
4.java.lang.string.intern ()
Otra característica importante del grupo constante de tiempo de ejecución en comparación con el grupo de constantes de archivo de clase es su dinámica. El lenguaje Java no requiere que se generen constantes solo durante el período de compilación, es decir, el contenido del grupo constante en el archivo de clase puede ingresar al área de método. También se pueden colocar nuevas constantes en la piscina durante el tiempo de ejecución. Esta característica es utilizada más comúnmente por los desarrolladores. El método interno () de la clase de cadena.
El método de string internal () descubrirá si hay una cadena de igual igual en el grupo constante. Si lo hay, devolverá una referencia a la cadena. Si no hay, agregará su propia cadena a la piscina constante.
public static void main (string [] args) {string s1 = new String ("computadora"); Cadena s2 = s1.intern (); Cadena s3 = "computadora"; System.out.println ("S1 == S2?" + (S1 == S2)); System.out.println ("S3 == S2?" + (S3 == S2));}S1 == S2? falses3 == S2? verdadero
Resumir
Lo anterior se trata de explorar las piscinas constantes de Java en profundidad. Espero que sea útil para todos. Los amigos interesados pueden continuar referiéndose a otros temas relacionados en este sitio. Si hay alguna deficiencia, deje un mensaje para señalarlo.