Em Java, strings são armazenadas na memória como objetos da classe String.
Quando a memória é alocada para qualquer programa Java, a JVM (Java virtual machine) divide a memória alocada em duas partes. Uma parte é Stack e a outra parte é Heap. Na memória Heap, java aloca alguma memória, especialmente para literais, essa memória é chamada de pool de constantes de String (SCP). SCP é a área predefinida dentro do Heap. O pool de strings ajuda a economizar muito espaço para Java Runtime. A classe String usa SCP para armazenar literais de string exclusivos.
Na memória Stack, variáveis ou referências de variáveis ou referências aos objetos são armazenadas.
Na memória Heap, todos os objetos alocados dinamicamente são armazenados. Para alocar memória a um objeto, usamos uma nova palavra-chave.
Existem duas maneiras de criar objetos string.
String str1 = “MinhaString”;
Sempre que criamos uma string literal, a JVM primeiro verifica se a string literal já existe no conjunto de constantes de string. Se não estiver disponível, ele criará uma nova string literal em SCP.
Na imagem acima, str1 aponta para “MyString” no SCP. A seguir estão as maneiras como os literais de string recém-criados são tratados.
String str2 = new String(“MinhaString”); //Instanciando a classe string usando uma nova palavra-chave
Quando um objeto string é criado usando uma nova palavra-chave, ele criará dois objetos. Um no SCP outro no Heap e a variável de referência é armazenada na pilha.
Já criamos o literal “MyString” usando
String str1 = “MinhaString”;
Como não podemos ter duplicatas no SCP, então a JVM não criará mais um objeto no SCP, mas retornará a referência existente para a variável str3 na pilha e criará um objeto no Heap. Str3 apontará para o objeto “MyString” no Heap, mas não no SCP.
A seguir estão os diferentes casos de como a memória é alocada para objetos string.
Caso 1: Como os objetos string definidos acima são armazenados na memória.
strings de classe públicaStorageConcept
{
public static void main(String[] args)
{
String str1 = “MinhaString”;
String str2 = new String(“MinhaString”);
System.out.println(str1 == str2); //Saída:Falso
System.out.println(str1.equals(str2)); //Saída:Verdadeiro
}
}
Quando comparamos str1 e str2 usando o operador “==”, ele retorna falso. Como sabemos, o operador “==” compara seus endereços físicos. Aqui em nosso exemplo, str1 está apontando para o objeto no SCP e str2 está apontando para o objeto no Heap. Portanto, retorna falso.
Mas no caso de str1.equals(str2), como sabemos, a função “equals” verifica se os caracteres individuais str1 e str3 têm o mesmo valor armazenado e retorna verdadeiro.
Caso 2: Outra string literal
String str3 = “MinhaString”;
Tanto str1 quanto str3 apontarão para a mesma string literal em SCP.
strings de classe públicaStorageConcept
{
public static void main(String[] args)
{
String str1 = “MinhaString”;
String str3 = “MinhaString”;
System.out.println(str1 == str2); //Saída:Verdadeiro
System.out.println(str1.equals(str2)); //Saída:Verdadeiro
}
}
s1 == s3 retorna verdadeiro, pois o operador “==” compara seus endereços físicos, mas não o conteúdo.
s1.equals(s3) retorna verdadeiro, e a função “equals” verifica os caracteres individuais em ambas as variáveis de referência.
Caso 3: Outro objeto string é criado usando uma nova palavra-chave
String str4 = new String(“NovaString”);
Neste caso, a JVM irá verificar esta string no SCP e não consegue encontrar o objeto string com o valor “NewString”, então irá criar dois objetos um no SCP e outro no Heap, a variável de referência str4 será armazenada em a pilha. Str4 terá a referência ao objeto no Heap.
Caso 4: Outra string literal é criada.
String str5 = “NovaString”;
Neste caso, a JVM irá verificar no SCP se este literal já está disponível ou não, aqui “NewString” já está presente no SCP então a JVM não irá criar uma duplicata no SCP em vez disso retornará a referência para a variável str5.
Caso 5: Atribuindo uma string a outra string
String str4 = new String(“NovaString”);
String str6 = str4; //Atribuindo
Aqui str6 e str4 apontarão para o mesmo objeto no Heap e não apagarão o valor em str4.
strings de classe públicaStorageConcept
{
public static void main(String[] args)
{
String str4 = new String(“NovaString”);
String str6 = str4;
System.out.println(str4 == str6); //Saída:verdadeiro
}
}
JVM dará a referência do “NewString” no heap para a variável str6. Essa é a razão pela qual str4 == str6 retorna verdadeiro.
Concluindo, criar objetos string usando string literal e pelo operador ‘new’ tem seus prós e contras.
Usando literais de string, podemos tornar a memória mais eficiente, não criando duplicatas. A JVM cria um objeto exclusivo e a string permanece no SCP para sempre. A desvantagem disso é que o pool de strings tem um tamanho fixo e ficará cheio em algum momento.
Mas ao usar uma nova palavra-chave ele cria dois objetos, um no SCP e outro no Heap. Em um Heap, se não precisarmos do objeto ele será apagado por um coletor de lixo para liberar espaço. Mas a desvantagem disso é que com um operador ‘novo’ a JVM sempre terá que criar um novo objeto e isso é uma sobrecarga para a JVM.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3