Duvida String x StringBuilder

11 respostas
R

:-o[color=darkblue][/color]

Pessoal,

Tenho uma classe que lê um arquivo texto e fornece um resumo dos dados lidos. Nessa minha classe, uso um objeto do tipo String para receber a linha lida e na sequencia uso o metodo split para atribuir os valores de cada campo (esse arquivo é delimitado por “,”).

Bom, minha duvida é a seguinte, como String é um objeto imutável e o java criar várias instâncias em memória, e meu arquivo normalmente tem muitas linhas. Seria correto eu alterar essa minha classe para trabalhar com StringBuilder? Se sim, como eu faria o split de cada linha, já o StringBuilder não possui esse método??

[]s a todos,

11 Respostas

Djonatah

Seria correto?

Seria.

Como fazer? Boa pergunta, eu olhei a documentacao da SUN, e pelos dados de lah voce mesmo pode fazer o split no braco, mas ach oque deve haver algo melhor, e epronto.
Abracos.

jolivier

O conceito de imutabilidade e muito relevante precisa conhecer bem oque defini um objeto imutavel colaca seu codigo para analise, provavelmente da forma que vc esta falando não havera problemas de imutabilidade
repito, precisa atentar bem com esse conceito.

B

Se você não for carregar o arquivo inteiro em memória, não será um problema usa somente Strings.

Leia uma linha, faça as operações que quiser nela, depois descarte a linha e os objetos criados, leia a próxima linha e repita até o fim. O descarte é automático casos eles sejam criados dentro de um escopo já passado.

F

Eu acredito que o GarbageCollector vai tratar disso, me corrijam se estiver enganado…

B

Dei uma olhada na implementação da Sun do String.split()

Ele funciona usando o método String.subSequence(inicio, fim), passando os índices de começo e o fim de cada substring encontrada dentro da string sofrendo o split.

O subSequence não copia novas sequencias de caracteres, ele somente altera os índices de começo e fim da String, e as passa de volta.

Em termos simples:

As Strings retornadas pelo split na verdade são a mesma String. O consumo de memória é quase tão pequeno quanto como se fosse uma String só.

Tudo isso graça aos poderes imutáveis das Strings.

R

bom dia,

Obrigado a todos pela orientação.

[]s

H

Não entendi muito bem a sua dúvida.

Mas você poderia fazer assim:

StringBuffer buffer = new StringBuffer();

// Aqui você adiciona o seu código lido do arquivo
buffer.append("");

// Aqui você adiciona uma linha
buffer.append("")

// Se você quiser transformar em String
String arquivoFinal = buffer.toString();
A

Sei que o tópico é antigo, mas ainda pode ajudar alguém.

Respondendo a pergunta do f-schmitt
Eu acredito que o GarbageCollector vai tratar disso, me corrijam se estiver enganado…

Resposta:

Segundo o livro Use a cabeça Java: As Strings são armazenadas no reservatório de Strings, e o Garbage Collector não chega até lá, ou seja, elas não serão destruídas.

Agora eu faço uma pergunta:

Tenho um sistema Jsf que faz uma integração com um cliente através de um arquivo txt. Nesse caso os objetos Strings utilizados durante a criação do TXT ficarão ocupando a memória do servidor até que o TomCat seja finalizado?

E

apalmeira:

Tenho um sistema Jsf que faz uma integração com um cliente através de um arquivo txt. Nesse caso os objetos Strings utilizados durante a criação do TXT ficarão ocupando a memória do servidor até que o TomCat seja finalizado?

Depende de como foram criadas e usadas essas strings. Por exemplo, se você pôs essas strings em uma List ou Set e não limpou depois essa List ou Set, então elas ficarão “presas” até você liberá-las.

A

No livro tem um exemplo de um for, onde a string é alterada 10x. Com isso, serão criados 11 objetos no reservatório do Strings, e segundo o livro, o garbage collector não irá retirar esses objetos da memória.

Pelo que eu entendi, não importa se está em um método ou em um List/Set, os objetos ficarão ocupando a memória da mesma forma.

É isso mesmo?

E

apalmeira:
No livro tem um exemplo de um for, onde a string é alterada 10x. Com isso, serão criados 11 objetos no reservatório do Strings, e segundo o livro, o garbage collector não irá retirar esses objetos da memória.

Pelo que eu entendi, não importa se está em um método ou em um List/Set, os objetos ficarão ocupando a memória da mesma forma.

É isso mesmo?

Calma, o cara usou String.intern?

Só desse jeito é que você cria os objetos no tal “pool de strings” (outra forma é você definir as strings como constantes no seu programa).

Senão, elas estarão disponíveis para limpeza como os outros tipos de objetos.

E mesmo com String.intern, dependendo da situação, pode ser que algumas das strings “internadas” possam ser removidas pelo Garbage Collector.

Criado 29 de outubro de 2008
Ultima resposta 8 de jun. de 2012
Respostas 11
Participantes 8