Este artigo estuda principalmente a questão da criação de objetos na String Java, como segue.
Primeiro de tudo, precisamos entender dois conceitos: referenciando variáveis e objetos. Os objetos são geralmente criados na pilha através de novas, e a string é apenas uma variável de referência.
Todas as cordas são objetos de string. Devido à grande quantidade de uso de constantes de sequência, a fim de economizar tempo em Java, no estágio de compilação, todas as constantes de sequência serão colocadas no pool constante de string. Uma vantagem do pool constante de cordas é que a mesma corda pode ser mesclada e ocupada um espaço.
Embora o endereço de uma variável não possa ser obtido diretamente em Java, você pode usar == para determinar se as duas variáveis de referência apontam para um endereço, ou seja, um objeto.
| Memória da pilha | Memória da pilha |
|---|---|
| Tipo básico, referência de objeto (endereço de memória da heap) | Objetos e matrizes criados por novo |
| Velocidade de acesso rápido | Memória mais lenta do que a pilha |
| O tamanho dos dados deve ser determinado durante o ciclo da declaração | A memória alocada é gerenciada pelo coletor automático de lixo da máquina virtual Java. Tamanho de memória alocada dinamicamente |
| Recursos compartilhados, se houver uma string na pilha, ela será referenciada diretamente; Caso contrário, abra um novo espaço para armazenar o valor | Cada novo gera um novo objeto na memória da heap. Nenhuma reutilização existe |
pacote com.demo.test; importar java.lang.reflect.field; public class stringdemo {public static void main (string [] args) {// primeiro procure se esse objeto String existe na memória. Se existir, aponte para este objeto String; String str1 = "abc"; String str2 = "abc"; /* public string tostring () {return this; } */ String str3 = "abc" .toString (); // Não importa se esse objeto String já existe na memória, um novo objeto será criado. String str4 = new String ("ABC"); String str5 = new String ("ABC"); String str6 = str5; String str7 = "a" + "b" + "c"; String str8 = "a" + "b" + new string ("c"); // String é um objeto de string imutável, StringBuilder e StringBuffer são objetos variáveis de string (o comprimento da matriz de caracteres interno é variável), o StringBuffer é seguro, o StringBuilder não é string string threads str9 = new stringbuilder (). Append ("a"). 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); // system.out.println ("---> 7 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); // system.out.println (str8==); System.out.println (str9 == str1); // false System.out.println (str9 == str3); // false System.out.println (str9 == str4); // false system.out.println (str9 == str7); // system.out.println (str9 === = str8); System.out.println (str10 == str1); // false system.out.println (str10 == str3); // false system.out.println (str10 == str4); // false system.out.println (str10 == str7); // system.out.println (str10 ===) (str10 == str7); // system.out.println (str10 ===); System.out.println (str10 == str9); // false System.out.println ("--------> iguais"); System.out.println (str1.equals (str4)); // true system.out.println (str1.equals (str7)); // true system.out.println (str1.equals (str8)); // true system.out.println ("----> hashcode"); /*Fórmula de cálculo do código HashCode: s [0]*31^(n-1) + s [1]*31^(n-2) + ... + s [n-1] Portanto, o código de hash é o mesmo e é o mesmo sempre que executa*/system.out.println (str1.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 mudança normal"); // string é uma classe imutável. String apenas aponta para uma referência na memória da heap. Ele armazena o endereço do objeto na pilha, não o próprio objeto. Atribuir um valor a uma string é apenas alterar seu objeto de referência em vez do próprio objeto str6 = "123"; System.out.println (str5); // abc System.out.println (str6); // 123 system.out.println ("--------> refletir valor de mudança"); /* Se você precisar alterar o valor da string, não é impossível. Somente a reflexão pode ser usada. Classe final public Final String implementa Java.io.Serializable, comparável <string>, Charsequence {// O valor é usado para armazenamento de caracteres. Valor de char final privado []; …} */ Str6 = str5; tente {field field = string.class.getDecLaredfield ("value"); // campo de campo = str6.getclass (). getDecaredfield ("value"); if (! field.isaccessible ()) {field.setAccessible (true); } char [] value = (char []) field.get (str6); valor [0] = '0'; System.out.println (str5); // 0bc System.out.println (str6); // 0bc} catch (nosuchfieldException | Segurança de Segurança | ilegalArgumentException | ilegalAccescessception e) {e.printStackTrace (); } System.out.println ("-------> obj.toString ()"); Objeto obj = new Object (); /* public string tostring () {return getClass (). getName () + "@" + inteiro.tohexstring (hashcode ()); } */System.out.println (obj.tostring ()); // java.lang.object@15db9742 string [] arr1 = {"0"}; String [] arr2 = {"0"}; System.out.println (arr1.equals (arr2)); // false}}Resumir
O exposto acima é tudo sobre a análise das instâncias de objeto de criação de cordas Java, e espero que seja útil para todos. Amigos interessados podem continuar se referindo a outros tópicos relacionados neste site. Se houver alguma falha, deixe uma mensagem para apontá -la. Obrigado amigos pelo seu apoio para este site!