"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Alocação de memória de strings em Java

Alocação de memória de strings em Java

Publicado em 2024-11-12
Navegar:927

Memory Allocation of Strings in Java

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.

  1. String literal

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.

  1. Usando uma nova palavra-chave

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.

Declaração de lançamento Este artigo é reproduzido em: https://dev.to/soumuya_deypersevere08_/memory-alocalocation-of-strings-in-java-1393?1 Se houver alguma infração, entre em contato com [email protected] para excluí-lo.
Tutorial mais recente Mais>

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