Objetos String em Java

Para trabalhar com Strings em Java temos as seguintes classes:

  • String: para trabalhar com sequências imutáveis de caracteres
  • StringBuilder: para trabalhar com sequências mutáveis de caracteres
  • StringBuffer: para trabalhar com sequências mutáveis de caracteres, com segurança em ambientes concorrentes, pois seus métodos são sincronizados
  • StringTokenizer: classe utilitária que permite a divisão de um texto em tokens

Analisando a classe String

Vamos analisar o seguinte código:

Antes de ver o que o código imprimirá, vamos ver exatamente o que aconteceu.

Linha 3: Criamos um objeto do tipo String com o valor “Blog” e o atribuímos à variável de referência string.

Linha 4: Uma variável de referência do tipo String com o nome string2 foi criada e referenciará o mesmo objeto que string referencia.

Linha 6: Aqui vem a parte interessante do negócio. Um novo objeto do tipo String e com valor ” do Serjaum” é criado e abandonado automaticamente. A JVM pegou o valor do “Blog” de string e adicionou no final o valor ” do Serjaum”, resultando em um novo objeto do tipo String com o valor “Blog do Serjaum”, que é referenciado por string.
Neste ponto temos 3 objetos do tipo String:

  • O objeto original “Blog” que é referenciado por string2
  • O objeto ” do Serjaum” que não é referenciado por nenhuma variável e foi perdido
  • O objeto novo “Blog do Serjaum” que é referenciado por string

Podemos observar que o objeto “Blog” não foi alterado. A variável de referência string que apontava o objeto original “Blog” agora aponta para o novo objeto “Blog do Serjaum”, mas o objeto Blog não foi alterado, pois Strings são imutáveis, como dito anteriormente.

Outro exemplo

Linha3: Neste exemplo temos uma variável de referência do tipo String que aponta para o objeto “Blog”.

Linha 4: A JVM pega o valor “Blog” e concatena com ” do Serjaum” que resulta em um novo objeto “Blog do Serjaum” que não possui referência e será perdido. O objeto ” do Serjaum” usado para concatenar também é perdido, pois não possui nenhuma variável que o referencie.

Linha 6: Será impresso no vídeo o objeto referenciado por string: “Blog”.

Linha 7: A JVM pega o valor “Blog” e cria um novo objeto com todos os caracteres maiúsculos “BLOG” que não possui referência e será perdido.

Linha 8: Linha 6: Será impresso no vídeo o objeto referenciado por string: “Blog”.

Neste ponto temos 4 objetos do tipo String:

  • O objeto original “Blog” que é referenciado string
  • O objeto ” do Serjaum” usado para a concatenação, que não é referenciado e foi perdido
  • O objeto ”Blog do Serjaum” que não é referenciado por nenhuma variável e foi perdido
  • O objeto “BLOG” que não é referenciado por nenhuma variável e foi perdido

O que aconteceu foi que invocamos métodos para criar novas Strings, mas em momento algum fizemos alguma variável de referência apontar para esses novos objetos:  ”Blog do Serjaum” e “BLOG”.

Modificando o exemplo anterior

E agora, o quê aconteceu?

Linha3: Neste exemplo temos uma variável de referência do tipo String que aponta para o objeto “Blog”.

Linha 5: A JVM pega o valor “Blog”, cria um novo objeto com caracteres maiúsculos “BLOG” e o atribui à variável de referência string. Como o objeto “Blog” perdeu sua referência ele será abandonado.

Memória mais eficiente

Tendo em vista que programas e Strings literais tendem a crescer, e que podem haver várias Strings literais idênticas compartilhando a mesma memória, a JVM reserva uma área denominada de String constant pool (pool constante de Strings). Sempre que uma nova literal (por exemplo: String x = "java";) é criada, o compilador verifica o pool para ver se encontra uma literal String idêntica à que foi criada. Se o compilador encontrar, nenhuma literal é criada, e a literal que já existia no pool terá uma nova referência.

É esta a razão da imutabilidade de objetos do tipo String. Imaginem o cenário:

Temos várias variáveis de referência apontando para a mesma String.

Se uma delas pudesse modificar o valor dela, as outras variáveis nem saberiam dessa modificação, ocasionando um grande problema no sistema.

Finalizando

Pra finalizar vou explicar a diferença entre os dois métodos de criação de Strings, supondo que não exista nenhum objeto “Java” no pool:

  1. String str = "Java";
  2. String str = new String("Java");
  1. A literal “Java” será criada no pool e a variável de referência str a referenciará
  2. Usando a palavra-chave new serão criados dois objetos:
  • um na memória comum tendo como referência a variável str
  • um no pool constante de Strings, para um possível reaproveitamento

Até o próximo post!


2 Comentários on “Objetos String em Java”

  1. […] sobre o mesmo tema pode ser visto no post de Sergio Fantin, objetos Strings em […]

  2. Felipe disse:

    Então é correto afirmar que os objetos strings criado pela String Literal se encontrará localizado na pilha de memória “chamado” String Literal Pool, e os objetos instanciados com o new ficará na famosa pilha de memória conhecida como Garbage Collector?


Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s