Duas maneiras de criar String
1. Criação constante:
String str1 = "abcd";
Quando criamos uma constante de string, a JVM primeiro verifica o pool de constantes de string.Se a string já existir no pool de constantes, ela retornará diretamente a referência de instância no pool de constantes. Se a string não existir no pool constante, a string será instanciada e colocada no pool constante. Devido à imutabilidade das strings String, podemos ter certeza de que não deve haver duas strings idênticas no pool constante.
A linha de código acima pode ser entendida como: verifique o pool de constantes de string ali "abcd"
, o pool de constantes de string se não, crie um e, em seguida, str1
aponte para o pool de constantes de string do objeto. Se for assim, vá direto ao str1
ponto "abcd"
;
2. Criação de objeto:
String str2 = new String("abcd");//堆中创建一个新的对象
String str3 = new String("abcd");//堆中创建一个新的对象
Esta forma de criação é igual à forma de criação de um objeto.O objeto criado é armazenado na pilha e aponta para a pilha. Portanto, str2
e str3
endereço de memória na pilha, o ponto de pilha “abcd”
, e os str1
endereços de memória aponta para um conjunto de cadeia constante.
Esses dois métodos de criação diferentes são diferentes:
- A primeira maneira é obter objetos no pool constante;
- A segunda maneira é criar um novo objeto diretamente no espaço de memória heap.
System.out.println(str1==str2);//false
System.out.println(str2==str3);//false
Lembre-se de uma coisa: contanto que você o use new
, você precisa criar um novo objeto.
Outra imagem deve ser mais fácil de classificar (fonte da imagem: https://www.journaldev.com/797/what-is-java-string-pool )
Conjunto de constantes de string
O pool constante do tipo String é especial. Existem duas maneiras principais de usá-lo:
- Objetos de string declarados diretamente com aspas duplas serão armazenados diretamente no pool de constantes.
- Objeto String, se não for declarado entre aspas duplas, String pode ser usado para fornecer o
intern
método.
Suplemento: String.intern ()
String.intern()
É um método nativo. Sua função é:
- Se o pool de constantes de tempo de execução já contém uma string igual ao conteúdo deste objeto String, uma referência à string no pool de constantes será retornada;
- Caso contrário, o método de processamento antes de JDK1.7 (não incluindo 1.7) é criar uma string com o mesmo conteúdo que esta String no pool constante e retornar uma referência à string criada no pool constante. O método de processamento para JDK1.7 e posterior é registrar a referência desta string no pool de constantes e retornar a referência.
String s1 = new String("计算机");
String s2 = s1.intern();
String s3 = "计算机";
System.out.println(s2);//计算机
System.out.println(s1 == s2);//false,因为一个是堆内存中的 String 对象一个是常量池中的 String 对象,
System.out.println(s3 == s2);//true,因为两个都是常量池中的 String 对象
Adicione um pequeno ponto de conhecimento: a emenda de cordas:
String str1 = "str";
String str2 = "ing";
String str3 = "str" + "ing";//常量池中的对象
String str4 = str1 + str2; //在堆上创建的新的对象
String str5 = "string";//常量池中的对象
System.out.println(str3 == str4);//false
System.out.println(str3 == str5);//true
System.out.println(str4 == str5);//false
Tente evitar a concatenação de várias strings, pois isso recriará o objeto. Se você precisar alterar a string, pode usar StringBuilder ou StringBuffer.
ps: se você quiser aprender sobre 8 tipos básicos de classes de empacotamento e pools constantes, pode consultar outro blog meu:
https://blog.csdn.net/weixin_43901865/article/details/112566955