| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/09/2009 23:55:38
|
m4rkk
JavaBaby
Membro desde: 07/11/2008 08:16:29
Mensagens: 88
Offline
|
schuelter wrote:para ajudar na explicação. String é um tipo de dado IMUTÁVEL. ou seja, ele NUNCA muda. Para vc concatenar uma String a VM tem que criar uma segunda String para criar uma terceira(o resultado). Vamos ver um código para vc entender melhor
Usar StringBuffer é beeem mais rápido para concatenar grandes quantidades de String. faça um teste. coloque um for de 1milhão concatenando String com += e depois faça o mesmo usando StringBuffer
Mesmo assim:
nesse Exemplo com String seriam criados 3 Objetos String.
E no StringBuffer tambêm...
O proprio Objeto String Buffer, e os Dois argumentos que são Objetos String tambêm... ("Java") e ("Free")
Qual é a explicação para isso ?
|
Developer |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/09/2009 10:27:08
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
A pergunta é... por que não justifica? A classe é idêntica, o código será idêntico e mais rápido. Além disso, são raríssimas as vezes que você vai precisar da sincronização do string buffer.
Na verdade, é justamente ao contrário. São poucas situações que justificam a criação de um StringBuffer.
Outra coisa, a diferença foi tão pequena porque você está rodando com uma única thread. A VM é esperta o suficiente para saber disso e eliminar boa parte do overhead de código envolvido na sincronização nesse caso, já que ela sabe que não haverá concorrência.
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/09/2009 10:29:38
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
m4rkk wrote:Mesmo assim: nesse Exemplo com String seriam criados 3 Objetos String. E no StringBuffer tambêm... O proprio Objeto String Buffer, e os Dois argumentos que são Objetos String tambêm... ("Java") e ("Free") Qual é a explicação para isso ?
A diferença é que o custo de criação das strings literais é ínfimo, enquanto o custo de criação das strings em tempo de execução é alto. Strings literais podem ser criadas e cacheadas em tempo de compilação. Além do mais, a maior parte das situações em que faremos concatenações assim é de valores já alocados em memória, ou lidos de alguma fonte. Aí formataremos uma nova String. Por isso o exemplo também não reflete uma situação real. Mas claro, para um caso tão minusculo como o do exemplo, você dificilmente veria alguma diferença significativa de performance. Agora, ponha concatenações num loop, e você observa rapidinho.
This message was edited 1 time. Last update was at 19/09/2009 10:30:45
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/09/2009 16:02:25
|
pedroroxd
GUJ Master
![[Avatar]](/images/avatar/dd9206848200f155f3af5e05d724d75d.png)
Membro desde: 26/08/2009 14:56:11
Mensagens: 1615
Localização: Santa Rita do Sapucaí - O vale da Eletrônica
Offline
|
É issso aeeee!
|
Ei... você está usando DefaultTableModel no seu projeto?? Não faça isso! Veja Isso!
"Quem quer fazer, arranja um jeito. Quem não quer, uma desculpa."
'The dictionary is the only place that success comes before work!"
"Não diga à Deus que você tem um grande problema, diga ao problema que você tem um grande Deus."
"If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple.
But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas."
"O Brasil é um país geométrico. Tem problemas angulares, discutidos em mesas redondas, por um monte de bestas quadradas."
"Olho por olho, e o mundo acabará cego."
"Se falam pelas costas, é sinal que eu to na frente" |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/10/2011 09:29:00
|
marcio_yakuza
Smalltalk
Membro desde: 26/10/2011 09:17:06
Mensagens: 1
Localização: São Paulo - SP
Offline
|
Boa tarde galera,
Primeiramente eu queria parabenizá-los, pois este tópico está show de bola!!
Deu para entender direitinho o comportamento, os exemplos estão bem claros!
Tenho uma dúvida e gostaria de saber também a opinião de vocês.
No meu caso, em um programa que tenho que mexer, tem uma String que é concatenada umas 4 vezes, à grosso modo, é algo mais ou menos assim (bem a grosso modo, porque é bem pior que isso):
Criei um StringBuffer (no meu caso estou usando Buffer, pois este programa é executado N vezes em paralelo) e coloquei estas informações com o método append.
Até aí tudo bem, mas em determinados momentos, eu preciso repassar o StringBuffer criado como parâmetro em alguns método, e acabo jogando um .toString() nele.
Neste caso, voltei a criar uma String na memória (além do StringBuffer já criado), com as mesmas características que vocês já falaram aqui (imutável, etc.)?
Alguém tem alguma sugestão ou comentário? No caso, eu repasso esse StringBuffer mais de uma vez, então passo a ter 2 Strings (com o mesmo valor) em memória?
Obs: os métodos são de JARs próprios da ferramenta que utilizo para programar, não há possibilidade de modificá-los...
Obrigado a todos, abs!!
|
|
|
 |
|
|
|
|