Este artículo estudia principalmente el tema de crear objetos en la cadena Java, de la siguiente manera.
En primer lugar, necesitamos entender dos conceptos: referencias de variables y objetos. Los objetos generalmente se crean en el montón a través de nuevo, y la cadena es solo una variable de referencia.
Todas las cadenas son objetos de cadena. Debido a la gran cantidad de uso de constantes de cadena, para ahorrar tiempo en Java, en la etapa de compilación, todas las constantes de cadena se colocarán en la piscina constante de cadena. Una ventaja de la piscina constante de cadena es que la misma cadena se puede fusionar y ocupar un espacio.
Aunque la dirección de una variable no se puede obtener directamente en Java, puede usar == para determinar si las dos variables de referencia apuntan a una dirección, es decir, un objeto.
| Memoria de acumulación | Memoria de montón |
|---|---|
| Tipo básico, referencia de objeto (dirección de memoria del montón) | Objetos y matrices creados por nuevos |
| Velocidad de acceso rápido | Memoria más lenta que la pila |
| El tamaño de los datos debe determinarse durante el ciclo de declaración | La memoria asignada es administrada por el recolector de basura automática de la máquina virtual Java. Tamaño de memoria asignado dinámicamente |
| Características compartidas, si hay una cadena en la pila, se referenciará directamente; Si no, abra un nuevo espacio para almacenar el valor | Cada nuevo genera un nuevo objeto en la memoria de montón. No existe reutilización |
paquete com.demo.test; import java.lang.reflect.field; public class StringDemo {public static void main (string [] args) {// Primero busque si este objeto de cadena existe en la memoria. Si existe, apunte a este objeto de cadena; Cadena str1 = "ABC"; Cadena str2 = "ABC"; /* public String toString () {return esto; } */ String str3 = "ABC" .ToString (); // No importa si este objeto de cadena ya existe en la memoria, se creará un nuevo objeto. Cadena str4 = nueva cadena ("ABC"); Cadena str5 = nueva cadena ("ABC"); Cadena str6 = str5; Cadena str7 = "A" + "B" + "C"; Cadena str8 = "A" + "B" + nueva cadena ("C"); // String es un objeto de cadena inmutable, StringBuilder y StringBuffer son objetos de cadena variable (la longitud de la matriz de caracteres dentro es variable), StringBuffer es Thread-Safe, StringBuilder no es TRADE-SAFE Str9 = new StringBuilder (). Append ("A"). Append ("B"). APPEND ("C"). TOSTRING (); String str10 = new StringBuffer (). Append ("A"). Append ("B"). Append ("C"). ToString (); System.out.println ("---------> =="); System.out.println ("---> 1"); System.out.println (str1 == str2); // true system.out.println ("---> 3"); System.out.println (str3 == str1); // true system.out.println ("-> 4"); System.out.println (str4 == str1); // false system.out.println (str4 == str3); // false system.out.println (str4 == str5); // false system.out.println (str4 == str6); // falso sistema.out.println ("---> 7"); System.out.println (str7 == str1); // true system.out.println (str7 == str3); // true system.out.println (str7 == str4); // false system.out.println ("---> 8"); System.out.println(str8==str1);//false System.out.println(str8==str3);//false System.out.println(str8==str4);//false System.out.println(str8==str7);//false System.out.println(str8==str7);//false System.out.println("---> 9"); System.out.println (str9 == str1); // false system.out.println (str9 == str3); // false system.out.println (str9 == str4); // false system.out.println (str9 == str7); // falso system.println (str9 == Str8);/false System.out.Println ("--10"); System.out.println (str10 == str1); // false system.out.println (str10 == str3); // false system.out.println (str10 == str4); // false system.out.println (str10 == str7); // falso sistema.out.println (str10 == Str8); // System.out.println (str10 == str9); // false system.out.println ("--------> iguales"); System.out.println (STR1.Equals (STR4)); // true System.out.println (str1.equals (str7)); // true System.out.println (Str1.equals (Str8)); // true System.Println ("--------> Hashcode"); /*Fórmula de cálculo de hashcode: S [0]*31^(N-1) + S [1]*31^(N-2) + ... + S [N-1] Por lo tanto, hashcode es el mismo, y es el mismo cada vez que se ejecuta*/system.out.println (str1.hashcode ()); // 96354 System.out.println (str2.hashcode ());) System.out.println (str3.hashcode ()); System.out.println (str4.hashcode ()); System.out.println (str5.hashcode ()); System.out.println (str6.hashcode ()); System.out.println (str7.hashcode ()); System.out.println ("--------> valor de cambio normal"); // La cadena es una clase inmutable. La cadena solo apunta a una referencia en la memoria del montón. Almacena la dirección del objeto en el montón, no el objeto en sí. Asignar un valor a una cadena es solo para cambiar su objeto de referencia en lugar del objeto en sí str6 = "123"; System.out.println (str5); // ABC System.out.println (str6); // 123 System.out.println ("-------->> reflejar el valor de cambio"); /* Si tiene que cambiar el valor de la cadena, no es imposible. Solo se puede usar la reflexión. La cadena de clase Public Final implementa java.io.Serializable, comparable <String>, CharSequence {// El valor se usa para el almacenamiento de caracteres. Valor de char final privado []; …} */ Str6 = str5; intente {campo campo = string.class.getDeclaredField ("valor"); // campo campo = str6.getclass (). getDeclaredField ("valor"); if (! Field.IsAccessible ()) {Field.SetAccessible (true); } char [] valor = (char []) campo.get (str6); valor [0] = '0'; System.out.println (str5); // 0bc System.out.println (str6); // 0bc} Catch (nosuchfieldException | SecurityException | ilegalargumentException | ilegalAccessException e) {e.printstacktrace (); } System.out.println ("-------> obj.ToString ()"); Objeco obj = nuevo objeto (); /* public String toString () {return getClass (). getName () + "@" + integer.toHexString (hashcode ()); } */System.out.println (obj.ToString ()); // java.lang.object@15db9742 string [] arr1 = {"0"}; Cadena [] arr2 = {"0"}; System.out.println (arr1.equals (arr2)); // falso}}Resumir
Lo anterior trata sobre el análisis de las instancias de objeto de creación de cadenas de Java, y 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. ¡Gracias amigos por su apoyo para este sitio!